拓端tecdat|R語言KERAS深度學(xué)習(xí)CNN卷積神經(jīng)網(wǎng)絡(luò)分類識別手寫數(shù)字圖像數(shù)據(jù)(MNIST)
原文鏈接:http://tecdat.cn/?p=23184?
原文出處:拓端數(shù)據(jù)部落公眾號
在本文中,我們將學(xué)習(xí)如何使用keras,用手寫數(shù)字圖像數(shù)據(jù)集(即MNIST)進(jìn)行深度學(xué)習(xí)。本文的目的是為了讓大家親身體驗(yàn)并熟悉培訓(xùn)課程中的神經(jīng)網(wǎng)絡(luò)部分。
1 軟件包的下載和安裝
在這個例子的筆記本中,需要keras R包。由于它有許多需要下載和安裝的依賴包,因此需要幾分鐘的時間才能完成。請耐心等待!?
1.1 下載 keras
我們可以通過CRAN調(diào)用install.packages("keras")來獲得。

1.2 加載keras包和所需的tensorflow后端
由于keras只是流行的深度學(xué)習(xí)框架的一個接口,我們必須安裝一個特殊的深度學(xué)習(xí)后端。默認(rèn)和推薦的后端是TensorFlow。通過調(diào)用install_keras(),它將為TensorFlow安裝所有需要的依賴項(xiàng)。下面的單元格需要一分鐘左右的時間來運(yùn)行。

??

現(xiàn)在,我們準(zhǔn)備好探索深度學(xué)習(xí)了。
2 MNIST數(shù)據(jù)集的概述
在深度學(xué)習(xí)中,比傳統(tǒng)的機(jī)器學(xué)習(xí)領(lǐng)域更成功的應(yīng)用之一是圖像識別。我們將在本教程中使用廣泛使用的MNIST手寫數(shù)字圖像數(shù)據(jù)集。關(guān)于該數(shù)據(jù)集的更多信息可以在以下網(wǎng)站找到:https://en.wikipedia.org/wiki/MNIST_database。
2.1 加載MNIST數(shù)據(jù)集
這個數(shù)據(jù)集已經(jīng)包含在keras/tensorflow的安裝中,我們可以簡單地加載數(shù)據(jù)集。加載數(shù)據(jù)集只需要不到一分鐘的時間。
dataset_mnist()

2.2 訓(xùn)練和測試數(shù)據(jù)集
MNIST數(shù)據(jù)集的數(shù)據(jù)結(jié)構(gòu)簡單明了,有兩塊。(1) 訓(xùn)練集:x(即特征):60000x28x28張量,對應(yīng)于60000張28x28像素的圖像,采用灰度表示(即每個28x28矩陣中所有的值都是0到255之間的整數(shù)),y(即因變量):一個長度為60000的向量,包含相應(yīng)的數(shù)字,整數(shù)值在0到9之間。(2) 測試集:與訓(xùn)練集相同,但只有10000個圖像和因變量。數(shù)據(jù)集的詳細(xì)結(jié)構(gòu)可以通過下面的str(mnist)看到。
str(mnist)

現(xiàn)在我們準(zhǔn)備好訓(xùn)練和測試數(shù)據(jù)集的特征(x)和因變量(y),可以用str()函數(shù)檢查x_train和y_train的結(jié)構(gòu)。?
str(x_train)
str(y_train)

2.3 繪制圖像
現(xiàn)在讓我們使用R將一個選定的28x28矩陣?yán)L制成圖像。顯示圖像的方式是從矩陣表示法中旋轉(zhuǎn)了90度。因此,還需要額外的步驟來重新排列矩陣,以便能夠使用image()函數(shù)來顯示它的實(shí)際方向。
index_image = 28 ## 改變這個索引以看不同的圖像。
output_matrix <- t(output_matrix)

這里是上述圖像的原始28x28矩陣。
input_matrix

