什么是模型中的非训练参数?
例如,在构建自己的模型时,默认情况下其值为0,但当您想使用Inception模型时,它会变成除0之外的其他值。这背后的原因是什么?
什么是模型中的非训练参数?
例如,在构建自己的模型时,默认情况下其值为0,但当您想使用Inception模型时,它会变成除0之外的其他值。这背后的原因是什么?
model.summary()
所示)是指在反向传播训练期间不会更新的权重数量。trainable
。model.get_layer(layerName).trainable = False #or True
编译之前必须完成此操作。
其他答案中没有涵盖的一些细节。
在Keras中,不可训练参数是不使用梯度下降进行训练的参数。这也由每个层中的trainable
参数控制,例如:
from keras.layers import *
from keras.models import *
model = Sequential()
model.add(Dense(10, trainable=False, input_shape=(100,)))
model.summary()
这将打印零个可训练参数和1010个不可训练参数。
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (None, 10) 1010
=================================================================
Total params: 1,010
Trainable params: 0
Non-trainable params: 1,010
_________________________________________________________________
现在,如果你使用 model.layers[0].trainable = True
将该层设置为可训练,那么它将打印出:_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (None, 10) 1010
=================================================================
Total params: 1,010
Trainable params: 1,010
Non-trainable params: 0
_________________________________________________________________
现在所有参数都可训练,且没有不可训练的参数。但也有一些层既有可训练的参数又有不可训练的参数,例如BatchNormalization
层,在测试时存储激活的均值和标准差。一个例子:
model.add(BatchNormalization())
model.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (None, 10) 1010
_________________________________________________________________
batch_normalization_1 (Batch (None, 10) 40
=================================================================
Total params: 1,050
Trainable params: 1,030
Non-trainable params: 20
_________________________________________________________________
这种特定情况下的BatchNormalization总共有40个参数,其中20个可训练,另外20个不可训练。这20个不可训练的参数对应于用于测试期间的激活计算平均值和标准差,并且这些参数永远不会使用梯度下降进行训练,也不受trainable
标志的影响。
非可训练参数是一个非常广泛的主题。一个简单的例子是考虑任何特定的NN模型及其架构。
假设我们已经在Keras中设置好了您的网络定义,您的架构类似于256->500->500->1
。基于这个定义,我们似乎有一个回归模型(一个输出)和两个隐藏层(每个隐藏层有500个节点),输入为256。
您的模型中的一个非可训练参数是,例如,隐藏层数量本身(2)。其他可能是每个隐藏层的节点数(在这种情况下为500),甚至是每个单独层的节点数,使您每层有一个参数加上层数本身。
这些参数是“不可训练”的,因为您无法优化其值与您的训练数据。训练算法(如反向传播)将优化和更新您的网络的权重,这些实际上是可训练参数(通常数千个,具体取决于您的连接)。您的训练数据不能帮助您确定这些不可训练参数。
但是,这并不意味着numberHiddenLayers
根本不可训练,这只意味着在这个模型及其实现中我们无法这样做。 我们可以使numberHiddenLayers
可训练;最简单的方法是定义另一个ML算法,它以这个模型作为输入,并用numberHiddenLayers
的多个值来对其进行训练。 最好的值是通过表现优于其他模型的模型获得的,从而优化了numberHiddenLayers
变量。
换句话说,模型的非可训练参数是在训练过程中不会更新和优化的那些参数,并且必须在先验或作为输入时确定。