参考这篇文章。
-
全连接层的参数计算方法,可训练
Dense_paremeters_num = (输入数据的维度+1)* 本层神经元个数
+1是因为线性计算公式里有个偏置项。每个filter提取的结果求和后加偏置项,然后送入激活函数。求和部分类似线性回归公式。 -
卷积层的参数计算方法,可训练
Conv_parameters_num = (卷积核长核宽输入通道数+1) * 本层卷积核数目 -
Non-trainable params的理解,非训练参数指的是不用梯度下降法来训练的参数。
-
BatchNormalization中的训练参数计算方法,【注释1】
Non-trainable_params = 输入通道数 * 2 # μ和σ不是
Trainable_params = 输入通道数 * 2 # γ和β是可训练参 -
实验:
- 可训练参数打印
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras import layers
model = Sequential()
model.add(layers.Dense(7, activation='relu', input_shape=(8,)))
model.add(layers.Dense(13, activation='relu'))
model.add(layers.Dense(5, activation='relu'))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=["accuracy"])
model.summary()
model = Sequential()
model.add(layers.Conv2D(16, (3,3), activation="relu", input_shape=(8,8,3)))
model.add(layers.Conv2D(32, (2,2), activation="relu"))
model.add(layers.MaxPool2D(pool_size=(2, 2), strides=2))
model.add(layers.Dropout(0.25))
model.add(layers.Flatten())
model.add(layers.Dense(128, activation="relu"))
model.add(layers.Dropout(0.25))
model.add(layers.Dense(16, activation="softmax"))
model.summary()
2. 不可训练参数学习。
from keras.layers import Dense
from keras.models import Sequential
model = Sequential()
model.add(Dense(10, trainable=False, input_shape=(100,)))
model.summary()
不可训练参数也受每层的trainable参数影响
model = Sequential()
model.add(Dense(10, trainable=False, input_shape=(100,)))
model.layers[0].trainable = True
model.summary()
3. 并不是所有参数都可以训练,BatchNormalization里的均值和方差不可以训练。[gamma weights, beta weights, moving_mean, moving_variance]前两个可以训练。
所以,BatchNormalizatin每层会产生2N个不可训练参数,N是输入通道数。
model = Sequential()
model.add(Dense(10, trainable=False, input_shape=(100,)))
model.layers[0].trainable = True
model.add(BatchNormalization())
model.summary()
注释1:批正规化的流程图描述。
图片来自bath normalization的详细描述