1.论文地址:
http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf
2.LeNet5网络结构:
3.首先了解参数量和计算量之间的区别和计算:
(1)参数量(Params):
参数量是指的网络中可以被学习的变量的数量,包括卷积核的权重weights,批归一化(BatchNormalization)的缩放参数γ,以及偏移系数β,虽然有些没有BatchNormalization层的也可能有偏置项bias,这些参数都是可以被学习的,也就是在训练模型开始被赋予初值,在训练过程当中通过链式法则不断的迭代更新,整个模型的参数量主要由卷积核的权重weights的数量决定,参数量越大,对计算机的运行内存也就越高,对硬件的设备也就要求越高,在同样准确率的情况下参数量的多少是一个网络结构重要的评价指标。
(2)计算量(FLOPS):
神经网络的前向推断过程基本上都是乘累加计算,所以它的计算量也是指前向推断过程中的乘加运行的次数,通常使用FLOPS(Floating Point Operations)表示。计算量越大,在同样条件下运行延时有就越长,尤其是在移动端/嵌入式这种资源受限的平台上想要达到实时性的要求就必须要求模型的计算量尽可能的低,这个还跟算子的密集程度相关。
(3)举例说明:
第一种标准卷积运算: 以上使用两个3x3的卷积对特征图大小为6x6x3进行卷积:K-卷积核大小;Cin-输入通道数;Cout-输出通道数;H-图片高度;W-图片宽度 参数量:(KxKxCinxCout)=333*2=54; 如果这里有偏置bias:(KxKxCin+1)xCout; 计算量:(KxKxCinxHxWxCout)=3x3x3x6x6x2=1944 如果有这里有偏置bias:(KxKxCin+1)xHxWxCout
拓展: depthwise (深度分离卷积)卷积(其中:输入channel等于输出channel) 输入卷积:Win *Hin * Cin 卷积核:k * k 输出卷积:Wout * Hout * Cin 参数量:k * k * Cin 计算量:k * k * Cin * Wout * Hout
以上前置知识出处: https://www.cnblogs.com/hejunlin1992/p/12978988.html
4.网络结构细讲:
(1)首先输入图像(灰度图):
大小:32x32x1
(2)第一层卷积:
采用六个5x5卷积核进行卷积:5x5x6–>28x28x6 Hout=(Hin+2xp-K)/s+1=(32+2x0-5)/1+1=28 Wout=(Win+2xp-K)/s+1=(32+2x0-5)/1+1=28 参数量:(5x5x1+1)x6=156(这里有bias偏置,一个卷积有一个bias) 计算量:(5x5x1+1)x28x28x6=122,304
(3)第二层池化:
这里使用2x2池化单元核进行降采样:2x2–>14x14x6 Hout=(Hin-K)/s+1=(28-2)/2+1=14 Wout=(Win-K)/s+1=(28-2)/2+1=14 参数量:(1+1)x6=12(这里有bias偏置,一个卷积有一个bias) 计算量:(2x2+1)x14x14x6=5880
(4)第三层卷积:
采用16个5x5卷积核进行卷积:5x5x16–>10x10x16 Hout=(Hin+2xp-K)/s+1=(14+2x0-5)/1+1=10 Wout=(Win+2xp-K)/s+1=(14+2x0-5)/1+1=10 参数量:(5x5x3+1)x6 + (5x5x4 +1)x6 + (5x5x4 + 1) x 3 + (5x5x6+1)x1 = 1516(这里有bias偏置,一个卷积有一个bias) 计算量:1516x10x10=151,600
(5)第四池化层:
这里使用2x2池化单元核进行降采样:2x2–>5x5x16 Hout=(Hin-K)/s+1=(10-2)/2+1=5 Wout=(Win-K)/s+1=(10-2)/2+1=5 参数量:(1+1)x16=32(这里有bias偏置,一个卷积有一个bias) 计算量:(2x2+1)x5x5x16=122,304
(6)第一层全连接层:
计算量:(5x5x16+1)x120=48120
(7)第二层全连接层:
计算量:(1x1x120+1)x84=10164
5.Tensorflow2.6.0实现网络结构:
import os
import keras
import numpy as np
from tensorflow.keras import layers
model_LeNet5=keras.Sequential([
#定义输入
layers.InputLayer(input_shape=(32,32,1)),
#卷积层
layers.Conv2D(6,kernel_size=[5,5],strides=[1,1],padding='valid'),
layers.Activation('relu'),
layers.MaxPool2D(pool_size=[2,2]),
layers.Conv2D(16,kernel_size=[5,5],strides=[1,1],padding='valid'),
layers.Activation('relu'),
layers.MaxPool2D(pool_size=[2,2]),
layers.Flatten(),
layers.Dense(120),
layers.Activation('relu'),
layers.Dense(84),
layers.Activation('relu'),
layers.Dense(10),
layers.Activation('softmax')
])
model_LeNet5.summary()
|