【Tensorflow 2.0公式版チュートリアル】CNN(ボリュームニューラルネットワーク)

12286 ワード

チュートリアルの最初の文章として、説明の内容は簡単で、簡単で、公式に推薦されたコードスタイル(kerasを採用する)を採用して簡単なボリュームニューラルネットワークを構築し、データセットも最も簡単な手書き文字MNISTを採用している.
まず、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行を注釈することができます.