【Tensorflow 2.0公式版チュートリアル】CNN(ボリュームニューラルネットワーク)
12286 ワード
チュートリアルの最初の文章として、説明の内容は簡単で、簡単で、公式に推薦されたコードスタイル(kerasを採用する)を採用して簡単なボリュームニューラルネットワークを構築し、データセットも最も簡単な手書き文字MNISTを採用している.
まず、MNISTデータセットtensorflow自身がロード関数を提供する
最初の実行時にローカルに自動的にダウンロードされます.ネットワークの状態が悪い場合やオフラインの場合は、事前に手動でダウンロードして読み込む必要があります.
ネットワークを構築する際に必要なモデルと各層はkerasの実現を採用する
そして、コンボリューション層、プール化層などを順番に入れることで、簡単にモデルを完成させることができます.
ここで、モデルは第1層のみ
モデルの構築が完了すると、コードに
1つのボリューム層フィーチャーマップを通過するたびにサイズが2減少することがわかり、kerasのデフォルトのボリュームのpadding形式はvalidであり、ボリューム層フィーチャーマップを通過するサイズが変わらなければ(実際にはほとんどの場合そうである)、パラメータ
次に,モデルトレーニング時のオプティマイザ,損失関数を設定し,ここではadamをオプティマイザとし,損失関数はクロスエントロピーである.
より多くの内容、例えば学習率、l 2正則は次の文章で紹介します.
最後にトレーニングモデルを開始することができます.ここでは、データのbatchsizeを128、ネットワークトレーニングを5ラウンド、テスト機でテストします.
最終トレーニングセットの精度は約99%、テストセットは約98.5%であった.完全なコードはhttps://github.com/Apm5/tensorflow_2.0_tutorial/blob/master/CNN/simple_example.py
さらに、完全なコードで最初に実行されるgpu設定について説明します.
ディスプレイメモリの使用量を必要に応じて増加させます.そうしないと、どんなに小さなネットワークでも1枚のグラフィックスカードのディスプレイメモリがすべて満たされます.cpuバージョンであれば、gpuで訓練したくない場合は、この2行を注釈することができます.
まず、MNISTデータセットtensorflow自身がロード関数を提供する
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
最初の実行時にローカルに自動的にダウンロードされます.ネットワークの状態が悪い場合やオフラインの場合は、事前に手動でダウンロードして読み込む必要があります.
ネットワークを構築する際に必要なモデルと各層はkerasの実現を採用する
from tensorflow.keras import models
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Reshape
そして、コンボリューション層、プール化層などを順番に入れることで、簡単にモデルを完成させることができます.
def Model():
model = models.Sequential()
model.add(Reshape((28, 28, 1), input_shape=(28, 28)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dense(10, activation='softmax'))
return model
ここで、モデルは第1層のみ
input_shape
パラメータを提供する必要があり、後続のネットワークの各層の入出力サイズは自動的に推定される.ここで私の第1層はReshape
であり、tensorflowのデータ組織形式は(B,H,W,C)であり、画像のロット数、高さ、幅、チャネル数の順であるが、MNISTデータセットは白黒画像であり、読み取り時にチャネル次元がないため、第1層はReshape
を用いて手動でチャネルを追加する.Flatten
層は、多次元データを平らにして、後続のDense
全接続動作を行う.モデルの構築が完了すると、コードに
model.summary()
を追加し、実行時に各層の情報を印刷することができます.Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
reshape (Reshape) (None, 28, 28, 1) 0
_________________________________________________________________
conv2d (Conv2D) (None, 26, 26, 32) 320
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 13, 13, 32) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 11, 11, 64) 18496
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 5, 5, 64) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 3, 3, 64) 36928
_________________________________________________________________
flatten (Flatten) (None, 576) 0
_________________________________________________________________
dense (Dense) (None, 64) 36928
_________________________________________________________________
dense_1 (Dense) (None, 10) 650
=================================================================
Total params: 93,322
Trainable params: 93,322
Non-trainable params: 0
_________________________________________________________________
1つのボリューム層フィーチャーマップを通過するたびにサイズが2減少することがわかり、kerasのデフォルトのボリュームのpadding形式はvalidであり、ボリューム層フィーチャーマップを通過するサイズが変わらなければ(実際にはほとんどの場合そうである)、パラメータ
padding='same'
を設定して制御することができる.次に,モデルトレーニング時のオプティマイザ,損失関数を設定し,ここではadamをオプティマイザとし,損失関数はクロスエントロピーである.
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
より多くの内容、例えば学習率、l 2正則は次の文章で紹介します.
最後にトレーニングモデルを開始することができます.ここでは、データのbatchsizeを128、ネットワークトレーニングを5ラウンド、テスト機でテストします.
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(train_images,
train_labels,
batch_size=128,
epochs=5)
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(test_acc)
最終トレーニングセットの精度は約99%、テストセットは約98.5%であった.完全なコードはhttps://github.com/Apm5/tensorflow_2.0_tutorial/blob/master/CNN/simple_example.py
さらに、完全なコードで最初に実行されるgpu設定について説明します.
physical_devices = tf.config.experimental.list_physical_devices('GPU')
tf.config.experimental.set_memory_growth(device=physical_devices[0], enable=True)
ディスプレイメモリの使用量を必要に応じて増加させます.そうしないと、どんなに小さなネットワークでも1枚のグラフィックスカードのディスプレイメモリがすべて満たされます.cpuバージョンであれば、gpuで訓練したくない場合は、この2行を注釈することができます.