tf.keras中的Param计算详解

简单神经网络的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 =填充数

卷积层
基本公式(向上取整)

\[O=\frac{I-K+2P}S+1 \]

padding='same'时:

卷积后的图片尺寸和原尺寸一样,故P值将随着输入,输出,S,K共同决定。

此时:O = I,基本公式不变

padding='valid'时:

P = 0

\[O=\frac{I-K}S+1 \]

池化层
基本公式(向下取整)

\[O=\frac{I-Kp}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
第六层:全连接层,与自定义神经元个数相同
第七层:全连接层,与自定义神经元个数相同

上一篇:添加Silverlight应用到HTML


下一篇:Silverlight 使用DataContractJsonSerializer序列化与反序列化 Json