TensorFlow实现进阶的卷积神经网络

1、简介

本人使用的数据集是CIFAR-10。这是一个经典的数据集,许多论文也都是在这个数据集上进行训练。
使用的卷积神经网络是根据Alex描述的cuda-convnet模型修改得来。在这个神经网络中,我使用了一些新的技巧:
(1)对weights进行了L2的正则化
(2)将图像进行翻转、随机剪切等数据增强,制造了更多的样本
(3)在每个卷积-最大化池层后面使用了LRN层,增强了模型的泛化能力

2、CIFAR-10数据下载

首先下载TensorFlow models库,

git clone https://github.com/tensorflow/models.git
cd models/tutorials/image/cifar10

也可以手动下载,用的时候手动载入。(我就是这样)
下载链接:https://pan.baidu.com/s/127nsLZfWXU4kYZriHivp7Q
提取码:dd4u

手动下载后的使用方法在代码里有。

3、代码流程

1、准备工作:定义初始化权重weight
2、用cifar10_input产生数据集
3、数据输入、第一卷积层、第二卷积层、第一全连接层、第二全连接层、输出层等
4、计算loss
5、训练(用Adam优化器减少loss)
6、评价模型在测试集上的准确度
7、最后计算评价结果并打印

4、说明

最终,在CIFAR-10数据集上可以达到大致73%的准确率,增加max_step可以增加准确率。L2正则和LRN层的使用对模型准确率有提升作用。
数据增强在我们的训练中作用很大,他可以给单幅图增加多个副本,提高图片的利用率,防止对某一张图片过拟合。使用数据增强后准确率大概上升11%。
卷积层后一般跟一个池化层,卷积池化的组合目前已经是图像识别的标准组件。卷积网络后面的几个全连接层的作用是输出分类结果,前面的卷积层主要是做特征提取,直到最后的全连接层才开始对特征进行组合匹配,并进行分类。

5、部分代码


#创建输入数据
image_holder = tf.placeholder(tf.float32, [batch_size, 24, 24, 3])
label_holder = tf.placeholder(tf.int32, [batch_size])

#创建第一个卷积层
weight1 = variable_with_weight_loss(shape=[5,5,3,64], stddev=5e-2, w1 = 0.0)
kernel1 = tf.nn.conv2d(image_holder,weight1, [1,1,1,1],padding='SAME')
bias1 = tf.Variable(tf.constant(0.0, shape=[64]))
conv1 = tf.nn.bias_add(kernel1, bias1)
pool1 = tf.nn.max_pool(conv1, ksize=[1,3,3,1],strides=[1,2,2,1],padding='SAME')
norm1 = tf.nn.lrn(pool1, 4, bias=1.0, alpha=0.001/9.0, beta=0.75)

#创建第二个卷积层
weight2 = variable_with_weight_loss(shape=[5,5,64,64], stddev=5e-2, w1 = 0.0)
kernel2 = tf.nn.conv2d(norm1, weight2, [1,1,1,1],padding='SAME')
bias2 = tf.Variable(tf.constant(0.1, shape=[64]))
conv2 = tf.nn.relu(tf.nn.bias_add(kernel2, bias2))
norm2 = tf.nn.lrn(conv2, 4, bias=1.0, alpha=0.001/9.0, beta=0.75)
pool2 = tf.nn.max_pool(norm2, ksize=[1,3,3,1], strides=[1,2,2,1], padding='SAME')

#全连接层
reshape = tf.reshape(pool2, [batch_size, -1])
dim = reshape.get_shape()[1].value
weight3 = variable_with_weight_loss(shape=[dim, 384], stddev=0.04, w1=0.004)
bias3 = tf.Variable(tf.constant(0.1, shape=[384]))
local3 = tf.nn.relu(tf.matmul(reshape, weight3) + bias3)

#全连接层,跟前一层很像,但是隐含节点数少一半
weight4 = variable_with_weight_loss(shape=[384, 192], stddev=0.04, w1=0.004)
bias4 = tf.Variable(tf.constant(0.1, shape=[192]))
local4 = tf.nn.relu(tf.matmul(local3, weight4) + bias4)

#最后一层,先创建weight
weight5 = variable_with_weight_loss(shape=[192, 10], stddev=1/192.0, w1=0.0)
bias5 = tf.Variable(tf.constant(0.0, shape=[10]))
logits = tf.add(tf.matmul(local4, weight5), bias5)

链接: 全代码下载链接.
链接: 上一篇.
链接: 下一篇.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值