最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

拓端tecdat|R語言KERAS深度學(xué)習(xí)CNN卷積神經(jīng)網(wǎng)絡(luò)分類識別手寫數(shù)字圖像數(shù)據(jù)(MNIST)

2021-08-07 09:50 作者:拓端tecdat  | 我要投稿

原文鏈接: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)。?

  1. str(x_train)

  2. str(y_train)

2.3 繪制圖像

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

  1. index_image = 28 ## 改變這個索引以看不同的圖像。


  2. 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ù)。

  1. #加載mnist數(shù)據(jù)的訓(xùn)練和測試數(shù)據(jù)集

  2. x_train <- train$x

  3. y_train <- train$y

  4. x_test <- test$x

  5. y_test <- test$y


  1. # 定義一些用于CNN模型的參數(shù)

  2. epochs <- 10


  3. # 輸入圖像維度

  4. 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 在維度中添加通道

  1. x_train <- array_reshape(x_train, c(nrow(x_train), img_rows, img_cols, 1))

  2. x_test <- array_reshape(x_test, c(nrow(x_test), img_rows, img_cols, 1))

  3. 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之間。

  1. x_train <- x_train / 255

  2. x_test <- x_test / 255


3.2.3 將因變量轉(zhuǎn)換為分類變量

與DNN模型一樣,因變量被轉(zhuǎn)換為分類變量。

  1. #將類向量轉(zhuǎn)換為二進(jìn)制類矩陣

  2. 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層帶有附加濾波以防止過擬合。然后將輸出扁平化,并使用兩個密集層連接到圖像的類別。

  1. #定義模型結(jié)構(gòu)

  2. conv_2d(filters = 32,size = c(3,3)) %>%

  3. max_pooling_2d(size = c(2, 2)) %>%

  4. conv_2d(filters = 64, size = c(3,3), ?'relu') %>%

  5. max_pooling(size = c(2, 2)) %>%

  6. dropout(rate = 0.25) %>%

  7. layer_flatten() %>%

summary(model)

3.3.2 ?編譯模型

與DNN模型類似,我們需要編譯所定義的CNN模型。

  1. # 編譯模型


  2. loss_categorical_crossentropy,

  3. optimizer_adadelta(),

  4. 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)練時間可以大大減少。

  1. # 訓(xùn)練模型

  2. fit(

  3. x_train, y_train,

  4. validation_split = 0.2

  5. )

plot(cnn)

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

evaluate(x_test, y_test)

3.4 模型預(yù)測

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

  1. #

  2. # 模型預(yù)測



  3. predict_classes(x_test)

3.5 檢查誤判的圖像

現(xiàn)在讓我們檢查幾張被誤判的圖像,看看是否人眼識別能比這個簡單的CNN模型做得更好。

  1. ## 錯分類圖像的數(shù)量

  2. sum(cnn_pred != testy)

  1. x[cnn_pred != test$y,]

  2. y[cnn_pred !=test$y]

  3. cnn_pred[cnn_pred !=test$y]


  1. index_image = 6 ## 改變這個索引以看到不同的圖像。

  2. 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í)


拓端tecdat|R語言KERAS深度學(xué)習(xí)CNN卷積神經(jīng)網(wǎng)絡(luò)分類識別手寫數(shù)字圖像數(shù)據(jù)(MNIST)的評論 (共 條)

分享到微博請遵守國家法律
大埔县| 扶绥县| 剑川县| 芦溪县| 枣庄市| 沈阳市| 迭部县| 大田县| 巧家县| 方正县| 祥云县| 霞浦县| 新津县| 虞城县| 婺源县| 佛山市| 青阳县| 南澳县| 上高县| 松潘县| 霞浦县| 丹巴县| 七台河市| 石狮市| 汶上县| 南汇区| 砀山县| 连江县| 咸宁市| 红桥区| 钦州市| 固镇县| 东海县| 大同县| 万州区| 河北区| 万荣县| 祁东县| 特克斯县| 南汇区| 盐津县|