3D-CNN簡介
MNIST數據集分類被認為是計算機視覺領域的 hello world 程序。MNIST數據集幫助初學者理解卷積神經網絡(CNN)的概念和實現。
許多人認為圖像只是一個普通矩陣,但實際上并非如此。圖像擁有所謂的空間信息。考慮如下所示的 3X3 矩陣。
[a b c
d e f
g h i]
在正則矩陣中,矩陣中的值將相互獨立。相鄰值不會攜帶矩陣中特定字段的任何關系或信息。例如,在矩陣中代替“e”的值與出現在其他位置的值(如“a”、“b”等)沒有任何聯系。圖像中的情況并非如此。
在圖像中,矩陣中的每個位置代表圖像中的一個像素,每個位置的值代表該像素的值。像素值可以是 8 位圖像中的 [0-255]。每個像素與其相鄰像素有某種關系。任何像素的鄰域是其周圍的一組像素。對于任何像素,有 3 種方法來表示其鄰域,稱為 N-4、ND 和 N-8。讓我們詳細了解它們。
N-4:它表示存在于參考像素的頂部、底部、右側和左側的像素。對于像素“e”,N-4 包含“b”、“f”、“h”和“d”。
ND:它表示從參考像素對角線可訪問的像素。對于像素“e”,ND 包含“a”、“c”、“i”和“g”。
N-8:它代表它周圍存在的所有像素。它包括 N-4 和 ND 像素。對于像素“e”,N-8 包含“a”、“b”、“c”、“d”、“f”、“g”、“h”和“i”。
N-4、N-8 和 ND 像素有助于提取有關像素的信息。例如,這些參數可用于將像素分類為邊界或內部或外部像素。這是圖像的特殊性。人工神經網絡(ANN )接收一維數組形式的輸入。圖像始終存在于具有 1 個或多個通道的 2D 陣列中。當圖像數組轉換為一維數組時,它會丟失空間信息,因此人工神經網絡無法捕獲此信息并且在圖像數據集上表現不佳。而這就是 CNN 擅長的地方。
CNN 接受 2D 數組作為輸入,并使用掩碼(或過濾器或內核)執行卷積操作并提取這些特征。執行稱為池化的過程,該過程減少了提取的特征數量并降低了計算復雜度。完成這些操作后,我們將提取的特征轉換為一個1D數組,并將其提供給學習進行分類的神經網絡層。
本文旨在擴展對 3D 數據進行卷積操作的概念。我們將構建一個 3D CNN,它將在 3D MNIST 數據集上執行分類
數據集概述
我們將在數據集中使用fulldatasetvectors.h5文件。該文件具有從所有 3D 點云的體素化 (x:16, y:16, z:16) 獲得的 4096-D 向量。該文件包含 10000 個訓練樣本和 2000 個測試樣本。數據集也有可以使用的點云數據。
導入模塊
由于數據以h5格式存儲,我們將使用h5py模塊從 fulldatasetvectors 文件中的數據加載數據集。TensorFlow和Keras將用于構建和訓練 3D-CNN。to_categorical函數有助于對 目標變量執行 one-hot 編碼。我們還將使用 earlystopping 回調來停止訓練并防止模型過度擬合。
importnumpyasnp importh5py fromtensorflow.keras.utilsimportto_categorical fromtensorflow.kerasimportlayers fromtensorflow.keras.modelsimportSequential fromtensorflow.keras.initializersimportConstant fromtensorflow.keras.optimizersimportAdam fromtensorflow.keras.callbacksimportEarlyStopping
加載數據集
如前所述,我們將使用 h5py 模塊從 fulldatasetvectors.h5 文件中加載數據。
使用 h5py.File(‘。./input/3d-mnist/full_dataset_vectors.h5’, ‘r’) 作為數據集:
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) 我們可以看到訓練數據有 10000 個樣本,而測試數據有 2000 個樣本,每個樣本包含 4096 個特征。
trainshape:(10000,4096) testshape:(2000,4096)
構建 3D-CNN
3D-CNN,就像任何普通的 CNN 一樣,有兩部分——特征提取器和 ANN 分類器,并且以相同的方式執行。
與普通 CNN 不同,3D-CNN 執行 3D 卷積而不是 2D 卷積。我們將使用 Keras 的Sequential API 來構建 3D CNN。前 2 層將是具有 32 個過濾器和 ReLU 作為激活函數的 3D 卷積層,然后是用于降維的最大池化層。這些層還添加了一個偏置項,其值為 0.01。默認情況下,偏差值設置為 0。
再次使用同一組圖層,但使用 64 個過濾器。然后是 dropout 層和 flatten 層。flatten 層有助于將特征重塑為可由人工神經網絡處理的一維陣列,即密集層。ANN部分由 2 層組成,分別有 256 和 128 個神經元,以 ReLU 作為激活函數。然后是具有 10 個神經元的輸出層,因為數據集中存在 10 個不同的類別或標簽。
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 的架構。
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
訓練 3D-CNN
我們將使用 Adam 作為優化器。分類交叉熵將用作訓練模型的損失函數,因為它是一個多類分類。準確率將用作訓練的損失指標。
如前所述,在訓練模型和 dropout 層時,將使用 Earlystopping 回調。一旦任何參數(如損失或準確性)在一定數量的時期內沒有改善,Earlystopping 回調有助于停止訓練過程,這反過來又有助于防止模型的過度擬合。
Dropout 通過在訓練時隨機關閉一些神經元并使模型學習而不是記憶,來幫助防止模型的過度擬合。dropout 值不宜過高,否則可能導致模型欠擬合,并不理想。
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)]) 這些是訓練 3D-CNN 的一些時期。
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
測試 3D-CNN
3D-CNN在訓練數據上達到了73.3%的準確率,在測試數據上達到了70.6%的準確率。由于數據集非常小且不平衡,因此準確性可能略低。
_,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%
結論
綜上所述,本文涵蓋了以下主題:
圖像中像素的鄰域
為什么 ANN 在圖像數據集上表現不佳
CNN 和 ANN 的區別
CNN的工作
在 TensorFlow 中構建和訓練 3D-CNN
為了進一步繼續這個項目,可以嘗試通過將像素值投影到另一個軸上,從 MNIST 數據集創建一個新的自定義 3D 數據集。x 軸和 y 軸將與任何圖像中的相同,但像素值將投影在 z 軸上。這種從 2D 數據創建 3D 數據的轉換可以在執行圖像增強之后應用,這樣我們就有了一個平衡且通用的數據集,可用于訓練 3D-CNN 并獲得更好的準確性。
審核編輯:郭婷
-
神經網絡
+關注
關注
42文章
4762瀏覽量
100539 -
數據集
+關注
關注
4文章
1205瀏覽量
24643
原文標題:在 TensorFlow 中構建 3D-CNN
文章出處:【微信號:3D視覺工坊,微信公眾號:3D視覺工坊】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論