神经网络在深度学习过程中每层训练的网络参数容量数量计算推导

AI:神经网络在深度学习过程中每层训练的网络参数容量数量计算推导,Python

在深度学习的卷积神经网络中,训练的参数的计算公式为:

公式1:

计算每一层神经网络在深度学习过程中的训练参数个数的常规公式2为:

total_params_count = (filter_height * filter_width * input_channels + 1) * number_of_filters

下面介绍具体的神经网络在深度学习过程中,训练参数的详细产生。


案例1

假设现在有一个3X3的1维(输入通道为1)特征图输入(也即意味着该特征图相当于一张灰度图),然后由3个卷积核(过滤器、滤波器),每一个卷积核尺寸为2X2。输出3个通道特征图。神经网络训练的参数个数示意图为:

该层神经网络训练的参数个数即为:

(2*2+1)*3=15

总计15个参数, 这15个参数里面,其中12个为权重值(weights),3个偏差(biases)。


案例2

对于像普通常见的RGB彩色图片,具有3通道(R,G,B)。如果每一个输入特征图都有一个滤波器(卷积核)。产生的卷积按元素添加,并且向每个元素添加偏差项。 形成具有1个特征图的输出。

神经网络训练的参数个数计算:

4*3+1=13

总计13个参数,其中12个是权重,1个是偏差。  


案例3

假设每1个输入特征图都分别有3个滤波器(以紫色,黄色,青色分别表示)。产生的卷积按元素添加,并且向每个元素添加偏差项。现在有2个特征图,最终输出3个特征图。

输入2个的特征图,最终输出3个特征图(意味着有3个偏差)。神经网络训练的参数个数为27,其中24个为权重,3个为偏差。


Python代码验证

建立神经网络,堆叠几层:

from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from keras.models import Sequential

if __name__ == "__main__":
    model = Sequential()

    model.add(Conv2D(filters=32,
                     kernel_size=(3, 3),
                     input_shape=(150, 150, 3),
                     activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Conv2D(filters=64,
                     kernel_size=(3, 3),
                     activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Conv2D(filters=128,
                     kernel_size=(3, 3),
                     activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Conv2D(filters=128,
                     kernel_size=(3, 3),
                     activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Flatten())

    model.add(Dense(units=512, activation='relu'))
    model.add(Dense(units=1, activation='sigmoid'))

    print(model.summary())

输出:

Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 148, 148, 32)      896       
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 74, 74, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 72, 72, 64)        18496     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 36, 36, 64)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 34, 34, 128)       73856     
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 17, 17, 128)       0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 15, 15, 128)       147584    
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 7, 7, 128)         0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 6272)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 512)               3211776   
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 513       
=================================================================
Total params: 3,453,121
Trainable params: 3,453,121
Non-trainable params: 0
_________________________________________________________________
None

(1)经过max_pooling2d_1最大池化层处理后,上一层的3维输入被max_pooling2d_1处理后输出为32维(通道)的高维特征图,因此在conv2d_2层的参数个数为:

(3*3*32+1)* 64 = 18496

(2)flatten层是将训练参数展开放平成一维特征图。所以flatten_1层的参数个数就是:

7*7*128=6272

(3)dense层,相当于是1维的特征图,再加1个biases。所以dense_1层训练的参数个数为:

(6272+1)*512=3211776

(4)dense_2层,是前一层的输出特征图(512+1)*1=513个训练参数。

(5)最大池化层不需要训练参数,故参数个数为0。

发布了1029 篇原创文章 · 获赞 987 · 访问量 336万+

猜你喜欢

转载自blog.csdn.net/zhangphil/article/details/103410610