Zephyrnet-logo

Een 3D-CNN bouwen in TensorFlow

Datum:

Dit artikel is gepubliceerd als onderdeel van het Data Science-blogathon.

Inleiding op 3D-CNN

De MNIST-dataset helpt beginners het concept en de implementatie van convolutionele neurale netwerken te begrijpen. Velen beschouwen afbeeldingen als een normale matrix, maar in werkelijkheid is dit niet het geval. Beelden bevatten zogenaamde ruimtelijke informatie. Beschouw een 3X3-matrix die hieronder wordt weergegeven.

 In een reguliere matrix zijn de waarden in de matrix onafhankelijk van elkaar. De aangrenzende waarden zullen geen relatie of informatie bevatten voor een specifiek veld in de matrix. Bijvoorbeeld, de waarde die aanwezig is in plaats van "e" in de matrix zal geen verband houden met de waarden die aanwezig zijn in andere posities zoals "a", "b", enz. Dit is niet het geval in een afbeelding.

In een afbeelding vertegenwoordigt elke positie in de matrix een pixel in de afbeelding en de waarde die in elke positie aanwezig is, vertegenwoordigt de waarde van de pixel. De pixelwaarde kan van [0-255] zijn in een 8-bits afbeelding. Elke pixel heeft een bepaalde relatie met de aangrenzende pixels. De buurt van een pixel is de verzameling pixels die er omheen aanwezig is. Voor elke pixel zijn er 3 manieren om zijn buurt weer te geven, bekend als N-4, ND en N-8. Laten we ze in detail begrijpen.

  1. N-4: Het vertegenwoordigt de pixels die zich boven, onder, rechts en links van de referentiepixel bevinden. Voor pixel "e" bevat de N-4 "b", "f", "h" en "d".
  2. ND: Het vertegenwoordigt de aanwezige pixels die diagonaal toegankelijk zijn vanaf de referentiepixel. Voor pixel 'e' bevat de ND 'a', 'c', 'i' en 'g'.
  3. N-8: Het vertegenwoordigt alle pixels die eromheen aanwezig zijn. Het bevat zowel N-4- als ND-pixels. Voor pixel "e" bevat de N-8 "a", "b", "c", "d", "f", "g", "h" en "i".

De N-4, N-8 en ND pixels helpen bij het extraheren van informatie over een pixel. Deze parameters kunnen bijvoorbeeld worden gebruikt om een ​​pixel te classificeren als een rand of een binnen- of buitenpixel. Dit is de specialiteit van afbeeldingen. Een ANN accepteert invoer als een 1D-array. Een afbeelding is altijd aanwezig in een 2D array, met 1 of meerdere kanalen. Wanneer een beeldarray wordt omgezet in een 1D-array, verliest het ruimtelijke informatie en dus slaagt een ANN er niet in om deze informatie vast te leggen en presteert het slecht op een beeldgegevensset. Dit is waar een CNN in uitblinkt. Een CNN accepteert een 2D-array als invoer en voert een convolutiebewerking uit met behulp van een masker (of een filter of een kernel) en extraheert deze functies. Er wordt een proces uitgevoerd dat pooling wordt genoemd en dat het aantal geëxtraheerde functies vermindert en de rekenkundige complexiteit vermindert. Nadat we deze bewerkingen hebben uitgevoerd, zetten we de geëxtraheerde kenmerken om in een 1D-array en voeren deze door naar het ANN-deel dat leert classificatie uit te voeren.

Het artikel is bedoeld om het concept van convolutiebewerking op 3D-gegevens uit te breiden. We zullen een 3D CNN bouwen die de classificatie zal uitvoeren.

Overzicht van de dataset

We zullen de fulldatasetvectoren.h5 bestand in de dataset. Dit bestand heeft 4096-D-vectoren die zijn verkregen uit de voxelization (x:16, y:16, z:16) van alle 3D-puntenwolken. Dit bestand bevat 10000 trainings- en 2000 testvoorbeelden. De dataset bevat ook puntenwolkgegevens die kunnen worden gebruikt. Een gedetailleerde uitleg van de dataset is beschikbaar hier. Gelieve te voelen vrij om meer over de dataset te lezen alvorens verder te gaan.

Modules importeren

