3D-CNN簡(jiǎn)介
MNIST數(shù)據(jù)集分類被認(rèn)為是計(jì)算機(jī)視覺領(lǐng)域的 hello world 程序。MNIST數(shù)據(jù)集幫助初學(xué)者理解卷積神經(jīng)網(wǎng)絡(luò)(CNN)的概念和實(shí)現(xiàn)。
許多人認(rèn)為圖像只是一個(gè)普通矩陣,但實(shí)際上并非如此。圖像擁有所謂的空間信息。考慮如下所示的 3X3 矩陣。
[a b c
d e f
g h i]
在正則矩陣中,矩陣中的值將相互獨(dú)立。相鄰值不會(huì)攜帶矩陣中特定字段的任何關(guān)系或信息。例如,在矩陣中代替“e”的值與出現(xiàn)在其他位置的值(如“a”、“b”等)沒有任何聯(lián)系。圖像中的情況并非如此。
在圖像中,矩陣中的每個(gè)位置代表圖像中的一個(gè)像素,每個(gè)位置的值代表該像素的值。像素值可以是 8 位圖像中的 [0-255]。每個(gè)像素與其相鄰像素有某種關(guān)系。任何像素的鄰域是其周圍的一組像素。對(duì)于任何像素,有 3 種方法來表示其鄰域,稱為 N-4、ND 和 N-8。讓我們?cè)敿?xì)了解它們。
N-4:它表示存在于參考像素的頂部、底部、右側(cè)和左側(cè)的像素。對(duì)于像素“e”,N-4 包含“b”、“f”、“h”和“d”。
ND:它表示從參考像素對(duì)角線可訪問的像素。對(duì)于像素“e”,ND 包含“a”、“c”、“i”和“g”。
N-8:它代表它周圍存在的所有像素。它包括 N-4 和 ND 像素。對(duì)于像素“e”,N-8 包含“a”、“b”、“c”、“d”、“f”、“g”、“h”和“i”。
N-4、N-8 和 ND 像素有助于提取有關(guān)像素的信息。例如,這些參數(shù)可用于將像素分類為邊界或內(nèi)部或外部像素。這是圖像的特殊性。人工神經(jīng)網(wǎng)絡(luò)(ANN )接收一維數(shù)組形式的輸入。圖像始終存在于具有 1 個(gè)或多個(gè)通道的 2D 陣列中。當(dāng)圖像數(shù)組轉(zhuǎn)換為一維數(shù)組時(shí),它會(huì)丟失空間信息,因此人工神經(jīng)網(wǎng)絡(luò)無法捕獲此信息并且在圖像數(shù)據(jù)集上表現(xiàn)不佳。而這就是 CNN 擅長(zhǎng)的地方。
CNN 接受 2D 數(shù)組作為輸入,并使用掩碼(或過濾器或內(nèi)核)執(zhí)行卷積操作并提取這些特征。執(zhí)行稱為池化的過程,該過程減少了提取的特征數(shù)量并降低了計(jì)算復(fù)雜度。完成這些操作后,我們將提取的特征轉(zhuǎn)換為一個(gè)1D數(shù)組,并將其提供給學(xué)習(xí)進(jìn)行分類的神經(jīng)網(wǎng)絡(luò)層。
本文旨在擴(kuò)展對(duì) 3D 數(shù)據(jù)進(jìn)行卷積操作的概念。我們將構(gòu)建一個(gè) 3D CNN,它將在 3D MNIST 數(shù)據(jù)集上執(zhí)行分類
數(shù)據(jù)集概述
我們將在數(shù)據(jù)集中使用fulldatasetvectors.h5文件。該文件具有從所有 3D 點(diǎn)云的體素化 (x:16, y:16, z:16) 獲得的 4096-D 向量。該文件包含 10000 個(gè)訓(xùn)練樣本和 2000 個(gè)測(cè)試樣本。數(shù)據(jù)集也有可以使用的點(diǎn)云數(shù)據(jù)。
導(dǎo)入模塊
由于數(shù)據(jù)以h5格式存儲(chǔ),我們將使用h5py模塊從 fulldatasetvectors 文件中的數(shù)據(jù)加載數(shù)據(jù)集。TensorFlow和Keras將用于構(gòu)建和訓(xùn)練 3D-CNN。to_categorical函數(shù)有助于對(duì) 目標(biāo)變量執(zhí)行 one-hot 編碼。我們還將使用 earlystopping 回調(diào)來停止訓(xùn)練并防止模型過度擬合。
importnumpyasnp importh5py fromtensorflow.keras.utilsimportto_categorical fromtensorflow.kerasimportlayers fromtensorflow.keras.modelsimportSequential fromtensorflow.keras.initializersimportConstant fromtensorflow.keras.optimizersimportAdam fromtensorflow.keras.callbacksimportEarlyStopping
加載數(shù)據(jù)集
如前所述,我們將使用 h5py 模塊從 fulldatasetvectors.h5 文件中加載數(shù)據(jù)。
使用 h5py.File(‘。./input/3d-mnist/full_dataset_vectors.h5’, ‘r’) 作為數(shù)據(jù)集:
xtrain,xtest=dataset[“X_train”][:],dataset[“X_test”][:] ytrain,ytest=dataset[“y_train”][:],dataset[“y_test”][:] xtrain=np.array(xtrain) xtest=np.array(xtest) print(‘trainshape:’,xtrain.shape) print(‘testshape:’,xtest.shape) xtrain=xtrain.reshape(xtrain.shape[0],16,16,16,1) xtest=xtest.reshape(xtest.shape[0],16,16,16,1) ytrain,ytest=to_categorical(ytrain,10),to_categorical(ytest,10) 我們可以看到訓(xùn)練數(shù)據(jù)有 10000 個(gè)樣本,而測(cè)試數(shù)據(jù)有 2000 個(gè)樣本,每個(gè)樣本包含 4096 個(gè)特征。
trainshape:(10000,4096) testshape:(2000,4096)
構(gòu)建 3D-CNN
3D-CNN,就像任何普通的 CNN 一樣,有兩部分——特征提取器和 ANN 分類器,并且以相同的方式執(zhí)行。
與普通 CNN 不同,3D-CNN 執(zhí)行 3D 卷積而不是 2D 卷積。我們將使用 Keras 的Sequential API 來構(gòu)建 3D CNN。前 2 層將是具有 32 個(gè)過濾器和 ReLU 作為激活函數(shù)的 3D 卷積層,然后是用于降維的最大池化層。這些層還添加了一個(gè)偏置項(xiàng),其值為 0.01。默認(rèn)情況下,偏差值設(shè)置為 0。
再次使用同一組圖層,但使用 64 個(gè)過濾器。然后是 dropout 層和 flatten 層。flatten 層有助于將特征重塑為可由人工神經(jīng)網(wǎng)絡(luò)處理的一維陣列,即密集層。ANN部分由 2 層組成,分別有 256 和 128 個(gè)神經(jīng)元,以 ReLU 作為激活函數(shù)。然后是具有 10 個(gè)神經(jīng)元的輸出層,因?yàn)閿?shù)據(jù)集中存在 10 個(gè)不同的類別或標(biāo)簽。
model=Sequential() model.add(layers.Conv3D(32,(3,3,3),activation='relu',input_shape=(16,16,16,1),bias_initializer=Constant(0.01))) model.add(layers.Conv3D(32,(3,3,3),activation='relu',bias_initializer=Constant(0.01))) model.add(layers.MaxPooling3D((2,2,2))) model.add(layers.Conv3D(64,(3,3,3),activation='relu')) model.add(layers.Conv3D(64,(2,2,2),activation='relu')) model.add(layers.MaxPooling3D((2,2,2))) model.add(layers.Dropout(0.6)) model.add(layers.Flatten()) model.add(layers.Dense(256,'relu')) model.add(layers.Dropout(0.7)) model.add(layers.Dense(128,'relu')) model.add(layers.Dropout(0.5)) model.add(layers.Dense(10,'softmax')) model.summary() 這是 3D-CNN 的架構(gòu)。
Model:"sequential_2" _________________________________________________________________ Layer(type)OutputShapeParam# ================================================================= conv3d_5(Conv3D)(None,14,14,14,32)896 _________________________________________________________________ conv3d_6(Conv3D)(None,12,12,12,32)27680 _________________________________________________________________ max_pooling3d_2(MaxPooling3(None,6,6,6,32)0 _________________________________________________________________ conv3d_7(Conv3D)(None,4,4,4,64)55360 _________________________________________________________________ conv3d_8(Conv3D)(None,3,3,3,64)32832 _________________________________________________________________ max_pooling3d_3(MaxPooling3(None,1,1,1,64)0 _________________________________________________________________ dropout_4(Dropout)(None,1,1,1,64)0 _________________________________________________________________ flatten_1(Flatten)(None,64)0 _________________________________________________________________ dense_3(Dense)(None,256)16640 _________________________________________________________________ dropout_5(Dropout)(None,256)0 _________________________________________________________________ dense_4(Dense)(None,128)32896 _________________________________________________________________ dropout_6(Dropout)(None,128)0 _________________________________________________________________ dense_5(Dense)(None,10)1290 ================================================================= Totalparams:167,594 Trainableparams:167,594 Non-trainableparams:0
訓(xùn)練 3D-CNN
我們將使用 Adam 作為優(yōu)化器。分類交叉熵將用作訓(xùn)練模型的損失函數(shù),因?yàn)樗且粋€(gè)多類分類。準(zhǔn)確率將用作訓(xùn)練的損失指標(biāo)。
如前所述,在訓(xùn)練模型和 dropout 層時(shí),將使用 Earlystopping 回調(diào)。一旦任何參數(shù)(如損失或準(zhǔn)確性)在一定數(shù)量的時(shí)期內(nèi)沒有改善,Earlystopping 回調(diào)有助于停止訓(xùn)練過程,這反過來又有助于防止模型的過度擬合。
Dropout 通過在訓(xùn)練時(shí)隨機(jī)關(guān)閉一些神經(jīng)元并使模型學(xué)習(xí)而不是記憶,來幫助防止模型的過度擬合。dropout 值不宜過高,否則可能導(dǎo)致模型欠擬合,并不理想。
model.compile(Adam(0.001),'categorical_crossentropy',['accuracy']) model.fit(xtrain,ytrain,epochs=200,batch_size=32,verbose=1,validation_data=(xtest,ytest),callbacks=[EarlyStopping(patience=15)]) 這些是訓(xùn)練 3D-CNN 的一些時(shí)期。
Epoch1/200 313/313[==============================]-39s123ms/step-loss:2.2782-accuracy:0.1237-val_loss:2.1293-val_accuracy:0.2235 Epoch2/200 313/313[==============================]-39s124ms/step-loss:2.0718-accuracy:0.2480-val_loss:1.8067-val_accuracy:0.3395 Epoch3/200 313/313[==============================]-39s125ms/step-loss:1.8384-accuracy:0.3382-val_loss:1.5670-val_accuracy:0.4260 ... ... Epoch87/200 313/313[==============================]-39s123ms/step-loss:0.7541-accuracy:0.7327-val_loss:0.9970-val_accuracy:0.7061
測(cè)試 3D-CNN
3D-CNN在訓(xùn)練數(shù)據(jù)上達(dá)到了73.3%的準(zhǔn)確率,在測(cè)試數(shù)據(jù)上達(dá)到了70.6%的準(zhǔn)確率。由于數(shù)據(jù)集非常小且不平衡,因此準(zhǔn)確性可能略低。
_,acc=model.evaluate(xtrain,ytrain) print('trainingaccuracy:',str(round(acc*100,2))+'%') _,acc=model.evaluate(xtest,ytest) print('testingaccuracy:',str(round(acc*100,2))+'%')
313/313[==============================]-11s34ms/step-loss:0.7541-accuracy:0.7327 trainingaccuracy:73.27% 63/63[==============================]-2s34ms/step-loss:0.9970-accuracy:0.7060 testingaccuracy:70.61%
結(jié)論
綜上所述,本文涵蓋了以下主題:
圖像中像素的鄰域
為什么 ANN 在圖像數(shù)據(jù)集上表現(xiàn)不佳
CNN 和 ANN 的區(qū)別
CNN的工作
在 TensorFlow 中構(gòu)建和訓(xùn)練 3D-CNN
為了進(jìn)一步繼續(xù)這個(gè)項(xiàng)目,可以嘗試通過將像素值投影到另一個(gè)軸上,從 MNIST 數(shù)據(jù)集創(chuàng)建一個(gè)新的自定義 3D 數(shù)據(jù)集。x 軸和 y 軸將與任何圖像中的相同,但像素值將投影在 z 軸上。這種從 2D 數(shù)據(jù)創(chuàng)建 3D 數(shù)據(jù)的轉(zhuǎn)換可以在執(zhí)行圖像增強(qiáng)之后應(yīng)用,這樣我們就有了一個(gè)平衡且通用的數(shù)據(jù)集,可用于訓(xùn)練 3D-CNN 并獲得更好的準(zhǔn)確性。
審核編輯:郭婷
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4804瀏覽量
102626 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1222瀏覽量
25253
原文標(biāo)題:在 TensorFlow 中構(gòu)建 3D-CNN
文章出處:【微信號(hào):3D視覺工坊,微信公眾號(hào):3D視覺工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
評(píng)論