在深度學習的路上,從頭開始瞭解一下各項技術。本人是DL小白,連續記錄我自己看的一些東西,大家可以互相交流。
之前寫過一些關於深度學習的簡單概念,最近這段時間會看一些代碼相關的東西。
本文參考:
TensorFlow官方樣例
一、前言
tensorflow相關的內容可以看之前實驗室同學寫的介紹
https://blog.csdn.net/wangyanbeilin/article/details/81108278
這兩天實現的東西亂七八糟的,一點點整理出來。
下面是MNIST數據集在tensorflow上的實現,主要寫的內容都在代碼註釋裏了。用tensorflow實現還是很簡單的。
三、代碼實現
#導入3.x新功能,讓python 2.x的代碼,也需要在print後面加(),這裏用於統一代碼規範
from __future__ import print_function
#下載導入MNIST數據集,MNIST數據集被包括在tensorflow之中
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
import tensorflow as tf
#設置超參數(hyperparameters)
learning_rate = 0.001
training_epochs = 15
#一般使用256,128,64,32等存儲大小,這裏因爲MNIST數據集一共55000個數據,用100可以整除,省去了mini_batch的餘數部分batch的處理,用來簡化操作
batch_size = 100
display_step = 1
#設定參數
n_h1 = 256
n_h2 = 256
#MNIST數據大小爲28 * 28 = 784
n_x = 784 #輸入層爲784個神經元結點
n_y = 10
#創建佔位符(placeholder)
X = tf.placeholder("float", [None, n_x])
Y = tf.placeholder("float", [None, n_y])
#初始化參數(權重)
parameters = {
"W1": tf.Variable(tf.random_normal([n_x, n_h1])),
"W2": tf.Variable(tf.random_normal([n_h1, n_h2])),
"W3": tf.Variable(tf.random_normal([n_h2, n_y]))
}
#初始化參數(偏置)
biases = {
"b1": tf.Variable(tf.random_normal([n_h1])),
"b2": tf.Variable(tf.random_normal([n_h2])),
"b3": tf.Variable(tf.random_normal([n_y]))
}
#Acc : 0.8901
#cost: 21.8285
"""""
這裏也可以用個零向量來初始化偏置,代價函數初始值比隨意量初始化的初值要低。可能因爲其他的超參數也需要調優的原因,單獨調整偏置之後的正確率反而下降了
biases = {
"b1": tf.Variable(tf.zeros([n_h1])),
"b2": tf.Variable(tf.zeros([n_h2])),
"b3": tf.Variable(tf.zeros([n_y]))
}
Acc : 0.878
cost: 22.4767
"""""
#建立MLP model
def multilayer_perceptron(x):
layer_1 = tf.add(tf.matmul(x, parameters['W1']), biases['b1'])
layer_2 = tf.add(tf.matmul(layer_1, parameters['W2']), biases['b2'])
out_layer = tf.add(tf.matmul(layer_2, parameters['W3']), biases['b3'])
return out_layer
#logits即爲y-hat預測值
logits = multilayer_perceptron(X)
#計算損失
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = logits, labels= Y))
"""
創建優化器,這裏使用的是Adam優化器,常用的還有
tf.train.GradientDescentOptimizer(learning_rate) 梯度下降優化方法
tf.train.RMSPropOptimizer(learning_rate) RMSProp優化方法
"""
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
#優化模型,最小化損失
train_op = optimizer.minimize(loss_op)
#初始化變量
init = tf.global_variables_initializer()
#開始會話,tensorflow
with tf.Session() as sess:
sess.run(init)
for epoch in range(training_epochs):
avg_cost = 0.
#這裏如果是64爲一batch的話,還需要單獨處理餘數部分的數據
total_batch = int(mnist.train.num_examples / batch_size)
for i in range(total_batch):
batch_x, batch_y = mnist.train.next_batch(batch_size)
_, c = sess.run([train_op, loss_op], feed_dict={X: batch_x, Y:batch_y})
avg_cost += c / total_batch
#因爲迭代次數僅爲15次,所以每次都輸出損失,大規模訓練可以隔幾次輸出
if epoch % display_step == 0:
print("Epoch:", '%04d' % (epoch+1), "cost={:.9f}".format(avg_cost))
print('Optimization Finished')
#測試模型,用測試數據集來看模型的能力
pred = tf.nn.softmax(logits)
correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
print("Accuracy:", accuracy.eval({X: mnist.test.images, Y: mnist.test.labels}))