3 卷積神經(jīng)網(wǎng)絡(luò)模型
在本節(jié)中,我們將展示如何使用卷積神經(jīng)網(wǎng)絡(luò)(CNN)對MNIST手寫數(shù)據(jù)集進(jìn)行分類,將圖像分為數(shù)字。這與之前學(xué)習(xí)的問題完全相同,但CNN是一種比一般的深度神經(jīng)網(wǎng)絡(luò)更好的圖像識別深度學(xué)習(xí)方法。CNN利用了二維圖像中相鄰像素之間的關(guān)系來獲得更好的表現(xiàn)。它還避免了為全彩的高分辨率圖像生成數(shù)千或數(shù)百萬的特征。
3.1 數(shù)據(jù)集導(dǎo)入和參數(shù)設(shè)置
現(xiàn)在讓我們再次從頭開始導(dǎo)入MNIST數(shù)據(jù)集,因?yàn)橐呀?jīng)專門為深度神經(jīng)網(wǎng)絡(luò)模型做了一些預(yù)處理。對于CNN,有不同的預(yù)處理步驟。我們還定義了一些以后要使用的參數(shù)。
#加載mnist數(shù)據(jù)的訓(xùn)練和測試數(shù)據(jù)集
x_train <- train$x
y_train <- train$y
x_test <- test$x
y_test <- test$y
# 定義一些用于CNN模型的參數(shù)
epochs <- 10
# 輸入圖像維度
img_rows <- 28
3.2 數(shù)據(jù)預(yù)處理
對于一般的CNN方法,MxN圖像的輸入是一個具有K個特定通道的MxNxK三維數(shù)組。例如,一個灰度MxN圖像只有一個通道,其輸入是MxNx1張量。一個MXN每通道8位的RGB圖像有三個通道,有3個MxN數(shù)組,數(shù)值在0和255之間,所以輸入是MxNx3張量。對于現(xiàn)在的問題,圖像是灰度的,但我們需要通過使用array_reshape()將二維數(shù)組重塑為三維張量來特別定義有一個通道。input_shape變量將在后面的CNN模型中使用。對于RGB顏色的圖像,通道的數(shù)量是3,如果輸入的圖像是RGB格式,我們需要在下面的代碼單元中用 "3 "代替 "1"。
3.2.1 在維度中添加通道
x_train <- array_reshape(x_train, c(nrow(x_train), img_rows, img_cols, 1))
x_test <- array_reshape(x_test, c(nrow(x_test), img_rows, img_cols, 1))
input_shape <- c(img_rows, img_cols, 1)
這里是重塑圖像的結(jié)構(gòu),第一維是圖像索引,第2-4維是一個三維張量,盡管只有一個通道。
str(x_train)

3.2.2 標(biāo)準(zhǔn)化
與DNN模型一樣,為了在優(yōu)化過程中同樣考慮數(shù)值的穩(wěn)定性,我們將輸入值標(biāo)準(zhǔn)化為0和1之間。
x_train <- x_train / 255
x_test <- x_test / 255
3.2.3 將因變量轉(zhuǎn)換為分類變量
與DNN模型一樣,因變量被轉(zhuǎn)換為分類變量。
#將類向量轉(zhuǎn)換為二進(jìn)制類矩陣
to_categorical(train, numclass)
3.3 構(gòu)建一個CNN模型
正如我們所討論的,CNN模型包含一系列二維卷積層,其中有幾個參數(shù)。(1)kernal_size,通常是3x3或5x5;(2)過濾器的數(shù)量,對應(yīng)于輸出張量中的通道數(shù)量(即第三維);(3)激活函數(shù)。對于第一層,還有一個input_shape參數(shù),即輸入圖像的尺寸和通道。為了防止過度擬合和加快計(jì)算速度,通常在一個或幾個二維卷積層之后應(yīng)用一個池化層。一個典型的池化層將2x2池大小的最大值作為輸出的新值,這基本上是將大小減少到一半。除了池化鄰居值之外,也可以使用Dropout。在幾個二維卷積層之后,我們還需要將三維張量輸出 "扁平化 "為一維張量,然后添加一個或幾個密集層,將二維卷積層的輸出連接到目標(biāo)因變量類別。
3.3.1 定義一個CNN模型結(jié)構(gòu)
現(xiàn)在我們定義一個CNN模型,其中有兩個帶有最大池的二維卷積層,第2層帶有附加濾波以防止過擬合。然后將輸出扁平化,并使用兩個密集層連接到圖像的類別。
#定義模型結(jié)構(gòu)
conv_2d(filters = 32,size = c(3,3)) %>%
max_pooling_2d(size = c(2, 2)) %>%
conv_2d(filters = 64, size = c(3,3), ?'relu') %>%
max_pooling(size = c(2, 2)) %>%
dropout(rate = 0.25) %>%
layer_flatten() %>%
summary(model)

