简单神经网络的Param计算
搭建用于MNIST的简单神经网络
代码如下:
model = keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(28,28)))
model.add(keras.layers.Dense(512, activation='relu'))
model.add(keras.layers.Dense(256, activation='relu'))
model.add(keras.layers.Dense(128, activation='relu'))
model.add(keras.layers.Dense(10, activation='softmax'))
参数输出如下:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten (Flatten) (None, 784) 0
_________________________________________________________________
dense (Dense) (None, 512) 401920
_________________________________________________________________
dense_1 (Dense) (None, 256) 131328
_________________________________________________________________
dense_2 (Dense) (None, 128) 32896
_________________________________________________________________
dense_3 (Dense) (None, 10) 1290
=================================================================
Total params: 567,434
Trainable params: 567,434
Non-trainable params: 0
该网络由Flatten作为输入层,主要作用是将二维数据“压平”为一维数据,即28*28--->> 1*784。其余四层为Dense层,除去输出层采用softmax为激活函数外,其他层均采用relu激活函数。
其参数的计算如下:
Param = (输入数据的Feature个数+1)*神经元的个数
+1操作,是因为每个神经元都有一个bias偏置
第一层:Flatten层由于只是将二维数据展平为一维的,不涉及参数
第二层:(784+1)*512=401920 经过第二层处理后,产生512个Feature
第三层:(512+1)*256=131328 经过第二层处理后,产生256个Feature
第四层:(256+1)*128=32896 经过第二层处理后,产生128个Feature
第五层:(128+1)*10=1290 经过第二层处理后,产生10个Feature
含卷积层的Param计算
搭建简单含有2个卷积2个池化层2了全连接层的卷积神经网络
代码如下:
model = keras.Sequential()
model.add(
keras.layers.Conv2D(
filters=512,
kernel_size=(5, 5),
strides=(1, 1),
padding='same',
activation='relu',
input_shape=(128, 128, 3),
name="Conv_1"))
model.add(keras.layers.MaxPool2D(pool_size=(3, 3), strides=(2, 2), name="Pool_1"))
model.add(
keras.layers.Conv2D(
filters=256,
kernel_size=(3, 3),
strides=(2, 2),
padding='valid',
activation='relu',
name="Conv_2"))
model.add(keras.layers.MaxPool2D(pool_size=(3, 3), strides=(2, 2), name="Pool_2"))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(units=128, activation="relu", name="Dense_1"))
model.add(keras.layers.Dense(units=10, activation="softmax", name="Dense_2"))
model.summary()
参数输出如下:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
Conv_1 (Conv2D) (None, 128, 128, 512) 38912
_________________________________________________________________
Pool_1 (MaxPooling2D) (None, 63, 63, 512) 0
_________________________________________________________________
Conv_2 (Conv2D) (None, 31, 31, 256) 1179904
_________________________________________________________________
Pool_2 (MaxPooling2D) (None, 15, 15, 256) 0
_________________________________________________________________
flatten (Flatten) (None, 57600) 0
_________________________________________________________________
Dense_1 (Dense) (None, 128) 7372928
_________________________________________________________________
Dense_2 (Dense) (None, 10) 1290
=================================================================
Total params: 8,593,034
Trainable params: 8,593,034
Non-trainable params: 0
计算公式如下:
WC=卷积层的weights数量
BC=卷积层的biases数量
PC=所有参数的数量
K=核尺寸
N=核数量
C =输入图像通道数
\[WC=K^2\ast{C}\ast{N} \] \[BC=N \] \[PC=WC+BC \]第一层:输入图片为128*128*3,RGB图片,共有512个卷积核,每个卷积核为5*5*3,卷积核尺寸为5。因此:第一层卷积层共有参数5^2*3*512+512=38912
第三层:输入为63*63*512, 共有256个卷积核,每个卷积核为3*3*512,卷积核尺寸为3。因此:第三层卷积层共有参数3^2*512*256+256=1179904
其他相关计算:
有关上述卷积网络输出图片大小的计算
计算方法如下:
O=输出图像的尺寸
I=输入图像的尺寸
K=卷积层的核尺寸
Kp=池化层的核尺寸
N=核数量
S=移动步长
P =填充数
卷积层
基本公式(向上取整)
padding='same'时:
卷积后的图片尺寸和原尺寸一样,故P值将随着输入,输出,S,K共同决定。
此时:O = I,基本公式不变
padding='valid'时:
P = 0
\[O=\frac{I-K}S+1 \]池化层
基本公式(向下取整)
第一层:输入图片为128*128*3,RGB图片,共有512个卷积核,每个卷积核为5*5*3,padding='same'。因此:第一层卷积层输出128*128*512
第二层:输入为128*128*512,池化核3*3*512,步长2,因此:\(O=\frac{128-3}2+1\),输出63*63*512
第三层:输入 63*63*512,共有256个卷积核,每个卷积核为3*3*512,padding='valid',滑动步长为2,因此:\(O=\frac{63-3}2+1\),输出31*31*256
第四层:输入31*31*256,池化核3*3*512,步长2,因此:\(O=\frac{31-3}2+1\),输出15*15*256
第五层:展平,15*15*256---->>1*57600
第六层:全连接层,与自定义神经元个数相同
第七层:全连接层,与自定义神经元个数相同