標題黨其實也不多,一個輸入層,三個隱藏層,一個輸出層 老樣子先上代碼 導入mnist的路徑很長,現在還記不住 設置輸入層,X為樣本數據,y是標簽值 X 784是因為28*28,None是因為不知道需要用多少樣本 Y 10是因為 0~9的預測輸出,None理由同上 3層這樣寫有點啰嗦 下一版有個用函數 ...
標題黨其實也不多,一個輸入層,三個隱藏層,一個輸出層
老樣子先上代碼
導入mnist的路徑很長,現在還記不住
import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data import numpy as np import matplotlib.pyplot as plt from time import time mnist = input_data.read_data_sets("data/",one_hot = True) #導入Tensorflwo和mnist數據集等 常用庫
設置輸入層,X為樣本數據,y是標簽值
X 784是因為28*28,None是因為不知道需要用多少樣本
Y 10是因為 0~9的預測輸出,None理由同上
x = tf.placeholder(tf.float32,[None,784],name='X') y = tf.placeholder(tf.float32,[None,10],name='Y')
3層這樣寫有點啰嗦 下一版有個用函數實現的比這個好。
tf.truncated_normal([784,H1_NN],stddev = 0.1)以截斷正態分佈的隨機初始化,數學原理不解釋(budong),反正大小控制在stddev裡面 方便後面訓練
H1_NN = 256 #第一層神經元節點數 H2_NN = 64 #第二層神經元節點數 H3_NN = 32 #第三層神經元節點數 #第一層 W1 = tf.Variable(tf.truncated_normal([784,H1_NN],stddev = 0.1)) b1 = tf.Variable(tf.zeros(H1_NN)) #第二層 W2 = tf.Variable(tf.truncated_normal([H1_NN,H2_NN],stddev = 0.1)) b2 = tf.Variable(tf.zeros(H2_NN)) #第三層 W3 = tf.Variable(tf.truncated_normal([H2_NN,H3_NN],stddev = 0.1)) b3 = tf.Variable(tf.zeros(H3_NN)) #輸出層 W4 = tf.Variable(tf.truncated_normal([H3_NN,10],stddev = 0.1)) b4 = tf.Variable(tf.zeros(10))
輸出 不多講了 前三層使用了Relu,最後輸出因為是10分類所有使用了softmax
(今天寫的時候記錯了pred輸出使用了loss函數的softmax計算導致程式報錯,先記下來)
Y1 = tf.nn.relu(tf.matmul(x,W1)+b1) #使用Relu當作激活函數 Y2 = tf.nn.relu(tf.matmul(Y1,W2)+b2)#使用Relu當作激活函數 Y3 = tf.nn.relu(tf.matmul(Y2,W3)+b3)#使用Relu當作激活函數 forward = tf.matmul(Y3,W4)+b4 pred = tf.nn.softmax(forward)#輸出層分類應用使用softmax當作激活函數
沒錯上面說的就是這個tf.nn.sofmax_cross_entropy_with_logits,不使用這個使用第一版的
#損失函數使用交叉熵 loss_function = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = forward,labels = y))
會因為log為0導致梯度爆炸 數學原理不太懂 以後補一下,會了再來填充
loss_function = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred),
reduction_indices=1))
超參數設置啥的沒啥好說,值得一提total_batch 好像是類似一個洗牌的函數
#設置訓練參數 train_epochs = 50 batch_size = 50 total_batch = int(mnist.train.num_examples/batch_size) #隨機抽取樣本 learning_rate = 0.01 display_step = 1
優化器,(反向傳播?)不確定 反正用來調整最優的w和b
#優化器 opimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss_function)
利用argmax對比預測結果和標簽值,方便後面統計準確率
#定義準確率 correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(pred,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
開始訓練,後面會補一個保存和調用模型的代碼不然以後模型大了 不保存都要程式跑一次才能用太費時間,這裡print我把用format的刪了 因為不太會用
#開始訓練 sess = tf.Session() init = tf.global_variables_initializer() startTime = time() sess.run(init) for epochs in range(train_epochs): for batch in range(total_batch): xs,ys = mnist.train.next_batch(batch_size)#讀取批次數據 sess.run(opimizer,feed_dict={x:xs,y:ys})#執行批次數據訓練 #total_batch個批次訓練完成後,使用驗證數據計算誤差與準確率 loss,acc = sess.run([loss_function,accuracy], feed_dict={ x:mnist.validation.images, y:mnist.validation.labels}) #輸出訓練情況 if(epochs+1) % display_step == 0: epochs += 1 print("Train Epoch:",epochs, "Loss=",loss,"Accuracy=",acc) duration = time()-startTime print("Trian Finshed takes:","{:.2f}".format(duration))#顯示預測耗時
最後50輪訓練後準確率是0.97左右 已經收斂了
使用測試集評估模型
#評估模型 accu_test = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels}) print("model accuracy:",accu_test)
準確率0.9714,還行
到這裡就結束了,最後把完整代碼放上來 方便以後看
import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data import numpy as np import matplotlib.pyplot as plt from time import time mnist = input_data.read_data_sets("data/",one_hot = True) #導入Tensorflwo和mnist數據集等 常用庫 x = tf.placeholder(tf.float32,[None,784],name='X') y = tf.placeholder(tf.float32,[None,10],name='Y') H1_NN = 256 #第一層神經元節點數 H2_NN = 64 #第二層神經元節點數 H3_NN = 32 #第三層神經元節點數 #第一層 W1 = tf.Variable(tf.truncated_normal([784,H1_NN],stddev = 0.1)) b1 = tf.Variable(tf.zeros(H1_NN)) #第二層 W2 = tf.Variable(tf.truncated_normal([H1_NN,H2_NN],stddev = 0.1)) b2 = tf.Variable(tf.zeros(H2_NN)) #第三層 W3 = tf.Variable(tf.truncated_normal([H2_NN,H3_NN],stddev = 0.1)) b3 = tf.Variable(tf.zeros(H3_NN)) #輸出層 W4 = tf.Variable(tf.truncated_normal([H3_NN,10],stddev = 0.1)) b4 = tf.Variable(tf.zeros(10)) #計算結果 Y1 = tf.nn.relu(tf.matmul(x,W1)+b1) #使用Relu當作激活函數 Y2 = tf.nn.relu(tf.matmul(Y1,W2)+b2)#使用Relu當作激活函數 Y3 = tf.nn.relu(tf.matmul(Y2,W3)+b3)#使用Relu當作激活函數 forward = tf.matmul(Y3,W4)+b4 pred = tf.nn.softmax(forward)#輸出層分類應用使用softmax當作激活函數 #損失函數使用交叉熵 loss_function = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = forward,labels = y)) #設置訓練參數 train_epochs = 50 batch_size = 50 total_batch = int(mnist.train.num_examples/batch_size) #隨機抽取樣本 learning_rate = 0.01 display_step = 1 #優化器 opimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss_function) #定義準確率 correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(pred,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) #開始訓練 sess = tf.Session() init = tf.global_variables_initializer() startTime = time() sess.run(init) for epochs in range(train_epochs): for batch in range(total_batch): xs,ys = mnist.train.next_batch(batch_size)#讀取批次數據 sess.run(opimizer,feed_dict={x:xs,y:ys})#執行批次數據訓練 #total_batch個批次訓練完成後,使用驗證數據計算誤差與準確率 loss,acc = sess.run([loss_function,accuracy], feed_dict={ x:mnist.validation.images, y:mnist.validation.labels}) #輸出訓練情況 if(epochs+1) % display_step == 0: epochs += 1 print("Train Epoch:",epochs, "Loss=",loss,"Accuracy=",acc) duration = time()-startTime print("Trian Finshed takes:","{:.2f}".format(duration))#顯示預測耗時 #評估模型 accu_test = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels}) print("model accuracy:",accu_test)全部代碼