Omdat de gegevens zijn opgeslagen in h5 formaat, zullen we de . gebruiken h5py module voor het laden van de dataset uit de data uit het fulldatasetvectors-bestand. TensorFlow en Keras zal worden gebruikt voor het bouwen en trainen van de 3D-CNN. De naar_categorisch functie helpt bij het uitvoeren van one-hot codering van de doelvariabele. We zullen ook earlystopping callback gebruiken om de training te stoppen en overfitting van het model te voorkomen.

importeer numpy als np importeer h5py uit tensorflow.keras.utils importeer to_categorical uit tensorflow.keras importeer lagen uit tensorflow.keras.models importeer Sequential uit tensorflow.keras.initializers importeer Constant uit tensorflow.keras.optimizers importeer Adam uit tensorflow.keras.callbacks Importeer EarlyStopping

De gegevensset laden

Zoals eerder vermeld, laden we gegevens uit het bestand fulldatasetvectors.h5 met behulp van de h5py-module.

met h5py.File('../input/3d-mnist/full_dataset_vectors.h5', 'r') als dataset:

xtrain, xtest = dataset[“X_train”][:], dataset[“X_test”][:]

ytrain, ytest = gegevensset[“y_train”][:], gegevensset[“y_test”][:]

xtrain = np.array(xtrain)

xtest = np.array(xtest)

print('treinvorm:', xtrain.shape)

print('testvorm:', xtest.shape)

xtrain = xtrain.reshape(xtrain.shape[0], 16, 16, 16, 1)

xtest = xtest.hervormen(xtest.vorm[0], 16, 16, 16, 1)

ytrain, ytest = to_categorical(ytrain, 10), to_categorical(ytest, 10)


We kunnen zien dat de treingegevens 10000 monsters bevatten, terwijl de testgegevens 2000 monsters hebben en elk monster 4096 kenmerken bevat.

treinvorm: (10000, 4096) testvorm: (2000, 4096)

Het bouwen van de 3D-CNN

De 3D-CNN heeft, net als elke normale CNN, 2 delen - de feature-extractor en de ANN-classifier en presteert op dezelfde manier. De 3D-CNN voert, in tegenstelling tot de normale CNN, 3D-convolutie uit in plaats van 2D-convolutie. We zullen de sequentiële API van Keras gebruiken voor het bouwen van de 3D CNN. De eerste 2 lagen zijn de 3D convolutionele lagen met 32 ​​filters en ReLU als de activeringsfunctie, gevolgd door een max-pooling laag voor dimensionaliteitsreductie. Er is ook een bias-term aan deze lagen toegevoegd met een waarde van 0.01. Standaard is de biaswaarde ingesteld op 0. Dezelfde set lagen wordt opnieuw gebruikt, maar met 64 filters. Daarna volgen een dropout-laag en een flatten-laag. De platte laag helpt bij het omvormen van de objecten tot een 1D-array die kan worden verwerkt door een ANN, dat wil zeggen dichte lagen. Het ANN-deel bestaat uit 2 lagen, met respectievelijk 256 en 128 neuronen, en ReLU als activeringsfunctie. Dit wordt dan gevolgd door een uitvoerlaag met 10 neuronen, aangezien er 10 verschillende klassen of labels in de dataset aanwezig zijn.

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()

Dit is de architectuur van de 3D-CNN.

Model: "sequential_2" ________________________________________________________________ Laag (type) Uitvoervorm Param # ================================== ============================ conv3d_5 (Conv3D) (Geen, 14, 14, 14, 32) 896 ________________________________________________________________ conv3d_6 (Conv3D) (Geen, 12, 12, 12, 32) 27680 ________________________________________________________________ max_pooling3d_2 (MaxPooling3 (Geen, 6, 6, 6, 32) 0 _________________________________________________________________ conv3d_7 (Conv3D) (Geen, 4, 4, 4, 64) 55360 ________________________________________________________________ conv3d_8 (Conv3D) (Geen, 3, 3, 3, 64) 32832 ________________________________________________________________ max_pooling3d_3 (MaxPooling3 (Geen, 1, 1, 1, 64) 0 ________________________________________________________________ dropout_4 (Dropout) (Geen, 1, 1, 1, 64) 0 ________________________________________________________________ flatten_1 (Flatten) (Geen,64) 0 ___________________________________________________________________ density_3 (Dense) (Geen, 256) 16640 ________________________________________________________________ dropout_5 (Dropout) (Geen, 256) 0 _________________________________________________________________ density_4 (Dense) (Geen, 128) 32896 ________________________________________________________________ dropout_6 (Dropout) (Geen, 128) 0 ________________________________________________________________ density_5 ( Dicht) (Geen, 10) 1290 ======================================== ====================== Totaal params: 167,594 Trainbare params: 167,594 Niet-trainbare params: 0

