Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- import tensorflow as tf
- # (55000 * 28 * 28): 55000張圖像
- from tensorflow.examples.tutorials.mnist import input_data
- # 讀取數據集
- # one_hot 獨熱編碼的編碼(encoding)形式
- # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9的十位數字
- # 0: 1000000000
- # 1: 0100000000
- # 2: 0010000000
- mnist = input_data.read_data_sets('mnist_data', one_hot=True)
- # None表示張量(Tensor)的第一個維度可以是任何長度
- input_x = tf.placeholder(tf.float32, [None, 28 * 28]) / 255
- # 輸出: 10個數字的預測
- output_y = tf.placeholder(tf.int32, [None, 10])
- # 改變形狀之後的輸入
- input_x_images = tf.reshape(input_x, [-1, 28, 28, 1])
- # 從Test(測試)數據集裡選取3000個手寫數字的圖片和對應label
- # 圖片
- test_x = mnist.test.images[:3000]
- # label
- test_y = mnist.test.labels[:3000]
- # 構建卷積神經網路
- # 第1層卷積
- # 輸出的形狀會變成[28, 28, 32]
- conv1 = tf.layers.conv2d(
- inputs=input_x_images, # 形狀[28, 28, 1]
- filters=32, # 32個過濾器,輸出的深度(depth)是32
- kernel_size=[5, 5], # 過濾器在2維的大小是(5 * 5)
- strides=1, # 步長是1
- padding='same', # same表示輸出的大小不變,因此需要在外圍補零2圈
- activation=tf.nn.relu, # 激動活數是Relu
- )
- # 第1層池化(亞採樣)
- # 輸出的形狀會變成[14, 14, 32]
- pool1 = tf.layers.max_pooling2d(
- inputs=conv1, # 形狀[28,28,32]
- pool_size=[2, 2], # 過濾器在2維的大小是(2 * 2)
- strides=2, # 步長是2
- )
- # 第2層卷積
- # 輸出的形狀會變成[14, 14, 64]
- conv2 = tf.layers.conv2d(
- inputs=pool1, # 形狀[14, 14, 32]
- filters=64, # 64個過濾器,輸出的深度(depth)是64
- kernel_size=[5, 5], # 過濾器在2維的大小是(5 * 5)
- strides=1, # 步長是1
- padding='same', # same表示輸出的大小不變,因此需要在外圍補零2圈
- activation=tf.nn.relu, # 激動活數是Relu
- )
- # 第2層池化(亞採樣)
- # 輸出的形狀會變成[7, 7, 64]
- pool2 = tf.layers.max_pooling2d(
- inputs=conv2, # 形狀[14, 14, 64]
- pool_size=[2, 2], # 過濾器在2維的大小是(2 * 2)
- strides=2, # 步長是2
- )
- # 平坦化(flat)
- # -1表示tensorflow會自己推斷維度
- # 輸出的形狀會變成[7, 7, 64]
- flat = tf.reshape(pool2, [-1, 7 * 7 * 64])
- # 1024個神經元的全連接層
- dense = tf.layers.dense(inputs=flat, units=1024, activation=tf.nn.relu)
- # dropout是為了NN不要過擬合
- # 丟棄率 50%,rate=0.5
- dropout = tf.nn.dropout(inputs=dense, rate=0.5, training=True)
- # 構建10個神經元的全連接層,這裡不用激活函式來做非線性化了
- # 輸出的形狀會變成[1, 1, 10]
- logits = tf.layers.dense(inputs=dropout, units=10)
Add Comment
Please, Sign In to add comment