1. 程式人生 > >tensorflow cnn minist

tensorflow cnn minist

在mnist資料集上用tensorflow搭建CNN模型

import tensorflow as tf
import numpy as np

from tensorflow.examples.tutorials.mnist import input_data
import warnings
warnings.filterwarnings("ignore")

mnist = input_data.read_data_sets('mnist_data', one_hot=True)
input_x = tf.placeholder(tf.float32, [None, 28*28])/255
output_y = tf.placeholder(tf.int32, [None, 10])  # 10個數字的標籤
input_x_images = tf.reshape(input_x, [-1, 28, 28, 1])
test_x = mnist.test.images[:3000]
test_y = mnist.test.labels[:3000]
print(mnist.train.images.shape)  # 可以檢視資料大小
print(mnist.test.images.shape)



# 第一層卷積, 輸出形狀程式設計[-1, 28, 28, 32]
conv1 = tf.layers.conv2d(
    inputs=input_x_images,
    filters=32,   # 32個過濾器
    kernel_size=[5, 5],  # 過濾器在二維的大小
    strides=1,  # 步長為1
    padding='same',  # same表示輸出大小不變,因此需要在外圍補0(兩圈)
    activation=tf.nn.relu  # 啟用函式
)

# 池化層(亞取樣),主要是採取部分資料,步長為2,經過亞取樣後變為[-1,14, 14, 32]
# pooling:max_pooling和average_pooling兩種
pool1 = tf.layers.max_pooling2d(
    inputs=conv1,
    pool_size=[2, 2],  # 亞取樣,在2*2中取出一個最大值
    strides=2  # 步長為2
)

# 第二層卷積, 輸出大小為[-1,14, 14, 64]
conv2 = tf.layers.conv2d(
    inputs=pool1,
    filters=64,   # 64個過濾器
    kernel_size=[5, 5],  # 過濾器在二維的大小
    strides=1,  # 步長為1
    padding='same',  # same表示輸出大小不變,因此需要在外圍補0(兩圈)
    activation=tf.nn.relu  # 啟用函式
)

# 第二層池化, 輸出大小為[-1,7, 7, 64]
pool2 = tf.layers.max_pooling2d(
    inputs=conv2,
    pool_size=[2, 2],  # 亞取樣,在2*2中取出一個最大值
    strides=2  # 步長為2
)

# 平坦化
flat = tf.reshape(pool2, [-1, 7*7*64])  # 把資料鋪平,每張圖片變成一個7*7*64大小的行向量

# 全連線層,1024個神經元
dense = tf.layers.dense(
    inputs=flat,
    units=1024,   # 1024個神經元
    activation="relu"
)
# dropout:丟棄部分資料,rate即為丟棄資料的百分比
dropout = tf.layers.dropout(
    inputs=dense,
    rate=0.5,  # r即為丟棄資料的百分比
    training=True
)

# 10個神經元的全連線層,這裡不用啟用函式來做非線性化了
logits = tf.layers.dense(
    inputs=dropout,
    units=10
)

# 計算誤差(cross entropy, 再用softmax計算百分比)softmax是一種啟用函式
loss = tf.losses.softmax_cross_entropy(
    onehot_labels=output_y,  # 真實標籤
    logits=logits  # 神經網路的預估
)

# 用優化器來最小化誤差
train_op = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)

# 計算預測值和標籤的正確率
accuracy = tf.metrics.accuracy(
    labels=tf.argmax(output_y, axis=1),  # axis=1表示按行最大值, axis=0表示按列最大值
    predictions=tf.argmax(logits, axis=1)
)[1]

# 建立會話
sess = tf.Session()
# 初始化變數
init = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())
sess.run(init)

for i in range(20000):
    batch = mnist.train.next_batch(50)  # 從train訓練集裡取50個樣本
    train_loss, train_op_ = sess.run([loss, train_op], feed_dict={input_x: batch[0], output_y: batch[1]})
    if i%100==0:
        test_accuracy = sess.run(accuracy, {input_x:test_x, output_y:test_y})
        print("Step=%d, Train loss=%.4f, Test accuracy=%.4f"%(i, train_loss, test_accuracy))





訓練結果:
在這裡插入圖片描述