如果设
x
为原始图像
b1
为第一层的bias
W2
为第二层的权重
b2
为第二层的bias
y
为神经网络的输出
那么,这个简单的小模型可以表述为
用tanh可以让输出有正有负,个人觉得对第二层效果可能会更好。
实现的代码如下,注释应该算详尽了
import input_data
import tensorflow as tf
# load the dataset
mnist = input_data.read_data_sets("MNIST_data/", one_hot = True)
# functions used to initialize variables
def Weight(shape):
standard_distribution = tf.truncated_normal(shape, stddev = 0.1,
dtype = tf.float64)
return tf.Variable(standard_distribution)
def Placeholder(shape):
return tf.placeholder(tf.float64, shape)
# declare variables
# input
x = Placeholder([None, 784])
# parameters
W_layer1 = Weight([784, 25])
b_layer1 = Weight([25])
W_layer2 = Weight([25, 10])
b_layer2 = Weight([10])
# output
y_layer1 = tf.nn.tanh(tf.matmul(x, W_layer1) + b_layer1)
y_layer2 = tf.nn.softmax(tf.matmul(y_layer1, W_layer2) + b_layer2)
y = y_layer2
# answer
answer = Placeholder([None, 10])
# loss
loss = -tf.reduce_sum(answer * tf.log(y)) # cross entropy
# train
train = tf.train.GradientDescentOptimizer(0.01).minimize(loss) # alpha = 0.01
# session
sess = tf.InteractiveSession()
# evalutate
def Eval():
correct = tf.equal(tf.argmax(y, 1), tf.argmax(answer, 1))
accuracy = tf.reduce_mean(tf.cast(correct, tf.float64))
print(accuracy.eval(feed_dict = {x: mnist.test.images,
answer: mnist.test.labels}))
# main routine
sess.run(tf.global_variables_initializer()) # initiate
for i in range(1000):
if( i % 100 == 0 ):
Eval();
batch = mnist.train.next_batch(50)
train.run(feed_dict = {x: batch[0], answer: batch[1]})
Eval();
最终的正确率是93.21%,比官方的那个没有隐藏层的那个版本(准确率大约在91%)效果好一些。而且训练的特别快。
下面考虑加一些奇技淫巧来优化一下。
1:batch的大小改为100,准确率94.23%
2:batch的大小改为200,准确率95.39%
3:batch的大小改为500,准确率却下去了,变成了70.59%
那么,就让batch的大小一直是200吧0.0
下面再试试增加迭代的次数到2000
0: 0.0914
100: 0.811
200: 0.911
300: 0.9303
400: 0.9396
500: 0.9455
600: 0.942
700: 0.9441
800: 0.9423
900: 0.9464
1000: 0.945
1100: 0.9514
1200: 0.9496
1300: 0.9512
1400: 0.9523
1500: 0.9492
1600: 0.9544
1700: 0.9549
1800: 0.9518
1900: 0.952
2000: 0.9543
发现在94%到95%的部分一直在震荡,这说明学习率太高了。然而我调了一会,发现学习率再怎么变也没什么卵用,可能是我调参姿势有问题。
就这样吧,正确率95.4%,也是一个不差的结果了。