cnn:
進(jìn)行卷積運(yùn)算(首先許定義權(quán)重w和偏移b)
#cnn : 1 卷積
# ABC
# A: 激勵(lì)函數(shù)+矩陣 乘法加法
# A CNN : pool(激勵(lì)函數(shù)+矩陣 卷積 加法)
# C:激勵(lì)函數(shù)+矩陣 乘法加法(A-》B)
# C:激勵(lì)函數(shù)+矩陣 乘法加法(A-》B) + softmax(矩陣 乘法加法)
# loss:tf.reduce_mean(tf.square(y-layer2))
# loss:code
#1 import
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
# 2 load data
mnist = input_data.read_data_sets('MNIST_data',one_hot = True)
# 3 input 輸入數(shù)據(jù)
imageInput = tf.placeholder(tf.float32,[None,784]) # 28*28
labeInput = tf.placeholder(tf.float32,[None,10]) # knn
# 4 data reshape 數(shù)據(jù)維度的調(diào)整
# [None,784]->M*28*28*1 2D->4D 28*28 wh 1 channel
#將2維[None,784] 調(diào)整為4維 M*28*28*1 (28*28表示圖片寬高探颈;1表示讀取灰度圖像蜂怎,1為灰色通道楼熄;經(jīng)過轉(zhuǎn)換后的剩余的元素共同構(gòu)成M)
imageInputReshape = tf.reshape(imageInput,[-1,28,28,1])
# 5 卷積 w0 : 卷積內(nèi)核 5*5 out:32 in:1
w0 = tf.Variable(tf.truncated_normal([5,5,1,32],stddev = 0.1))#服從正態(tài)分布的數(shù)據(jù)([最終生產(chǎn)數(shù)據(jù)的維度],期望方差)卷積運(yùn)算的內(nèi)核大小5*5牌借,輸入維度1骄崩,可認(rèn)為是上面那1個(gè)灰色通道校哎,32表明是32維度
b0 = tf.Variable(tf.constant(0.1,shape=[32])) #定義一個(gè)常量,其維度為32
# 6 # layer1:激勵(lì)函數(shù)+卷積運(yùn)算 conv2d (輸入輸出很難保證線性滔蝉,所以采用激勵(lì)函數(shù)击儡,保證非線性)
# imageInputReshape : M*28*28*1 w0: 5,5,1,32
#tf.nn.conv2d(輸入圖像數(shù)據(jù),權(quán)重矩陣蝠引,每次移動(dòng)的步長(zhǎng)阳谍,'SAME'表示卷積核可以停留在圖像邊緣)
#relu : 激勵(lì)函數(shù)
layer1 = tf.nn.relu(tf.nn.conv2d(imageInputReshape,w0,strides=[1,1,1,1],padding='SAME')+b0)
#layer1的大兄瘛: M*28*28*32
# (考慮數(shù)據(jù)太大,添加池化層)pool是完成下采樣 數(shù)據(jù)量減少很多: M*28*28*32 --> M*7*7*32 這些數(shù)表示維度(ksize=[1,4,4,1],那么:M/1=1,28/4=7,28/4=7,32/1=32)
#tf.nn.max_pool(池化數(shù)據(jù)矫夯,池化縮小程度鸽疾,池化層步長(zhǎng),'SAME'能夠停留在池化層邊緣)
layer1_pool = tf.nn.max_pool(layer1,ksize=[1,4,4,1],strides=[1,4,4,1],padding='SAME')
# [1 2 3 4]->[4] (max_pool表示: 例如將4維[1 2 3 4]池化成1維训貌,一維的數(shù)據(jù)制肮;來源于最大值,則池化后為[4])
#以下開始實(shí)現(xiàn)輸出層
# 7 layer2 out : 激勵(lì)函數(shù)+乘加運(yùn)算: softmax(激勵(lì)函數(shù) + 乘加運(yùn)算)
#softmax為回歸函數(shù)旺订,用來計(jì)算輸出值
# [7*7*32,1024] tf.truncated_normal([數(shù)據(jù)維度]弄企,方差=0.1)
w1 = tf.Variable(tf.truncated_normal([7*7*32,1024],stddev=0.1))
b1 = tf.Variable(tf.constant(0.1,shape=[1024]))
#維度轉(zhuǎn)換
h_reshape = tf.reshape(layer1_pool,[-1,7*7*32])# M*7*7*32 -> N*N1(將4維轉(zhuǎn)換為2維)
# [N*7*7*32] * [7*7*32,1024] = N*1024 (進(jìn)行矩陣相乘)
h1 = tf.nn.relu(tf.matmul(h_reshape,w1)+b1) #激勵(lì)函數(shù)+乘加運(yùn)算matmul
# 7.1 softMax tf.truncated_normal([數(shù)據(jù)維度],方差 = 0.1)
w2 = tf.Variable(tf.truncated_normal([1024,10],stddev=0.1))
b2 = tf.Variable(tf.constant(0.1,shape=[10]))
pred = tf.nn.softmax(tf.matmul(h1,w2)+b2)# N*1024 1024*10 = N*10
# N*10( 概率 )N1【0.1 0.2 0.4 0.1 0.2 区拳。拘领。∮5鳎】 N表示n張圖片约素,10表示預(yù)測(cè)在0-9分布的概率
# label。 【0 0 0 0 1 0 0 0.笆凌。圣猎。】
loss0 = labeInput*tf.log(pred)#對(duì)結(jié)果進(jìn)行壓縮乞而,得到唯一的標(biāo)識(shí)1送悔,但此時(shí)任然是10維的數(shù)據(jù),需要累加成1維
loss1 = 0
# 7.2
for m in range(0,500):# test 500爪模,進(jìn)行測(cè)試時(shí)欠啤,每次給500張,
for n in range(0,10): #將10個(gè)維度的數(shù)據(jù)進(jìn)行累加
loss1 = loss1 - loss0[m,n] #這里得到的是正數(shù)屋灌,在使用梯度下降法時(shí)洁段,要變成-號(hào)
loss = loss1/500 #除以500組數(shù)據(jù)
# 8 train 開始訓(xùn)練,采用梯度下降共郭,每次下降0.01.盡可能縮小當(dāng)前的loss
train = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
# 9 run
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(100):
images,labels = mnist.train.next_batch(500)
sess.run(train,feed_dict={imageInput:images,labeInput:labels})
pred_test = sess.run(pred,feed_dict={imageInput:mnist.test.images,labeInput:labels})
acc = tf.equal(tf.arg_max(pred_test,1),tf.arg_max(mnist.test.labels,1))
acc_float = tf.reduce_mean(tf.cast(acc,tf.float32))
acc_result = sess.run(acc_float,feed_dict={imageInput:mnist.test.images,labeInput:mnist.test.labels})
print(acc_result)