3.3.2 ?編譯模型
與DNN模型類似,我們需要編譯所定義的CNN模型。
# 編譯模型
loss_categorical_crossentropy,
optimizer_adadelta(),
c('accuracy')
訓(xùn)練模型并保存每個訓(xùn)練迭代(epochs)的歷史。請注意,由于我們沒有使用GPU,它需要幾分鐘的時間來完成。如果在GPU上運(yùn)行,訓(xùn)練時間可以大大減少。
3.3.3 訓(xùn)練模型
現(xiàn)在,我們可以用我們處理過的數(shù)據(jù)來訓(xùn)練模型。每個epochs的歷史記錄都可以被保存下來以追蹤進(jìn)度。請注意,由于我們沒有使用GPU,它需要幾分鐘的時間來完成。在等待結(jié)果時,請耐心等待。如果在GPU上運(yùn)行,訓(xùn)練時間可以大大減少。
# 訓(xùn)練模型
fit(
x_train, y_train,
validation_split = 0.2
)

plot(cnn)

可以在測試數(shù)據(jù)集上評估訓(xùn)練后的模型準(zhǔn)確性,這是很好的。
evaluate(x_test, y_test)


3.4 模型預(yù)測
對于任何新的圖像,在經(jīng)過同樣的預(yù)處理后,我們可以用訓(xùn)練好的模型來預(yù)測該圖像屬于哪一個數(shù)字。
#
# 模型預(yù)測
predict_classes(x_test)

3.5 檢查誤判的圖像
現(xiàn)在讓我們檢查幾張被誤判的圖像,看看是否人眼識別能比這個簡單的CNN模型做得更好。
## 錯分類圖像的數(shù)量
sum(cnn_pred != testy)

x[cnn_pred != test$y,]
y[cnn_pred !=test$y]
cnn_pred[cnn_pred !=test$y]
index_image = 6 ## 改變這個索引以看到不同的圖像。
image(1:28, ?output_matrix
數(shù)字9被誤預(yù)測為數(shù)字8?

?

最受歡迎的見解
1.r語言用神經(jīng)網(wǎng)絡(luò)改進(jìn)nelson-siegel模型擬合收益率曲線分析
2.r語言實(shí)現(xiàn)擬合神經(jīng)網(wǎng)絡(luò)預(yù)測和結(jié)果可視化
3.python用遺傳算法-神經(jīng)網(wǎng)絡(luò)-模糊邏輯控制算法對樂透分析
4.用于nlp的python:使用keras的多標(biāo)簽文本lstm神經(jīng)網(wǎng)絡(luò)分類
5.用r語言實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)預(yù)測股票實(shí)例
6.R語言基于Keras的小數(shù)據(jù)集深度學(xué)習(xí)圖像分類
7.用于NLP的seq2seq模型實(shí)例用Keras實(shí)現(xiàn)神經(jīng)機(jī)器翻譯
8.python中基于網(wǎng)格搜索算法優(yōu)化的深度學(xué)習(xí)模型分析糖
9.matlab使用貝葉斯優(yōu)化的深度學(xué)習(xí)