我們今天就先從建立CNN模型開始進行手寫數字辨識。
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import matplotlib.pyplot as plt
import numpy as np
from time import time
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
這個部份是進行一些以後會用到的函式以及資料的匯入。
def weight(shape):
return tf.Variable(tf.truncated_normal(shape , stddev=0.1),name = 'W')
def bias(shape):
return tf.Variable(tf.constant(0.1,shape=shape),name='b')
def conv2d(x,W):
return tf.nn.conv2d(x,W,strides=[1,1,1,1], padding='SAME')
def max_pool_2x2(x):
return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
weight:建立權重的張量。
bias:建立偏差的張量。
conv2d:其效果類似於濾鏡的效果,用於卷積運算。
max_pool_2x2:進行影像的縮減,用於建立池化層。
with tf.name_scope('Input_Layer'):
x=tf.placeholder("float",[None , 784],name='x')
x_image = tf.reshape(x,[-1,28,28,1])
with tf.name_scope('C1_Conv'):
W1=weight([5,5,1,16])
b1=bias([16])
Conv1=conv2d(x_image,W1)+b1
C1_Conv = tf.nn.relu(Conv1)
with tf.name_scope('C1_pool'):
C1_pool=max_pool_2x2(C1_Conv)
with tf.name_scope('C2_Conv'):
W2=weight([5,5,16,36])
b2=bias([36])
Conv2=conv2d(C1_pool,W2)+b2
C2_Conv = tf.nn.relu(Conv2)
with tf.name_scope('C2_pool'):
C2_pool=max_pool_2x2(C2_Conv)
with tf.name_scope('D_Flat'):
D_Flat = tf.reshape(C2_pool,[-1,1764])
with tf.name_scope('hidden'):
W3=weight([1764,128])
b3=bias([128])
hidden=tf.nn.relu(tf.matmul(D_Flat,W3)+b3)
dropout=tf.nn.dropout(hidden,keep_prob=0.8)
with tf.name_scope('OUTPUT'):
W4=weight([128,10])
b4=bias([10])
y=tf.nn.softmax(tf.matmul(dropout,W4)+b4)
'Input_Layer':建立輸入層。
'C1_Conv':建立卷積層1。
->W1=weight(a,b,c,d) a,b=>濾鏡的大小為a x b c=>影像顏色 單色1 彩色3 d=>卷積運算後會產生的影像數量
->b1=偏差值
->Conv1=運算公式
->C1_Conv = 激勵函數
'C1_pool':建立池化層1。
->進行影像的縮減
'C2_Conv':建立卷積層2。
->W2=weight(a,b,c,d) a,b=>濾鏡的大小為a x b c=>影像顏色 單色1 彩色3 d=>卷積運算後會產生的影像數量
->b2=偏差值
->Conv2=運算公式
->C2_Conv = 激勵函數
'C2_pool':建立池化層2。
->進行影像的縮減
'D_Flat':建立全連接層。
->進行影像的攤平
'hidden':建立隱藏層。
'OUTPUT':建立輸出層。
到了這邊,CNN的模型已經建立好了,接下來就是等待下一章的開始訓練了。