您能否为我和需要了解模型中不可训练的参数定义的人澄清?
例如,在构建自己的模型时,默认值为0,但是当您想要使用初始模型时,它会成为别的而不是0.它背后的原因是什么?
非常感谢您提前澄清。
答案 0 :(得分:14)
在keras中,不可训练的参数(如model.summary()
所示)表示在训练期间未使用反向传播更新的权重数。
主要有两种类型的非训练重量:
权重是网络内执行操作的值,可以调整以产生我们想要的结果。反向传播算法在最后将权重改变为较低的误差。
默认情况下,keras模型中的所有权重都是可训练的。
当你创建图层时,它会在内部创建自己的权重,并且可以训练它们。 (反向传播算法将更新这些权重)
当你使它们无法处理时,算法将不再更新这些权重。例如,当您需要具有特定滤波器的卷积层(例如Sobel滤波器)时,这很有用。您不希望培训改变此操作,因此这些权重/过滤器应保持不变。
还有很多其他原因可能会让你的体重变得无法控制。
更改参数:
为了确定权重是否可训练,您可以从模型中获取图层并设置trainable
:
model.get_layer(layerName).trainable = False #or True
这必须在编译之前完成。
答案 1 :(得分:12)
不可训练的参数是一个相当广泛的主题。一个简单的例子是考虑任何特定NN模型及其架构的情况。
假设我们已经在Keras中设置了您的网络定义,您的架构就像256->500->500->1
。根据这个定义,我们似乎有一个回归模型(一个输出),有两个隐藏层(每个500个节点)和256个输入。
模型的一个不可训练的参数是,例如,隐藏层本身的数量(2)。其他可能是每个隐藏层上的节点(本例中为500),甚至是每个单独层上的节点,每层给出一个参数加上层数本身。
这些参数是"不可训练的"因为你不能用你的训练数据来优化它的价值。训练算法(如反向传播)将优化和更新网络的权重,这是这里的实际可训练参数(通常为几千,取决于您的连接)。您的训练数据不能帮助您确定那些不可训练的参数。
然而,这并不意味着numberHiddenLayers
根本不可训练,它只意味着在此模型及其实施中我们无法做到所以。 我们可以numberHiddenLayers
可训练;最简单的方法是定义另一个ML算法,它将此模型作为输入并使用多个值numberHiddenLayers
训练它。使用优于其他模型的模型获得最佳值,从而优化numberHiddenLayers
变量。
换句话说,模型的不可训练参数是那些在训练期间不会更新和优化的参数,必须先定义先验,或作为输入传递。
答案 2 :(得分:4)
有些细节是其他答案无法涵盖的。
在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
标志的影响。>
答案 3 :(得分:1)
很明显,如果冻结网络的任何层。该冻结层上的所有参数都变为不可训练。另一方面,如果您是从头开始设计网络的,则它可能还会有一些不可训练的参数。例如,batchnormalization层有4个参数;
[gamma weights, beta weights, moving_mean, moving_variance]
其中前两个是可训练的,但后两个不是。因此,批处理规范化层极有可能是您的自定义网络具有不可训练的参数的原因。
答案 4 :(得分:-1)
在我们定义的每个模型中,都有参数,然后有超参数。参数主要由权重和偏差组成,而超参数则由滤波器数量,滤波器大小,辍学率,学习率等组成。
回到您的问题,在模型中,我们训练各层以减少损耗并优化参数,并使超参数保持恒定。因此,在进行反向传播时,如果我们应用梯度下降或其他优化算法,则会在每个反向传播步骤之后更新权重和偏差。
简单来说,可训练参数在训练时会得到优化,而不可训练参数不会在训练时得到优化。