我們依舊以MNIST手寫字體數(shù)據(jù)集认境,來看看我們?nèi)绾问褂胻ensorflow來實現(xiàn)MLP聘萨。
數(shù)據(jù)
數(shù)據(jù)下載
這里我們通過tensorflow的模塊彬坏,來下載數(shù)據(jù)集朦促。
import tensorflow as tf
import tensorflow.examples.tutorials.mnist.input_data as input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
這樣熄捍,我們就下載了數(shù)據(jù)集轿钠,這里的one_hot的意思是label為獨熱編碼竟块,也就是說我們的label就不需要預(yù)處理了薛闪。
數(shù)據(jù)情況
我們通過下面代碼看看數(shù)據(jù)的情況:
- 55000訓(xùn)練集
- 5000驗證集
- 10000測試集
MLP模型
之前我們使用過keras進行訓(xùn)練杀餐,只需要建立一個model甩栈,然后add加入神經(jīng)網(wǎng)絡(luò)層佳遂。tensorflow是要復(fù)雜很多狸页,那我們一步步構(gòu)建我們的模型吧。
- 首先是輸入層箩退,我們用placeholder來輸入
- 隱含層256個神經(jīng)元
- 輸出10個神經(jīng)元
def layer(output_dim,input_dim,inputs, activation=None):
W = tf.Variable(tf.random_normal([input_dim, output_dim]))
b = tf.Variable(tf.random_normal([1, output_dim]))
XWb = tf.matmul(inputs, W) + b
if activation is None:
outputs = XWb
else:
outputs = activation(XWb)
return outputs
x = tf.placeholder("float", [None, 784])
h1=layer(output_dim=256,input_dim=784,
inputs=x ,activation=tf.nn.relu)
y_predict=layer(output_dim=10,input_dim=256,
inputs=h1,activation=None)
定義損失函數(shù)
這里我們需要自己定義函數(shù)巍扛,并進行優(yōu)化處理。
y_label = tf.placeholder("float", [None, 10])
loss_function = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits
(logits=y_predict ,
labels=y_label))
optimizer = tf.train.AdamOptimizer(learning_rate=0.001) \
.minimize(loss_function)
準(zhǔn)確性評價
correct_prediction = tf.equal(tf.argmax(y_label , 1),
tf.argmax(y_predict, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
訓(xùn)練
訓(xùn)練我們定義15輪乏德。
trainEpochs = 15
batchSize = 100
totalBatchs = int(mnist.train.num_examples/batchSize)
epoch_list=[];loss_list=[];accuracy_list=[]
from time import time
startTime=time()
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for epoch in range(trainEpochs):
for i in range(totalBatchs):
batch_x, batch_y = mnist.train.next_batch(batchSize)
sess.run(optimizer,feed_dict={x: batch_x,y_label: batch_y})
loss,acc = sess.run([loss_function,accuracy],
feed_dict={x: mnist.validation.images,
y_label: mnist.validation.labels})
epoch_list.append(epoch);loss_list.append(loss)
accuracy_list.append(acc)
print("Train Epoch:", '%02d' % (epoch+1), "Loss=", \
"{:.9f}".format(loss)," Accuracy=",acc)
duration =time()-startTime
print("Train Finished takes:",duration)