LeNet-5

一:贡献&缺点

贡献:

提出卷积神经网络概念,应用:
‘权值共享’ ,’局部感受野‘,‘池化(下采用)’ 
解决了图像作为输入数据的问题:
‘数据量大,参数多,图像局部相关性,图像形变引起的位置变化’

缺点:

 (1)采用average_pooling,现在主要用max_pooling。
(2)用tanh作为激活函数,现在主要是relu,因为relu收敛更快。
(3)没有用padding技术,图片边缘信息的处理不足。
(4)没用dropout技术。
(5)模型小,学习特征少,无法处理大型复杂数据。

二:网络架构

在这里插入图片描述

C1: Convolution Layer

Input 图片是一张尺寸是32X32的图片,该层用6个卷积核产生了6张2828尺寸的特征图;
(W - F + 2
P)/ S + 1 = 28,这里的padding(P)为0,stride(S)为1。

trainable parameters: (5*5 + 1) * 6 = 156 ;
6个滤波器产生了6个特征图(FeatureMap),滤波器大小(filer size)是5X5,每个滤波器有1个偏置(bias)

connections:156 * 28*28 = 122304 ;
每个特征图尺寸是28X28

S2: Average_pooling Layer

输入是上一层的6张28X28的特征图,采用2X2的平均池化单元,P=0,S=2,得到了6张14X14的特征图。

trainable parameters: (1 + 1) * 6 = 12 ;
括号中第一个1是权重,第二个1是偏置。

connections:(22 +1) 6 * 14*14 = 5580

C3:Convolution Layer

在这里插入图片描述
经过这一层得到了16个10X10的特征图,(0,1,2,3,4,5)号特征图的输入是S2的三个相邻的特征图;(6,7,8,9,10,11)号特征图的输入是S2的四个相邻的特征图;(12,13,14)号输入数据是S2间断的四个特征图;最后一个15号特征图的输入是S2全部6个特征图。详细见上图。

如此选择输入的理由:1,非全连接保持连接数量在合理弹性范围;2,打破了网络的对称性。

trainable parameters
6 * (553 + 1) + 6 * (554 + 1) + 3 * (554 + 1) + 1*(556 + 1)=1516

connections:15161010 = 151600

S4:Average_Pooling Layer

这层输入上层16个10X10的特征图,采用2X2池化单位,P=0,S=2,得到了16个5X5的特征图。

trainable parameters:(1+1) * 16 = 32

connections: (22 +1) * 16 * 55 = 2000

C5:Fully Connected Convolutional Layer

因为S4的输出尺寸为5X5,与C5卷积核尺寸一样,则卷积后每个特征图的尺寸为1X1,故这里可以理解为一个连接层;又卷积核个数为120,所以输出为12011。

trainable parameters:(5 * 5 * 16 + 1) * 120 = 48120

connections: (5 * 5 * 16 + 1) * 120 * 1 * 1 = 48120

F6: Fully Connected Layer

包含84个神经元(为输出层而设计的),也是就是说这一层输出为84。
输入为上一层的120个神经元。

trainable parameters:(120 + 1)* 84 = 10164

connections: 120 + 1)* 84 = 10164

Ouput Layer

包含10个神经元,也是就是说这一层输出为10。

trainable parameters:84 * 10 = 840

connections: 84 * 10 = 840

综上:

  1. LeNet5 共有约6万(60790)个参数;
  2. 七层卷积神经网络,三个(或两个)卷积层,两个池化层,一个(或两个)全连接层,一个输出层;
  3. 卷积层使用的核尺寸为5X5;
  4. 随着网络越来越深,图像在缩小。

三:keras实现

from keras import layers,models
from keras.utils import to_categorical
from keras.datasets import mnist
from keras.utils import np_utils

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

# Step 1: Import dataset and Preprocessing
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# print('x_train.shape: ', x_train.shape,'\n')  -> (60000, 28, 28)
# print('y_train.shape: ', y_train.shape,'\n') ->  (60000,)
# print('x_test.shape: ', x_test.shape,'\n')   ->  (10000, 28, 28)
# print('y_test.shape: ', y_test.shape,'\n')  ->   (10000,)

# from uint8 to float32 , Normalize value to [0,1]
x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255

# Reshape the image_data into 4D array
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)

# Transform lables to one-hot encoding
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

# Step 2:Define LeNet-5 Model
model = models.Sequential()

# C1 Convolution Layer
model.add(layers.Conv2D(filters=6, kernel_size=(5,5),strides=(1,1), padding='same', activation='tanh', input_shape=(28,28,1)))

# S2 Average_Pooling Layer
model.add(layers.AveragePooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))

# C3 Convolution Layer
model.add(layers.Conv2D(filters=16, kernel_size=(5,5), strides=(1,1), padding='valid', activation='tanh'))

# S4 Average_Pooling Layer
model.add(layers.AveragePooling2D(pool_size=(2,2), strides=(2,2),padding='valid'))

# C5 Fully Connected Convolutional Layer
model.add(layers.Conv2D(filters=120, kernel_size=(5,5), strides=(1,1), padding='valid',activation='tanh'))
#Flatten the CNN output so that we can connect it with fully connected layers
model.add(layers.Flatten())

# F7 Fully Connected Layer
model.add(layers.Dense(84, activation='tanh'))

# Output Layer
model.add(layers.Dense(10, activation='softmax'))

# Step 3: Compile the model
model.compile(optimizer='SGD',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# Step 4: Training the model and the Results
model.fit(x_train, y_train, batch_size=128, epochs=5)

test_loss, test_acc = model.evaluate(x_test, y_test)

print('\nThe accuracy of the LeNet5 model: {:.4f}'.format(test_acc))

# model.summary()
#
# print('\ny_train',y_train.shape)





在这里插入图片描述

参考文献:
csdn1
博客园1
csdn2
engmrk

发布了9 篇原创文章 · 获赞 3 · 访问量 384
App 阅读领勋章
微信扫码 下载APP
阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览