tensorflow上lenet的使用小结

先上代码:

#!/usr/bin/python
#-*-coding:utf-8-*-

import input_data
import tensorflow as tf

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

x = tf.placeholder(tf.float32,shape=[None,784])
y_ = tf.placeholder(tf.float32,shape=[None,10])
x_image = tf.reshape(x,[-1,28,28,1])

################ network #################
# conv1
w_conv1 = tf.Variable(tf.truncated_normal([5,5,1,20],mean=0,stddev=0.1))
b_conv1 = tf.Variable(tf.constant(0.1,shape=[20]))
conv1 = tf.nn.conv2d(x_image,w_conv1,strides=[1,1,1,1],padding='SAME')+b_conv1
relu1 = tf.nn.relu(conv1)
# pool1
pool1 = tf.nn.max_pool(relu1,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
# conv2
w_conv2 = tf.Variable(tf.truncated_normal([5,5,20,50],mean=0,stddev=0.1))
b_conv2 = tf.Variable(tf.constant(0.1,shape=[50]))
conv2 = tf.nn.conv2d(pool1,w_conv2,strides=[1,1,1,1],padding='SAME')+b_conv2
relu2 = tf.nn.relu(conv2)
# pool2
pool2 = tf.nn.max_pool(relu2,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
# fc1
pool2_flat = tf.reshape(pool2,shape=[-1,7*7*50])
w_fc1 = tf.Variable(tf.truncated_normal([7*7*50,500],mean=0,stddev=0.1))
b_fc1 = tf.Variable(tf.constant(0.1,shape=[500]))
fc1 = tf.matmul(pool2_flat,w_fc1)+b_fc1
relu_fc1 = tf.nn.relu(fc1)
# dropout
keep_prob = tf.placeholder(tf.float32)
fc1_dropout = tf.nn.dropout(relu_fc1, keep_prob)
# fc2
w_fc2 = tf.Variable(tf.truncated_normal([500,10],mean=0,stddev=0.1))
b_fc2 = tf.Variable(tf.constant(0.1,shape=[10]))
fc2 = tf.matmul(fc1_dropout,w_fc2)+b_fc2
# softmax
y = tf.nn.softmax(fc2)

##########train-predict############
# train and evaluate
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
train_step = tf.train.GradientDescentOptimizer(0.0001).minimize(cross_entropy)
#train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) 
accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(y,1),tf.argmax(y_,1)),tf.float32))
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(0,20000):
    train_x,train_y = mnist.train.next_batch(100)
    sess.run(train_step,feed_dict = {x:train_x,y_:train_y,keep_prob:0.5})
    if i%100==0:
        acc = sess.run(accuracy,feed_dict = {x:train_x,y_:train_y,keep_prob:1.0})
        print 'step %d, train_accuracy %g' % (i,acc)
print "test accuracy %g" % sess.run(accuracy,feed_dict={x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0})
sess.close()

经过多次调参数测试,做如下总结,欢迎拍砖:

  1. 收敛的决定性因素是学习率,刚开始设置为0.01,怎么都不行,其实采用哪种优化算法,影响不是特别大。
  2. 卷积核的个数可以做适当的调整,卷积层1、卷积层2、全连接层1的核分别设置为(20,50,500)和(32,64,1024)对结果几乎没有什么影响,主要是因为输入的图片长宽比较小。
  3. 是否有RELU层,可能会稍微有点影响收敛的速度,但不明显,就这个例子,结果无妨。
  4. dropout层可以防止过拟合,加上会比较好。
  5. 参数的初始化,不是特别影响,就算全是0也没有太大问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值