TensorFlow 2.0でCNN(サンプルコード)
しばらく前にTensorFlow 2.0を落として具合を見てみたので、メモ。
以前のバージョンとはAPIが結構違うかったので、かなり困った印象。
Optimizerなんかがどこにあるかさっぱり分からない...。
CNNなんかはサンプルもなかったので書き方がよく分からなかったが、公式を漁っているとサンプルコードが出てきたので、ほかの文献も合わせつつ、見様見真似で書いてみた。
特に変わったことはしてないけど、とりあえず動きます。
colab.research.google.com
コード
import tensorflow as tf import tensorflow_datasets as tfds from tensorflow.keras.layers import Dense, Flatten, Conv2D from tensorflow.keras import Model batch_size = 128 num_classes = 10 epochs = 10 dataset, info = tfds.load('mnist', with_info=True, as_supervised=True) mnist_train, mnist_test = dataset['train'], dataset['test'] def convert_types(image, label): image = tf.cast(image, tf.float32) image /= 255 return image, label mnist_train = mnist_train.map(convert_types).shuffle(10000).batch(batch_size) mnist_test = mnist_test.map(convert_types).batch(batch_size) class MyModel(Model): def __init__(self): super(MyModel, self).__init__() self.conv1 = Conv2D(filters=32, kernel_size=3, activation='relu') self.flatten = Flatten() self.d1 = Dense(units=128, activation='relu') self.d2 = Dense(units=10, activation='softmax') def call(self, x): x = self.conv1(x) x = self.flatten(x) x = self.d1(x) return self.d2(x) model = MyModel() loss_object = tf.keras.losses.SparseCategoricalCrossentropy() optimizer = tf.keras.optimizers.Adam() train_loss = tf.keras.metrics.Mean(name='train_loss') train_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy') test_loss = tf.keras.metrics.Mean(name='test_loss') test_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='test_accuracy') @tf.function def train_step(image, label): with tf.GradientTape() as tape: predictions = model(image) loss = loss_object(label, predictions) gradients = tape.gradient(loss, model.trainable_variables) optimizer.apply_gradients(zip(gradients, model.trainable_variables)) train_loss(loss) train_accuracy(label, predictions) @tf.function def test_step(image, label): predictions = model(image) t_loss = loss_object(label, predictions) test_loss(t_loss) test_accuracy(label, predictions) EPOCHS = epochs for epoch in range(EPOCHS): for image, label in mnist_train: train_step(image, label) for test_image, test_label in mnist_test: test_step(test_image, test_label) template = 'Epoch {}, Loss: {}, Accuracy: {}, Test Loss: {}, Test Accuracy: {}' print (template.format(epoch+1, train_loss.result(), train_accuracy.result()*100, test_loss.result(), test_accuracy.result()*100))
結果
MNISTデータを10epochで98%ぐらい。
あんまり高くはないけど、MLPとかよりはやっぱり強いなぁという感じです。
離れて久しいので、こっちもちょっとづつ思い出していきたいなぁ。