写在前面的话
对于深度学习网络复现,很多最新论文不会将神经网络开源,但是又需要借用这个网络来解决自己的问题。所以根据论文的网络示意图来编写网络程序将是一个很重要的技能。深度学习能不能跑起来,一个是网络搭建,一个是训练样本的制作。在基础研究中,训练样本使用开源的几个数据集做测试,二训练网络并不是想要论文作者开源就能开源的,所以我们用keras来打开这扇大门。
什么是keras?
以上则是keras的百度百科介绍,可以说keras就是集成度超高的API调用工具,对于较复杂的网络层搭建,keras则可能一行代码就能实现。对论文的网络实验,或者测试,以tf、CNTK等网络框架做后端。由于它的高集成度,所以对于完成网络编写也是极大方便了研究人员。
一、任务分析
上图就是一个简单的卷积神经网络示意图,基本步骤是卷积-下采样-全连接-分类。本文即将以此网络示意图进行详细讲解根据网络图搭建神经网络。网络示意图的观看顺序,一般从左至右或者从上至下。此图是从左至右,可以从整体上看,首先查看网络的输入和输出为格式32*32的图片与对应的10个分类。在网络设计中,首先了解网络的输入输出是一个较为重要的步骤,关系到后续网络层的设计。如果弄错输入格式,网络很有可能要从新设计。
二、详细方案
1、下图就是网络设计的第一层,输入+卷积。图中涉及到的参数有INPUT格式32X32,以及输入到下一层的关系为卷积,卷积的滤波器个数为6个,滤波器的尺寸大小为5X5,以及从32X32图片到28X28的格式则在卷积时不会使用填充这一操作,图中能获取的参数就是这些,但是还有一些没有的参数,例如,激活函数,一般对照着论文就能知道这些参数。
model.add(Conv2D(filters=6, #对应图中6个模板,也就是6个filter
kernel_size=(5,5), #对应的5*5的尺寸
padding='valid', #对应图中32*32的图片缩小到28*28,所以这个参数对应的是valid
input_shape=(32,32,1), #对应左边的INPUT,输入一张图片
activation='relu')) #对于cnn常用的激活函数relu
2、第二步则从图中看到是做下采样操作,尺寸由28X28减到14X14,缩小一半,在网络中对应的是池化(pooling)操作。图中,subsampling则为下采样,代码中使用池化操作。池化也是特征提取的一个过程,所以此层输出的特征图为14X14格式,特征图个数为6。并且整个池化过程相较于卷积更为简单,参数相对也少了很多。
model.add(MaxPooling2D(pool_size=(2, 2))) #降采样用最大池化操作,池化尺寸2*2也就是将图片缩小一半
3、接下来是卷积层参数是使用16个5X5的滤波器,卷积层输出为16个10X10的特征图。
model.add(Conv2D(filters=16, #对应图中16个滤波器
kernel_size=(5,5), #对应图中的5*5的尺寸
padding='valid', #对应图中14*14的图片缩小到10*10
activation='relu')) #对于cnn常用的激活函数relu
4、继续下采样,10X10的图片缩小到5X5,滤波器数量为16
model.add(MaxPooling2D(pool_size=(2, 2)))
#降采样用最大池化操作,池化尺寸2*2也就是将图片缩小一半
5、第五层到输出层将放在一起做代码详解,可以看到从2维图片格式变为1维向量就在这一步实现,在keras里也是一个API即可完成这一步骤,剩下的作用则就是全连接+分类。
model.add(Flatten())
# 全连接,120
model.add(Dense(120, activation='relu'))
model.add(Dropout(0.5)) #避免过拟合
# output layer
model.add(Dense(10,activation='softmax')) #分类常用激活函数。
以上则是整个完整方案详解。需要对网络原理进行了解的请关注后续的更文。
三、总结
作为论文的网络复现,用keras进行验证、创建网络是十分方便的,需要后续的产品输出也有强大的tensorflow做后端,不愁将自己的ideal实现成产品。本文的目的旨在抛砖引玉,实际小编在论文中接触到的网络复杂的多,但是万变不离其宗,后续的不管是更复杂的操作,在keras中表现形式一般就是一个参数的调动,或者就是更新的API函数,只要细读keras文档,都能找到对应功效的网络层操作。此处附上keras的中文文档:https://keras.io/zh/