Tensorflow1.8用keras實現MNIST資料集手寫字型識別例程(二)
阿新 • • 發佈:2018-12-12
class CNN(tf.keras.Model): def __init__(self): super().__init__() self.conv1 = tf.keras.layers.Conv2D( filters=32, # 卷積核數目 kernel_size=[5, 5], # 感受野大小 padding="same", # padding策略 activation=tf.nn.relu # 啟用函式 ) self.pool1 = tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2) self.conv2 = tf.keras.layers.Conv2D( filters=64, kernel_size=[5, 5], padding="same", activation=tf.nn.relu ) self.pool2 = tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2) self.flatten = tf.keras.layers.Reshape(target_shape=(7 * 7 * 64,)) self.dense1 = tf.keras.layers.Dense(units=1024, activation=tf.nn.relu) self.dense2 = tf.keras.layers.Dense(units=10) def call(self, inputs): inputs = tf.reshape(inputs, [-1, 28, 28, 1]) x = self.conv1(inputs) # [batch_size, 28, 28, 32] x = self.pool1(x) # [batch_size, 14, 14, 32] x = self.conv2(x) # [batch_size, 14, 14, 64] x = self.pool2(x) # [batch_size, 7, 7, 64] x = self.flatten(x) # [batch_size, 7 * 7 * 64] x = self.dense1(x) # [batch_size, 1024] x = self.dense2(x) # [batch_size, 10] return x def predict(self, inputs): logits = self(inputs) return tf.argmax(logits, axis=-1)
結果比全連線層結構要好,訓練時間變長。
batch 1988: loss 0.059841 batch 1989: loss 0.003750 batch 1990: loss 0.068940 batch 1991: loss 0.054189 batch 1992: loss 0.010302 batch 1993: loss 0.000727 batch 1994: loss 0.038650 batch 1995: loss 0.041218 batch 1996: loss 0.057438 batch 1997: loss 0.000635 batch 1998: loss 0.020010 batch 1999: loss 0.018431 test accuracy: 0.985300