从AlexNet开始(二)
本篇博客将会介绍如何改进AlexNet的网络结构使其应用于CIFAR-10数据集的图像分类,并给出大部分代码,代码使用python语言与tensorflow框架。
CIFAR-10数据集简介
CIFAR数据集是由深度学习三大牛之一的Hinton大佬的两个大弟子Alex Krizhevsky与Ilya Sutskever收集的一个用于普适物体识别的数据集,其中CIFAR是加拿大政府牵头投资的一个先进科学项目研究所。CIFAR数据集共分为两部分,一部分是CIFAR-10,另一部分是CIFAR-100 。
CIFAR-10由60000张32*32分辨率的RGB彩色照片组成,顾名思义,这60000张照片共有10个类别,其中训练集包括50000张图片,测试集包括10000张图片,训练集的图片按类别分好,而测试集的图片顺序是打乱的。
CIFAR-100数据集则共有100个分类,其中100个分类包含在10个大类之中,每个大类有10个小类。CIFAR-100中包含的图片同样也是50000张用来训练,10000张用来测试。
具体的CIFAR数据集下载与解压,可以参考Alex做的CIFAR数据集的网站,链接如下:
Tensorflow简介
Tensorflow是由谷歌开发的,用于机器学习与深度神经网络计算的开源框架。
在Tensorflow中,数据不再是传统的多维数组与变量,程序也不再是由传统的结构组成。Tensorflow采用数据流图的方式来描述程序中的运算,在数据流图中,节点(node)表示对变量的操作与数学计算或是数据的起点终点,线(edge)表示节点之间的输入输出关系,而在线中流动的,就是输送数据的多维数组,也即张量(tensor)。
一旦构建好数据流图,tensors将会在节点之间流动,并异步并行地执行数据流图所定义的运算
Tensorflow代码解释
代码概述
Tensorflow的代码共分为4个文件,分别为
Code | Description |
---|---|
cifar10.py | 主程序,决定模型训练还是验证 |
cifar10_input.py | 输入程序,包括数据增强、建立队列、打乱顺序等 |
cifar10_model.py | 模型搭建,包括inference, train, loss, validation等函数 |
cifar10_eval.py | 验证程序,验证模型在测试集上的精确度 |
重点说下cifar10_model.py的内容,输入部分的代码可以参考我之前的博客,如何使用队列输入数据。全部代码会上传到我的github上,地址为
cifar10_model.py
本代码中共包含如下函数
Functions | Description |
---|---|
inference | 模型推测 |
loss | 计算损失函数 |
train | 模型训练 |
validation | 模型验证 |
variable_on_cpu | 创建存储在CPU内存上的变量 |
variable_with_weight_decay | 创建变量并计算L2_loss |
add_loss_summaries | summary所有的loss并求和 |
inference函数定义了前向模型,描述了卷积神经网络的结构。在函数中,输入一个batch的图片,以及dropout的keep_prob,最终得到计算出的logits。
def inference(images, keep_prob):
images = tf.cast(images, tf.float32)
# conv 1
# 5*5 convolution with stride 2, channel 32
with tf.variable_scope('conv1') as scope:
kernel = variable_with_weight_decay('weights', [5,