0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如果在TensorFlow中構(gòu)建3D-CNN數(shù)據(jù)集

電子工程師 ? 來源: 深度學(xué)習(xí)與計(jì)算機(jī)視覺 ? 作者:磐懟懟 ? 2022-08-10 11:31 ? 次閱讀

3D-CNN簡介

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ú)立。相鄰值不會攜帶矩陣中特定字段的任何關(guān)系或信息。例如,在矩陣中代替“e”的值與出現(xiàn)在其他位置的值(如“a”、“b”等)沒有任何聯(lián)系。圖像中的情況并非如此。

在圖像中,矩陣中的每個(gè)位置代表圖像中的一個(gè)像素,每個(gè)位置的值代表該像素的值。像素值可以是 8 位圖像中的 [0-255]。每個(gè)像素與其相鄰像素有某種關(guān)系。任何像素的鄰域是其周圍的一組像素。對于任何像素,有 3 種方法來表示其鄰域,稱為 N-4、ND 和 N-8。讓我們詳細(xì)了解它們。

N-4:它表示存在于參考像素的頂部、底部、右側(cè)和左側(cè)的像素。對于像素“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 像素有助于提取有關(guān)像素的信息。例如,這些參數(shù)可用于將像素分類為邊界或內(nèi)部或外部像素。這是圖像的特殊性。人工神經(jīng)網(wǎng)絡(luò)(ANN )接收一維數(shù)組形式的輸入。圖像始終存在于具有 1 個(gè)或多個(gè)通道的 2D 陣列中。當(dāng)圖像數(shù)組轉(zhuǎn)換為一維數(shù)組時(shí),它會丟失空間信息,因此人工神經(jīng)網(wǎng)絡(luò)無法捕獲此信息并且在圖像數(shù)據(jù)集上表現(xiàn)不佳。而這就是 CNN 擅長的地方。

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ò)展對 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è)測試樣本。數(shù)據(jù)集也有可以使用的點(diǎn)云數(shù)據(jù)。

導(dǎo)入模塊

