码迷,mamicode.com
首页 > 其他好文 > 详细

卷积神经网络CNN

时间:2018-07-22 14:02:56      阅读:369      评论:0      收藏:0      [点我收藏+]

标签:激活   vat   app   函数   线性   模型   axis   对象   初始化   

基本概念

  • 卷积运算
    • 定义:$f_k(i,j)=\sum_{m,n}g_k(i-m,j-n)h_k(m,n),y_l=\sum_kw_{lk}f_k$
    • 稀疏交互(sparse interactions):核的大小远小于输入的大小
    • 参数共享(parameter sharing):平移不变、深度线性叠加。特别在1*1核的时候,为深度的线性变换。
    • 等变表示(equivariant representations)。
    • 卷积提供了一种处理大小可变的输入的方法。
  • 池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。
  • 卷积、从输出到权重的反向传播和从输出到输入的反向传播 ——对于训练任意深度的前馈卷积网络,以及训练带有(基于卷积的转置的)重构 函数的卷积网络,这三种运算都足以计算它们所需的所有梯度。
  • 可以用于输出高维的结构化对象
  • 有三种基本策略可以不通过监督训练而得到卷积核。
    • 随机初始化、手动设计、无监督学习。

几种典型结构

lenet-5

使用卷积、池化、非线性映射(tanh或者sigmoid)。

model = Sequential()
model.add(Conv2D(filters=6, kernel_size=(5,5), padding=‘valid‘, input_shape=(1,28,28), activation=‘tanh‘))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(filters=16, kernel_size=(5,5), padding=‘valid‘, activation=‘tanh‘))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(120, activation=‘tanh‘))
model.add(Dense(84, activation=‘tanh‘))
model.add(Dense(10, activation=‘softmax‘))

alexnet

  • 引入了Relu激活函数。

  • 使用了Dropout。

  • 加强了训练机制:使用了GPU,进行了数据增强。

model = Sequential()  
model.add(Conv2D(96,(11,11),strides=(4,4),input_shape=(227,227,3),padding=valid,activation=relu,kernel_initializer=uniform))  
model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2)))  
model.add(Conv2D(256,(5,5),strides=(1,1),padding=same,activation=relu,kernel_initializer=uniform))  
model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2)))  
model.add(Conv2D(384,(3,3),strides=(1,1),padding=same,activation=relu,kernel_initializer=uniform))  
model.add(Conv2D(384,(3,3),strides=(1,1),padding=same,activation=relu,kernel_initializer=uniform))  
model.add(Conv2D(256,(3,3),strides=(1,1),padding=same,activation=relu,kernel_initializer=uniform))  
model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2)))  
model.add(Flatten())  
model.add(Dense(4096,activation=relu))  
model.add(Dropout(0.5))  
model.add(Dense(4096,activation=relu))  
model.add(Dropout(0.5))  
model.add(Dense(1000,activation=softmax)) 

vgg13

  • 训练:对图片进行多尺度缩放、迁移学习
model = Sequential()  
model.add(Conv2D(64,(3,3),strides=(1,1),input_shape=(224,224,3),padding=same,activation=relu,kernel_initializer=uniform))  
model.add(Conv2D(64,(3,3),strides=(1,1),padding=same,activation=relu,kernel_initializer=uniform))  
model.add(MaxPooling2D(pool_size=(2,2)))  
model.add(Conv2D(128,(3,2),strides=(1,1),padding=same,activation=relu,kernel_initializer=uniform))  
model.add(Conv2D(128,(3,3),strides=(1,1),padding=same,activation=relu,kernel_initializer=uniform))  
model.add(MaxPooling2D(pool_size=(2,2)))  
model.add(Conv2D(256,(3,3),strides=(1,1),padding=same,activation=relu,kernel_initializer=uniform))  
model.add(Conv2D(256,(3,3),strides=(1,1),padding=same,activation=relu,kernel_initializer=uniform))  
model.add(MaxPooling2D(pool_size=(2,2)))  
model.add(Conv2D(512,(3,3),strides=(1,1),padding=same,activation=relu,kernel_initializer=uniform))  
model.add(Conv2D(512,(3,3),strides=(1,1),padding=same,activation=relu,kernel_initializer=uniform))  
model.add(MaxPooling2D(pool_size=(2,2)))  
model.add(Conv2D(512,(3,3),strides=(1,1),padding=same,activation=relu,kernel_initializer=uniform))  
model.add(Conv2D(512,(3,3),strides=(1,1),padding=same,activation=relu,kernel_initializer=uniform))  
model.add(MaxPooling2D(pool_size=(2,2)))  
model.add(Flatten())  
model.add(Dense(4096,activation=relu))  
model.add(Dropout(0.5))  
model.add(Dense(4096,activation=relu))  
model.add(Dropout(0.5))  
model.add(Dense(1000,activation=softmax)) 

inception

  • 在结构上考虑多尺度
 def Conv2d_BN(x, nb_filter,kernel_size, padding=same,strides=(1,1),name=None):  
    if name is not None:  
        bn_name = name + _bn  
        conv_name = name + _conv  
    else:  
        bn_name = None  
        conv_name = None    
    x = Conv2D(nb_filter,kernel_size,padding=padding,strides=strides,activation=relu,name=conv_name)(x)  
    x = BatchNormalization(axis=3,name=bn_name)(x)  
    return x  
  
def Inception(x,nb_filter):  
    branch1x1 = Conv2d_BN(x,nb_filter,(1,1), padding=same,strides=(1,1),name=None)  
  
    branch3x3 = Conv2d_BN(x,nb_filter,(1,1), padding=same,strides=(1,1),name=None)  
    branch3x3 = Conv2d_BN(branch3x3,nb_filter,(3,3), padding=same,strides=(1,1),name=None)  
  
    branch5x5 = Conv2d_BN(x,nb_filter,(1,1), padding=same,strides=(1,1),name=None)  
    branch5x5 = Conv2d_BN(branch5x5,nb_filter,(1,1), padding=same,strides=(1,1),name=None)  
  
    branchpool = MaxPooling2D(pool_size=(3,3),strides=(1,1),padding=same)(x)  
    branchpool = Conv2d_BN(branchpool,nb_filter,(1,1),padding=same,strides=(1,1),name=None)  
  
    x = concatenate([branch1x1,branch3x3,branch5x5,branchpool],axis=3)  
  
    return x 

resnet

  • 为较深层次设置快速通道,提高梯度传播的有效性
 def Conv_Block(inpt,nb_filter,kernel_size,strides=(1,1), with_conv_shortcut=False):  
    x = Conv2d_BN(inpt,nb_filter=nb_filter,kernel_size=kernel_size,strides=strides,padding=same)  
    x = Conv2d_BN(x, nb_filter=nb_filter, kernel_size=kernel_size,padding=same)  
    if with_conv_shortcut:  
        shortcut = Conv2d_BN(inpt,nb_filter=nb_filter,strides=strides,kernel_size=kernel_size)  
        x = add([x,shortcut])  
        return x  
    else:  
        x = add([x,inpt])  
        return x  

参考文献

  • Deep learning, www.deeplearning.net
  • Yann LeCun, Gradient-Based Learning Applied to Document Recognition, http://http//vision.stanford.edu/cs598_spring07/papers/Lecun98.pdf
  • keras实现常用深度学习模型LeNet,AlexNet,ZFNet,VGGNet,GoogleNet,Resnet, https://blog.csdn.net/wang1127248268/article/details/77258055

卷积神经网络CNN

标签:激活   vat   app   函数   线性   模型   axis   对象   初始化   

原文地址:https://www.cnblogs.com/liuyunfeng/p/9349682.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!