Trainen van de 3D-CNN

We zullen Adam gebruiken als de optimizer. Categorische kruis-entropie zal worden gebruikt als de verliesfunctie voor het trainen van het model, aangezien het een classificatie met meerdere klassen is. De nauwkeurigheid wordt gebruikt als de verliesmaatstaf voor training. Zoals eerder vermeld, zal de Earlystopping-callback worden gebruikt bij het trainen van het model samen met de drop-outlagen. De Earlystopping-callback helpt bij het stoppen van het trainingsproces zodra een parameter zoals verlies of nauwkeurigheid niet verbetert over een bepaald aantal tijdperken, wat op zijn beurt helpt bij het voorkomen van overfitting van het model. Drop-outs helpen overfitting van het model te voorkomen door willekeurig enkele neuronen uit te schakelen tijdens het trainen en het model te laten leren en niet te onthouden. De uitvalwaarde mag niet te hoog zijn, omdat dit kan leiden tot onderaanpassing van het model, wat niet ideaal is.

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)])

Dit zijn enkele tijdperken van het trainen van de 3D-CNN.

Epoch 1/200 313/313 [==============================] - 39s 123ms/stap - verlies: 2.2782 - nauwkeurigheid : 0.1237 - val_loss: 2.1293 - val_accuracy: 0.2235 Epoch 2/200 313/313 [==============================] - 39s 124ms/stap - verlies: 2.0718 - nauwkeurigheid: 0.2480 - val_loss: 1.8067 - val_accuracy: 0.3395 Epoch 3/200 313/313 [====================== ========] - 39s 125ms/stap - verlies: 1.8384 - nauwkeurigheid: 0.3382 - val_loss: 1.5670 - val_accuracy: 0.4260 ... ... Epoch 87/200 313/313 [====== ========================] - 39s 123ms/stap - verlies: 0.7541 - nauwkeurigheid: 0.7327 - val_loss: 0.9970 - val_nauwkeurigheid: 0.7061

De 3D-CNN testen

De 3D-CNN bereikt een behoorlijke nauwkeurigheid van 73.3% in de trein en 70.6% op de testgegevens. De nauwkeurigheid kan iets aan de lage kant zijn, omdat de dataset vrij klein en niet gebalanceerd is.

_, acc = model.evaluate(xtrain, ytrain) print('trainingnauwkeurigheid:', str(round(acc*100, 2))+'%') _, acc = model.evaluate(xtest, ytest) print( 'testnauwkeurigheid:', str(round(acc*100, 2))+'%')
313/313 [==============================] - 11s 34ms/stap - verlies: 0.7541 - nauwkeurigheid: 0.7327 trainingsnauwkeurigheid : 73.27% 63/63 [==============================] - 2s 34ms/stap - verlies: 0.9970 - nauwkeurigheid: 0.7060 testnauwkeurigheid: 70.61%

n

Samengevat omvatte dit artikel de volgende onderwerpen:

  • Buren van een pixel in een afbeelding
  • Waarom een ​​ANN slecht presteert op een afbeeldingsdataset
  • Verschillen tussen een CNN en een ANN
  • Werking van CNN
  • Een 3D-CNN bouwen en trainen in TensorFlow

Om dit project verder te zetten, kan een nieuwe aangepaste 3D-dataset worden gemaakt van de MNIST-dataset door de pixelwaarden op een andere as te projecteren. De x-as en y-as blijven hetzelfde als in elke afbeelding, maar de pixelwaarden worden geprojecteerd op de z-as. Deze transformatie van het maken van 3D-gegevens uit 2D-gegevens kan worden toegepast na het uitvoeren van beeldvergroting, zodat we een goed uitgebalanceerde en gegeneraliseerde gegevensset hebben die kan worden gebruikt om de 3D-CNN te trainen en een betere nauwkeurigheid te bereiken. Dat is het einde van dit artikel. Ik hoop dat je dit artikel met plezier hebt gelezen.

Bedankt voor het lezen en veel leerplezier!

De in dit artikel getoonde media zijn geen eigendom van Analytics Vidhya en worden naar goeddunken van de auteur gebruikt.

spot_img

Laatste intelligentie

spot_img

Chat met ons

Hallo daar! Hoe kan ik u helpen?