python用TensorFlow 2二維卷積神經(jīng)網(wǎng)絡(luò)CNN對(duì)圖像物體識(shí)別混淆矩陣評(píng)估
原文鏈接:http://tecdat.cn/?p=26230?
原文出處:拓端數(shù)據(jù)部落公眾號(hào)
什么是CNN
本文演示了如何訓(xùn)練一個(gè)簡單的卷積神經(jīng)網(wǎng)絡(luò)?(CNN) 來對(duì) 圖像進(jìn)行分類。
Convolutional?Neural?Networks
?(ConvNets 或 CNNs)是一類神經(jīng)網(wǎng)絡(luò),已被證明在圖像識(shí)別和分類等領(lǐng)域非常有效。與傳統(tǒng)的多層感知器架構(gòu)不同,它使用兩個(gè)稱為?convolution
?和?pooling
?的操作將圖像簡化為其基本特征,并使用這些特征來理解和分類圖像。
CNN重要術(shù)語
卷積層
卷積是從輸入圖像中提取特征的第一層。卷積通過使用輸入數(shù)據(jù)的小方塊學(xué)習(xí)圖像特征來保留像素之間的關(guān)系。這是一個(gè)數(shù)學(xué)運(yùn)算,需要兩個(gè)輸入,例如?image matrix
?和?filter
?或?kernel
。然后圖像矩陣的卷積乘以過濾器矩陣,稱為?Feature?Map
。
使用不同濾波器對(duì)圖像進(jìn)行卷積可以通過應(yīng)用濾波器來執(zhí)行邊緣檢測、模糊和銳化等操作。
激活函數(shù)
由于卷積是線性操作,圖像遠(yuǎn)非線性,非線性層通常直接放在卷積層之后,以引入?nonlinearity
?激活圖。
有幾種類型的非線性操作,流行的是:
Sigmoid
: sigmoid 非線性具有數(shù)學(xué)形式 f(x) = 1 / 1 + exp(-x)。它取一個(gè)實(shí)數(shù)值并將其標(biāo)準(zhǔn)化到 0 到 1 之間的范圍內(nèi)。
Tanh
: Tanh 將實(shí)數(shù)值壓縮到 [-1, 1] 范圍內(nèi)。
ReLU
: 線性單元 (ReLU) 計(jì)算函數(shù) ?(κ)=max (0,κ)。
Leaky?ReL
:Leaky ReLU 函數(shù)只不過是 ReLU 函數(shù)的改進(jìn)版本。Leaky ReLU 就是為了解決這個(gè)問題而定義的。
Maxout
:Maxout 激活是 ReLU 和leaky ReLU 函數(shù)的泛化。
ELU
:Exponential?Linear?Unit
?或簡稱ELU,也是Rectiufied Linear Unit (ReLU)的一種變體。與leaky relu和parametric ReLU函數(shù)不同,ELU不是直線,而是使用對(duì)數(shù)曲線來定義負(fù)值。

過濾器 | 核大小 | 過濾器數(shù)量
卷積使用a?從輸入圖像kernel
?中提取某些 特征內(nèi)容。核是一個(gè)矩陣,它?slide
跨越圖像并與輸入相乘,從而以某種理想的方式增強(qiáng)輸出。
在我們深入研究之前,核是一個(gè)權(quán)重矩陣,它與輸入相乘以提取相關(guān)特征。核矩陣的維度是卷積的名稱。例如,在 中?2D?convolutions
,核矩陣是?2D?matrix
。
一個(gè)普通的卷積層實(shí)際上由多個(gè)這樣的過濾器組成。

步長
在輸入矩陣上移動(dòng)的像素?cái)?shù)。當(dāng)步長為 1 時(shí),我們一次將過濾器移動(dòng)到 1 個(gè)像素。當(dāng)步長為 2 時(shí),我們一次將過濾器移動(dòng)到 2 個(gè)像素,依此類推。下圖顯示卷積將以 1 的步長工作。
填充
padding
?意味著在數(shù)據(jù)的邊界處提供額外的像素。有時(shí)過濾器不能完全適合輸入圖像,那么我們將使用填充。
我們有兩個(gè)選擇:
用零填充圖片(零填充),使其適合
刪除過濾器不適合的圖像部分。這稱為有效填充,它只保留圖像的有效部分。

池化層
A?pooling layer
?是在卷積層之后添加的新層。具體來說,在對(duì)卷積層輸出的特征圖應(yīng)用非線性(例如 ReLU)之后;
當(dāng)圖像太大時(shí),池化層部分會(huì)減少參數(shù)的數(shù)量。?Spatial?pooling
?也稱為?subsampling
?或?downsampling
?減少每個(gè)地圖的維數(shù)但保留重要信息。
空間池可以有不同的類型:
最大池化
平均池化
Max?pooling
?從校正后的特征圖中取最大元素。計(jì)算特征圖上每個(gè)補(bǔ)丁的平均值稱為?average pooling
。特征圖調(diào)用中每個(gè)補(bǔ)丁的所有元素的總和為?sum pooling
.

