林嶔 (Lin, Chin)
Lesson 6 卷積神經網路與轉移特徵學習
– 請在這裡下載MNIST的手寫數字資料,並讓我們了解一下這筆資料的結構
– 一個28×28的黑白圖片的其實可以被表示成784個介於0至255的數字,這樣我們就又能把問題轉換為單純的預測問題了。
library(data.table)
DAT = fread("data/MNIST.csv", data.table = FALSE)
DAT = data.matrix(DAT)
#Split data
set.seed(0)
Train.sample = sample(1:nrow(DAT), nrow(DAT)*0.6, replace = FALSE)
Train.X = DAT[Train.sample,-1]
Train.Y = DAT[Train.sample,1]
Test.X = DAT[-Train.sample,-1]
Test.Y = DAT[-Train.sample,1]
#Display
library(OpenImageR)
imageShow(t(matrix(as.numeric(Train.X[1,]), nrow = 28, byrow = TRUE)))
– 這個時候我們會面對到一個硬體的問題,那就是我們不可能預先把所有檔案都讀到RAM內。比較好的解決方法是每次訓練時只讀取小批量的訓練樣本,這樣就能有效降低記憶體的使用。
fwrite(x = data.table(cbind(Train.Y, Train.X)),
file = 'data/train_data.csv',
col.names = FALSE, row.names = FALSE)
fwrite(x = data.table(cbind(Test.Y, Test.X)),
file = 'data/test_data.csv',
col.names = FALSE, row.names = FALSE)
library(mxnet)
my_iterator_func <- setRefClass("Custom_Iter",
fields = c("iter", "data.csv", "data.shape", "batch.size"),
contains = "Rcpp_MXArrayDataIter",
methods = list(
initialize = function(iter, data.csv, data.shape, batch.size){
csv_iter <- mx.io.CSVIter(data.csv = data.csv, data.shape = data.shape, batch.size = batch.size)
.self$iter <- csv_iter
.self
},
value = function(){
val <- as.array(.self$iter$value()$data)
val.x <- val[-1,]
val.y <- t(model.matrix(~ -1 + factor(val[1,], levels = 0:9)))
val.y <- array(val.y, dim = c(10, ncol(val.x)))
dim(val.x) <- c(28, 28, 1, ncol(val.x))
val.x <- mx.nd.array(val.x)
val.y <- mx.nd.array(val.y)
list(data=val.x, label=val.y)
},
iter.next = function(){
.self$iter$iter.next()
},
reset = function(){
.self$iter$reset()
},
finalize=function(){
}
)
)
my_iter = my_iterator_func(iter = NULL, data.csv = 'data/train_data.csv', data.shape = 785, batch.size = 20)
## [1] TRUE
## [1] 0 0 0 0 0 0 0 0 1 0
– 但回到我們的手寫數字分類問題,當我們看到這些手寫數字時,我們一眼就能認出他們了,但從「圖片」到「概念」的過程真的這麼簡單嗎?
– 1962年時David H. Hubel與Torsten Wiesel共同發表了一篇研究:Receptive fields, binocular interaction and functional architecture in the cat’s visual cortex,這篇研究旨在探討生物視覺系統的運作方式,並獲得了1981年的Nobel prize
– 他們的研究發現,貓咪在受到不同形狀的圖像刺激時,感受野的腦部細胞會產生不同反應
– 卷積器模擬了感受野最初的細胞,他們負責用來辨認特定特徵,他們的數學模式如下:
– 「特徵圖」的意義是什麼呢?卷積器就像是最初級的視覺細胞,他們專門辨認某一種簡單特徵,那這個「特徵圖」上面數字越大的,就代表那個地方越符合該細胞所負責的特徵。
獲得特徵圖之後,還記得我們為了增加神經網路的數學複雜性,會添加一些非線性函數做轉換,因此卷積神經網路在經過卷積層後的特徵圖會再經過非線性轉換。
接著,由於連續卷積的特徵圖造成了訊息的重複,這時候我們經常會使用「池化層」(pooling layer)進行圖片降維,事實上他等同於把圖片的解析度調低,這同時也能節省計算量。
– 我們想像有一張人的圖片,假定第一個卷積器是辨認眼睛的特徵,第二個卷積器是在辨認鼻子的特徵,第三個卷積器是在辨認耳朵的特徵,第四個卷積器是在辨認手掌的特徵,第五個卷積器是在辨認手臂的特徵
– 第1.2.3張特徵圖中數值越高的地方,就分別代表眼睛、鼻子、耳朵最有可能在的位置,那將這3張特徵圖合在一起看再一次卷積,是否就能辨認出人臉的位置?
– 第4.5張特徵圖中數值越高的地方,就分別代表手掌、手臂最有可能在的位置,那將這2張特徵圖合在一起看再一次卷積,是否就能辨認出手的位置?
– 第4.5張特徵圖對人臉辨識同樣能起到作用,因為人臉不包含手掌、手臂,因此如果有個卷積器想要辨認人臉,他必須對第1.2.3張特徵圖做正向加權,而對第4.5張特徵圖做負向加權