LeNet5解析和TensorFlow实现

LeNet5诞生于1994年,是最早的深层卷积神经网络之一,这个网络虽然很小,但它包含了深度学习的基本模块:卷积层,池化层,全连接层,它的诸多特性依然在state-of-the-art卷积神经网络中使用,可以说LeNet5是其它深度学习模型的基础。
LeNet5结构图:
这里写图片描述
流程:
输入:输入图像为32*32的灰度图;
第一个卷基层C1:包含6个卷积核,卷积核尺寸为5x5;
第一个池化层S2:用来进行降采样(大小2x2);
Sigmoid激活函数:用来进行非线性处理;
第二个卷基层C3:包含16个卷积核,卷积核尺寸为5x5;
第二个池化层S4:同S2;
第三个卷基层C5:包含120个卷积核,卷积核尺寸为5x5,因为输入图像的大小也是5x5,也可以算作全连接层;
LeNet5最后一层由径向基函数(Radial Basis Function, RBF)单元组成,输出最后的分类结果。

论文:Gradient-based-learning-applied-to-document-recognition
参考:http://blog.csdn.net/strint/article/details/44163869

TensorFlow实现简单的卷积网络

# coding=utf-8

#载入MNIST数据集
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)
import tensorflow as tf
sess = tf.InteractiveSession()

#定义权重和偏置
def weight_variable(shape):   
    initial = tf.truncated_normal(shape,stddev=0.1)    
   return tf.Variable(initial)

def bias_variable(shape):   
    initial = tf.constant(0.1,shape=shape)    
    return tf.Variable(initial)

#定义卷基层和池化层
def conv2d(x,W):      
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

def max_pool_2x2(x):    
    return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

##创建模型
#定义输入的placeholder,x是特征,y_是真实的label
x = tf.placeholder(tf.float32,[None,784])
y_ = tf.placeholder(tf.float32,[None,10])
x_image = tf.reshape(x,[-1,28,28,1])

#定义第一个卷基层
w_conv1 = weight_variable([5,5,1,32])
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image,w_conv1)+b_conv1)
h_pool1 = max_pool_2x2(h_conv1)

#定义第二个卷基层
w_conv2 = weight_variable([5,5,32,64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1,w_conv2)+b_conv2)
h_pool2 = max_pool_2x2(h_conv2)

#全连接层
w_fc1 = weight_variable([7*7*64,1024])
b_fc1 = bias_variable([1024])
h_pool2_flat = tf.reshape(h_pool2,[-1,7*7*64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat,w_fc1)+b_fc1)

#dropout层,在其后连接softmax层
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1,keep_prob)
w_fc2 = weight_variable([1024,10])
b_fc2 = bias_variable([10])
y_conv= tf.nn.softmax(tf.matmul(h_fc1_drop,w_fc2)+b_fc2)

#损失函数cross entropy,优化器Adam
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y_conv),reduction_indices=[1]))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

#定义准确率函数
correct_prediction = tf.equal(tf.argmax(y_conv,1),tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

#训练和评估模型
tf.global_variables_initializer().run()
for i in xrange(10000):
    batch = mnist.train.next_batch(50)
    if i%200 == 0:
       train_accuracy = accuracy.eval(feed_dict={x:batch[0],y_:batch[1],keep_prob:1.0})
       print("step %d,trainging accuracy %g"%(i,train_accuracy))
    train_step.run(feed_dict={x:batch[0],y_:batch[1],keep_prob:0.5})

#print "test accuracy %g" % accuracy.eval(feed_dict={x:mnist.test.images, y_:mnist.test.labels, keep_prob:1.0}) ##可能会GPU显存不足导致报错,可以将test set分成几个batch分别测试,最后求平均精度,如下所示。
accuracy_sum = tf.reduce_sum(tf.cast(correct_prediction, tf.float32))
good = 0
total = 0
for j in xrange(10):
    testSet = mnist.test.next_batch(50)
    good += accuracy_sum.eval(feed_dict={ x: testSet[0], y_: testSet[1], keep_prob: 1.0})
    total += testSet[0].shape[0]
print("test accuracy %g"%(good/total))
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值