设为首页 加入收藏

TOP

学习笔记TF029:实现进阶卷积网络(一)
2017-10-09 13:34:56 】 浏览:8156
Tags:学习 笔记 TF029: 实现 进阶 网络

经典数据集CIFAR-10,60000张32x32彩色图像,训练集50000张,测试集10000张。标注10类,每类图片6000张。airplance、automobile、bird、cat、deer、dog、frog、horse、ship、truck。没有任何重叠。CIFAR-100,100类标注。深度学习之父 Geoffrey Hinton和学生Alex Krizhevsky、Vinod Nair收集。图片源于80 million tiny images数据集。State-of-the-art 3.5%错误率,GPU训练十几小时。详细Benchmark和排名在 http://rodrigob.github.io/are_we_there_yet/build/classification_datasets_results.html 。LeCun,现有卷积神经网络已经解决CIFAR-10数据集问题。

根据Alex cuda-convnet模型修改,3000个batch,每个batch 128个样本,达到73%正确率。GTX1080单显卡几十秒模型训练时间。CPU慢很多。如用100k batch 结合学习速度decay(每隔一段时间下降学习速率一个比率),正确率可到86%。模型训练参数100万个,预测四则运算总量2000万次。对weights进行L2正则化。图片翻转、随机剪切等数据增强,制造更多样本。每个卷积-最大池化层后用LRN层,增强模型泛化能力。

下载TensorFlow Models库,使用其中提供CIFAR-10数据类。git clone https://github.com/tensorflow/models.git。models/tutorials/image/cifar10。

载入常用库,NumPy、time,TensorFlow Models自动下载、读取CIFAR-10数据类。

定义batch_size,训练轮数max_steps,下载CIFAR-10数据默认路径。

定义初始化weight函数,tf.truncated_normal截断正态分布初始化权重。Weight加L2 loss ,做L2 正则化。减少特征或惩罚不重要特征权重,缓解特征过多导致过拟合。正则化帮助找到该惩罚的特征权重。为使用某个特征,需付出loss代价。L1正则制造稀疏特征,大部分无用特征权重被置0。L2正则让特征权重不过大,特征权重较平均。wl控制L2 loss大小,tf.nn.l2_loss函数计算weight L2 loss,tf.multiply L2 loss 乘以wl,得最后 weight loss。tf.add_to_collection weight loss统一存在collection losses,计算神经网络总体loss使用。

用cifar10类下载数据集,解压、展开到默认位置。

用cifar10_input类 distorted_inputs函数产生训练数据,包括特征、label,返回封装tensor,每次执行生成一个batch_size数量样本。Data Augmentation(数据增强),cifar10_input.distorted_inputs函数,随机水平翻转(tf.image.random_flip_left_right)、随机剪切一块24x24图片(tf.random_crop)、设置随机亮度对比度(tf.image.random_brightness、tf.image.random_contrast),数据标准化(tf.image.per_image_whitening,数据减均值,除方差,保证数据零均值,方差1)。获得更多样本,带噪声,一张图片样本变多张图片,扩大样本量,提高准确率。数据增强操作耗费大量CPU时间,distored_inputs用16个独立线程加速任务,函数内部产生线程池,通过TensorFlow queue调度。

用cifar10_input.inputs函数生成测试数据,裁剪图片正中间24x24大小区块,数据标准化。

创建输入数据placeholderx,特征、label。设定placeholder数据尺寸,batch_size定义网络结构要用,数据尺寸第一个值样本条数需要预先设定,不能设None。数据尺寸的图片尺寸为24x24,裁剪后大小,颜色通道数3,彩色RGB三通道。

第一个卷积层,variable_with_weight_loss 函数创建卷积核参数初始化。卷积核大小5x5,3个颜色通道,64个卷积核,设置weight初始化函数标准差0.05。wl(weight loss)设0。tf.nn.conv2d函数对输入数据image_holder卷积操作,步长stride设1,padding模式SAME,bias初始化0,卷积结果加bias,用ReLU激活函数非线化。用尺寸3x3,步长2x2最大池化层处理数据,尺寸、步长不一致,增加数据丰富性。tf.nn.lrn函数,LRN,处理结果。

LRN起于Alex用CNN参加ImageNet比赛论文。LRN模仿生物神经系统侧抑制机制,对局部神经元活动创建竞争环境,响应较大值变得相对更大,抑制其他反馈较小神经元,增强模型泛化能力。用LRN后CNN Top1错误率降低1.4%。LRN对无上限边界激活函数ReLU有用,从附近多个卷积核响应(Response)挑选较大反馈,不适合固定边界能抑制过大值激活函数Sigmoid。

第二个卷积层,卷积核尺寸第三维度输入通道数64,bias值全初始化0.1。先进行LRN层处理,再用最大池化层。

全连接层,把前面两个卷积层输出结果全部flatten,tf.reshape函数把每个样本变成一维向量。get_shape函数获取数据扁平化长度。variable_with_weight_loss函数初始化全连接层weight,隐含节点384,正态分布标准差0.04,bias初始化0.1。设非零weight loss值0.04,所有参数被L2正则约束,避免过拟合。ReLU激活函数非线性化。

第二个全连接层,隐含节点192。

最后一层,先创建weight,正态分布标准差设上一隐含层节点数倒数,不计入L2正则。Softmax操作放在计算loss部分,不需要对inference输出softmax处理,就可以获得最终分类,直接比较inference输出各类数值大小。

整个卷积神经网络从输入到输出流程。设计CNN,安排卷积层、池化层、全连接层分布和顺序,超参数设置、Trick使用。卷积神经网络结构:
conv1:卷积层和ReLU激活函数
pool1:最大池化
norm1:LRN
conv2:卷积层和ReLU激活函数
norm2:LRN
pool2:最大池化
local3:全连接层和ReLU激活函数
local4:全连接层和ReLU激活函数
logits:模型Inference输出结果

计算CNN loss。softmax计算和cross entropy loss 计算合在一起,tf.nn.sparse_softmax_cross_entropy_with_logits。tf.reduce_mean计算cross entropy均值,tf.add_to_collection 添加cross e

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇我的Python开发之路---微信网页授.. 下一篇win7下从ruby源代码编译安装

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目