LeNet5
LeNet5可以说是最早的卷积神经网络了,它发表于1998年,论文原文Gradient-Based Learning Applied to Doucment Recognition作者是Yann Le Cun等。下面对LeNet5网络架构进行简单的说明,有兴趣的同学可以去参考原文,论文原文地址 http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf。
Conv1: f=[5,5], s=[1,1], padding=’valid’
Pool1: f=[2,2], s=[2,2]
Conv2: f=[5,5], s=[1,1], padding=’valid’
Pool2: f=[2,2], s=[1,1]
fc1: 1024 relu
fc2: 200 relu
fc3: 6 softMax
(m,64,64,3)-(m,60,60,8)-(m,30,30,8)-(m,26,26,16)-(m,13,13,16)
(m,1024)-(m,200)-(m,6)
def LeNet5(input_shape=(64,64,3), classes=6):X_input = Input(input_shape)X = Conv2D(filters=8, kernel_size=(5,5), strides=(1,1), padding='valid',name='conv1')(X_input)X = MaxPooling2D((2,2), strides=(2,2), name='maxpool1')(X)X = Conv2D(filters=16, kernel_size=(5,5), strides=(1,1), padding='valid',name='conv2')(X)X = MaxPooling2D((2,2), strides=(2,2), name='maxpool2')(X)X = Flatten()(X)X = Dense(1024, activation='relu', name='fc1')(X)X = Dense(200, activation='relu', name='fc2')(X)X = Dense(classes, activation='softmax', name='fc3')(X)model = Model(inputs=X_input, outputs=X, name='LeNet5')return model
卷积神经网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入与输出之间的精确的数学表达式,只要用已知的模式对卷积神经网络加以训练,网络就具有输入与输出之间的映射能力。卷积网络是有监督学习,所以它的样本集都形如:(输入向量,理想输出向量)之类的向量对构成。
在训练之前,所有权值都用一些不同的小随机数进行初始化,小的随机数可以保证网络不会因权值太大而进入饱和状态,从而导致训练失败。不同则保证网络可以正常学习。
如果要是用相同的数去初始化矩阵,网络会没有学习的能力。
网络的训练过程为:
分为四步:
(1) 在一批数据中取样(Sample a batch of data)
(2)前向过程计算得到损失(Forward prop it through the graph, get loss)
(3)反向传播计算梯度(Backprop to calculate the gradient)
(4)利用梯度进行梯度的更新(Updata the parameters using the gradient)
这里,网络的训练主要分为2个大的阶段:
第一阶段,向前传播阶段:
1)从样本集中取一个样本(X,Yp),将X输入网络;
2)计算相应的实际输出Op。
在此阶段,信息从输入层经过逐级的变换,传送到输出层。这个过程也是网络在完成训练后正常运行时执行的过程。在此过程中,网络执行的是计算(实际上就是输入与每层的权值矩阵相点乘,得到最后的输出结果):
Op=Fn(…(F2(F1(XpW(1))W(2))…)W(n))
第二阶段,向后传播阶段
1)算实际输出Op与相应的理想输出Yp的差;
2)按极小化误差的方法反向传播调整权矩阵。
AlexNet
1、AlexNet网络结构
2、AlexNet应用在手势RGB图片
网络结构
Input (64,64,3)Conv1 f=[5,5], s=[1,1], (60,60,8) Relu1
Maxpool1 f=[2,2], s=[2,2], (30,30,8) LRN1Conv2 f=[5,5] , s=[1,1] , (26,26,16) Relu2
Maxpool2 f=[2,2], s=[2,2], (13,13,16) LRN2Conv3 f=[3,3], s=[1,1], padding=’same’, (13,13,32) Relu3Conv4 f=[3,3], s=[1,1], padding=’same’, (13,13,32) Relu4Conv5 f=[3,3], s=[1,1], padding=’same’, (13,13,16) Relu5
Avepool1 f=[3,3], s=[2,2], (6,6,16)Flatten 6*6*16Fc1 1024 Relu6 Dropout1Fc2 1024 Relu7 Dropout2Fc3 6 Softmax
代码实现
def AlexNet(input_shape=(64,64,3), classes=6):X_input = Input(input_shape)"conv layer 1"X = Conv2D(filters=8, kernel_size=(5,5), strides=(1,1), padding='valid',name='conv1')(X_input)X = Activation('relu')(X)X = MaxPooling2D((2,2), strides=(2,2), name='maxpool1')(X)# X = LRN2D(alpha=0.0001, beta=0.75)(X)"conv layer 2"X = Conv2D(filters=16, kernel_size=(5,5), strides=(1,1), padding='valid',name='conv2')(X)X = Activation('relu')(X)X = MaxPooling2D((2,2), strides=(2,2), name='maxpool2')(X)# X = LRN2D(alpha=0.0001, beta=0.75)(X)"conv layer 3"X = Conv2D(filters=32, kernel_size=(3,3), strides=(1,1), padding='same',name='conv3')(X)X = Activation('relu')(X)"conv layer 4"X = Conv2D(filters=32, kernel_size=(3,3), strides=(1,1), padding='same',name='conv4')(X)X = Activation('relu')(X)"conv layer 5"X = Conv2D(filters=16, kernel_size=(3,3), strides=(1,1), padding='same',name='conv5')(X)X = Activation('relu')(X)X = AveragePooling2D((3,3), strides=(2,2), name='maxpool3')(X)"flatten, fc1, fc2, fc3"X = Flatten()(X)X = Dense(1024, activation='relu', name='fc1')(X)X = Dense(1024, activation='relu', name='fc2')(X)X = Dense(classes, activation='softmax', name='fc3')(X)model = Model(inputs=X_input, outputs=X, name='AlexNet')return model