卷积神经网络CNN
Posted liuyunfeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了卷积神经网络CNN相关的知识,希望对你有一定的参考价值。
基本概念
- 卷积运算
- 定义:$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的主要内容,如果未能解决你的问题,请参考以下文章
基于卷积神经网络CNN的水果分类预测,卷积神经网络水果等级识别