扁平化和密集層
Flattening
?正在將數(shù)據(jù)轉(zhuǎn)換為一維數(shù)組以將其輸入到下一層。我們展平卷積層的輸出以創(chuàng)建單個(gè)長特征向量。
Fully?connected layer
?:傳統(tǒng)的多層感知器結(jié)構(gòu)。它的輸入是一個(gè)一維向量,表示前幾層的輸出。它的輸出是附在圖像上的不同可能標(biāo)簽的概率列表(例如狗、貓、鳥)。接收概率最高的標(biāo)簽是分類決策。
下載數(shù)據(jù)和模型構(gòu)建
該?數(shù)據(jù)集包含 60,000 張彩色圖像?10?classes
,每個(gè)類別有 6,000 張圖像。數(shù)據(jù)集分為 50,000 張訓(xùn)練圖像和 10,000 張測試圖像。這些類是互斥的,它們之間沒有重疊。
X_train = X_train/255
X_test = X_test/255
X_train.shape, X_test.shape



驗(yàn)證數(shù)據(jù)
為了驗(yàn)證數(shù)據(jù)集看起來是否正確,讓我們繪制測試集中的第一張圖像并顯示圖像。
plt.imshow(X_test[0])

y_test

構(gòu)建 CNN 模型
下面的 8 行代碼使用一個(gè)通用模式定義了卷積基:一堆?Conv2D
?、MaxPooling2D
? 、?Dropout
和Flatten
?層?Dense
?。
作為輸入,a?Conv2D
?采用形狀 (image_height, image_width, color_channels) 的張量。
Maxpool2D()
通過對(duì)沿特征軸的每個(gè)維度在 (2,2)Downsamples
?定義的窗口上取最大值來對(duì)輸入表示進(jìn)行??分層?。
Dropout
() 用于在訓(xùn)練階段的每次更新時(shí)將隱藏單元的出邊隨機(jī)設(shè)置為 0。
Flatten()
?用于將數(shù)據(jù)轉(zhuǎn)換為一維數(shù)組,用于輸入到下一層。
Dense()
?層是具有 128 個(gè)神經(jīng)元的常規(guī)深度連接神經(jīng)網(wǎng)絡(luò)層。輸出層也是一個(gè)密集層,有 10 個(gè)神經(jīng)元用于 10 個(gè)類。
使用的激活函數(shù)是?softmax
。Softmax 將實(shí)數(shù)向量轉(zhuǎn)換為分類概率向量。輸出向量的元素在 (0, 1) 范圍內(nèi)并且總和為 1。
model.add(Flatten())
model.add(Dense(units = 128, activation='relu'))
model.add(Dense(units=10, activation='softmax'))
model.summary()

編譯和訓(xùn)練模型
這是?compiling
?模型和?fitting
?訓(xùn)練數(shù)據(jù)。我們將使用 10?epochs
?來訓(xùn)練模型。一個(gè)時(shí)期是對(duì)所提供的整個(gè)數(shù)據(jù)的迭代。??是在每個(gè) epoch 結(jié)束時(shí)validation_data
?評(píng)估和任何模型指標(biāo)的?數(shù)據(jù)。loss
模型不會(huì)根據(jù)這些數(shù)據(jù)進(jìn)行訓(xùn)練。由于指標(biāo) =?['sparse_categorical_accuracy']
?模型將基于?accuracy
.
history = model.fit(X_train

我們現(xiàn)在將繪制?model accuracy
?and??model loss
。在模型準(zhǔn)確度中,我們將繪制訓(xùn)練準(zhǔn)確度和驗(yàn)證準(zhǔn)確度,在模型損失中,我們將繪制訓(xùn)練損失和驗(yàn)證損失。
# 繪制訓(xùn)練和驗(yàn)證的準(zhǔn)確值
epoch_range = range(1, 11)
plt.plot(epoch_range, history.history['sparse_categorical_accuracy'])
# 繪制訓(xùn)練和驗(yàn)證的損失值
plt.plot(epoch_range, history.history['loss'])


y_pred = model.predict_classes(X_test)
confusion_matrix
mat
plot


結(jié)論:
在本教程中,我們訓(xùn)練了簡單的卷積神經(jīng)網(wǎng)絡(luò) (CNN) 來對(duì) 圖像進(jìn)行分類。從學(xué)習(xí)曲線圖中我們觀察到,在 3 個(gè) epoch 之后,驗(yàn)證準(zhǔn)確度低于訓(xùn)練集準(zhǔn)確度,即我們的模型是過擬合,這意味著我們增加了模型的復(fù)雜性。還使用混淆矩陣評(píng)估模型。觀察到該模型對(duì)鳥、貓、鹿、狗等標(biāo)簽的預(yù)測精度較低。
?

最受歡迎的見解
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ò)-模糊邏輯控制算法對(duì)樂透分析
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í)