TensorFlow入門-MNIST數據集

在深度學習的路上,從頭開始瞭解一下各項技術。本人是DL小白,連續記錄我自己看的一些東西,大家可以互相交流。

之前寫過一些關於深度學習的簡單概念,最近這段時間會看一些代碼相關的東西。

本文參考:

https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_NeuralNetworks/multilayer_perceptron.py

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}))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章