由于數(shù)據(jù)以h5格式存儲,我們將使用h5py模塊從 fulldatasetvectors 文件中的數(shù)據(jù)加載數(shù)據(jù)集。TensorFlow和Keras將用于構(gòu)建和訓(xùn)練 3D-CNN。to_categorical函數(shù)有助于對 目標(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è)樣本,而測試數(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 

測試 3D-CNN

3D-CNN在訓(xùn)練數(shù)據(jù)上達(dá)到了73.3%的準(zhǔn)確率,在測試數(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)確性。

審核編輯:郭婷


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:在 TensorFlow 中構(gòu)建 3D-CNN

文章出處:【微信號:3D視覺工坊,微信公眾號:3D視覺工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    TF之CNNCNN實(shí)現(xiàn)mnist數(shù)據(jù)預(yù)測

    TF之CNNCNN實(shí)現(xiàn)mnist數(shù)據(jù)預(yù)測 96%采用placeholder用法+2層C及其max_pool法+隱藏層dropout法+輸出層softmax法+目標(biāo)函數(shù)cross_e
    發(fā)表于 12-19 17:02

    TF之CNNTensorflow構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)CNN的嘻嘻哈哈事之詳細(xì)攻略

    TF之CNNTensorflow構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)CNN的嘻嘻哈哈事之詳細(xì)攻略
    發(fā)表于 12-19 17:03

    TensorFlowCNN文本分類

    TensorFlow實(shí)現(xiàn)CNN進(jìn)行文本分類(譯)
    發(fā)表于 10-31 09:27

    如何利用PyTorch API構(gòu)建CNN?

    ?方式有哪些?今天本文將以一個(gè)簡單的指南,將幫助您構(gòu)建和了解構(gòu)建簡單的CNN的概念。通過閱讀本文之后,將能夠基于PyTorch API構(gòu)建一個(gè)簡單的CNN,并使用FashionMNIS
    發(fā)表于 07-16 18:13

    如果在序列模式中使用XADC它如何利用ADC?

    嗨,如果在序列模式中使用XADC它如何利用ADC?例如,如果我有3個(gè)頻道; 2個(gè)Aux和1個(gè)溫度?這些如何在ADC之間劃分? AUX頻道的采樣率是多少?我可以使用獨(dú)立的ADC模式,其中2aux將在一
    發(fā)表于 08-06 10:21

    TensorFlow邏輯回歸處理MNIST數(shù)據(jù)

    本節(jié)基于回歸學(xué)習(xí)對 MNIST 數(shù)據(jù)進(jìn)行處理,但將添加一些 TensorBoard 總結(jié)以便更好地理解 MNIST 數(shù)據(jù)。MNIST由https://www.
    發(fā)表于 08-11 19:36

    TensorFlow邏輯回歸處理MNIST數(shù)據(jù)

    本節(jié)基于回歸學(xué)習(xí)對 MNIST 數(shù)據(jù)進(jìn)行處理,但將添加一些 TensorBoard 總結(jié)以便更好地理解 MNIST 數(shù)據(jù)。MNIST由https://www.
    發(fā)表于 08-11 19:36

    高階API構(gòu)建模型和數(shù)據(jù)使用

    能擬合或逼近現(xiàn)實(shí)世界事物或現(xiàn)象的數(shù)學(xué)模型,故樣本數(shù)據(jù)大,可以覆蓋事物或現(xiàn)象所有特征時(shí),可以越準(zhǔn)確的識別事物,這也是大數(shù)據(jù)時(shí)代,數(shù)據(jù)是燃料的觀點(diǎn)。T
    發(fā)表于 11-04 07:49

    如何用TensorFlow導(dǎo)入MNIST數(shù)據(jù)

    TensorFlow導(dǎo)入MNIST數(shù)據(jù)
    發(fā)表于 11-11 07:33

    如果在CAN高線或CAN低線中出現(xiàn)開路,為什么驅(qū)動系統(tǒng)數(shù)據(jù)總線會完全中斷?

    如果在CAN高線或CAN低線中出現(xiàn)開路,為什么驅(qū)動系統(tǒng)數(shù)據(jù)總線會完全中斷?
    發(fā)表于 05-09 10:55

    基于3D-CNN的無參考視頻質(zhì)量評價(jià)方法

    神經(jīng)網(wǎng)絡(luò)(3D-CNN)引入到了視頻質(zhì)量評價(jià),提出了一種基于3D-CNN的無參考視頻質(zhì)量評價(jià)方法,可以適用于非特定失真類型的NR-VQA.首先,通過3D塊來有效學(xué)習(xí)和表征視頻內(nèi)容的時(shí)
    發(fā)表于 01-03 10:18 ?2次下載

    谷歌AI研發(fā)TensorFlow3D操作速度竟提高二十倍

    Google AI發(fā)布了TensorFlow 3D,將3D深度學(xué)習(xí)能力引入TensorFlow,加入3D稀疏卷積網(wǎng)絡(luò),在Waymo Open
    的頭像 發(fā)表于 03-12 09:33 ?2214次閱讀

    如果在Zephyr內(nèi)如何使用ESP32藍(lán)牙

    在Zephyr ESP32 藍(lán)牙驅(qū)動簡析一文簡要分析了esp32 藍(lán)牙如何集成進(jìn)Zephyr,本文接著說明如果在Zephyr內(nèi)使用ESP32藍(lán)牙。 在Zepher中使用ESP32藍(lán)牙比WIFI還要
    的頭像 發(fā)表于 06-07 16:42 ?3609次閱讀

    3D點(diǎn)云數(shù)據(jù)3D數(shù)字化技術(shù)的應(yīng)用

    隨著計(jì)算機(jī)視覺技術(shù)的不斷發(fā)展,3D 數(shù)字化技術(shù)已經(jīng)成為了當(dāng)今工業(yè)制造領(lǐng)域和三維醫(yī)學(xué)影像領(lǐng)域的關(guān)鍵技術(shù)。然而,構(gòu)建高精度、高分辨率的 3D 點(diǎn)云數(shù)據(jù)
    的頭像 發(fā)表于 05-06 16:46 ?1295次閱讀

    如何在TensorFlow構(gòu)建并訓(xùn)練CNN模型

    TensorFlow構(gòu)建并訓(xùn)練一個(gè)卷積神經(jīng)網(wǎng)絡(luò)(CNN)模型是一個(gè)涉及多個(gè)步驟的過程,包括數(shù)據(jù)預(yù)處理、模型設(shè)計(jì)、編譯、訓(xùn)練以及評估。下面
    的頭像 發(fā)表于 07-04 11:47 ?583次閱讀