#coding : utf8
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data #读数据集
'''
1.数据
读取数据,划分训练集测试集labels,features
'''
data = input_data.read_data_sets('./MNIST_data', one_hot= True) #读取数据
train_x, train_y = data.train.images, data.train.labels
test_x, test_y = data.test.images, data.test.labels
'''
2.参数
本文使用两层隐藏层,各层neuron个数分别为:
input_layer: 28*28 (features of train_x or test_x)
hidden_layer1: 256
hidden_layer2: 128
output_layer: 10
'''
n_input = 28 * 28
n_hidden_layer_1 = 256
n_hidden_layer_2 = 128
n_output_layer = 10
x = tf.placeholder(tf.float32, [None, n_input])
y = tf.placeholder(tf.float32, [None, n_output_layer])
w = {
'w1': tf.Variable(tf.random_normal([n_input, n_hidden_layer_1]), dtype= tf.float32),
'w2': tf.Variable(tf.random_normal([n_hidden_layer_1, n_hidden_layer_2]),dtype= tf.float32),
'w_out': tf.Variable(tf.random_normal([n_hidden_layer_2, n_output_layer]),dtype= tf.float32)
}
b = {
'b1': tf.Variable(tf.zeros([1,n_hidden_layer_1]), dtype= tf.float32),
'b2': tf.Variable(tf.zeros([1,n_hidden_layer_2]), dtype= tf.float32),
'b_out': tf.Variable(tf.zeros([1,n_output_layer]), dtype= tf.float32)
}
'''
3.前向传播
'''
def forward_propagation(_x, _w, _b):
layer1 = tf.nn.sigmoid(tf.add(tf.matmul(_x, _w['w1']), _b['b1']))
layer2 = tf.nn.sigmoid(tf.add(tf.matmul(layer1, _w['w2']), _b['b2']))
return tf.add(tf.matmul(layer2, _w['w_out']), _b['b_out'])
'''
4.损失函数
'''
learn_rate = 0.01
y_predict = forward_propagation(x, w, b)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits= y_predict, labels= y))
optm = tf.train.GradientDescentOptimizer(learn_rate).minimize(loss)
'''
5.评价
'''
result = tf.equal(tf.arg_max(y_predict, 1), tf.arg_max(y, 1))
acc = tf.reduce_mean(tf.cast(result, dtype=tf.float32))
'''
6.训练
'''
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
iters = 100
batch_size = 100
for i in range(iters):
cost = count = 0.0
for batch_index in range(0, train_y.shape[0], batch_size):
count += 1
feed = {x: train_x[batch_index: batch_index + batch_size], y: train_y[batch_index: batch_index + batch_size]}
sess.run(optm, feed_dict= feed)
cost += sess.run(loss, feed_dict= feed)
cost /= count
feed_test = {x: test_x, y: test_y}
accuracy = sess.run(acc, feed_dict= feed_test)
#print (accuracy)
print ('第 %d 次迭代, 损失值为 %.5f, 分类准确率为 %.5f' % (i + 1, cost, accuracy))