"不可训练的参数"是什么意思?

The*_*Who 15 theano deep-learning caffe keras tensorflow

您能否为我和那些需要了解模型中不可训练参数的定义的人澄清?

例如,在构建自己的模型时,默认值为0,但是当您想要使用初始模型时,它会成为别的而不是0.它背后的原因是什么?

非常感谢您提前澄清.

Dan*_*ler 19

在keras中,不可训练的参数(如图所示model.summary())表示在使用反向传播训练期间未更新的权重数.

主要有两种不可训练的重量:

  • 你选择在训练时保持不变的那些.这意味着keras在训练期间不会更新这些权重.
  • 那些像BatchNormalization层中的统计信息一样工作的那些.他们用均值和方差进行更新,但他们没有"用反向传播训练".

权重是执行操作的网络内部的值,可以调整以产生我们想要的结果.反向传播算法在最后将权重改变为较低的误差.

默认情况下,keras模型中的所有权重都是可训练的.

当你创建图层时,它会在内部创建自己的权重,并且它们是可训练的.(反向传播算法将更新这些权重)

当你使它们无法处理时,算法将不再更新这些权重.例如,当您需要具有特定滤波器的卷积层(例如Sobel滤波器)时,这很有用.您不希望训练更改此操作,因此这些权重/过滤器应保持不变.

还有很多其他原因可能导致您无法使重量无法实现.


更改参数:

为了确定权重是否可训练,您可以从模型中获取图层并设置trainable:

model.get_layer(layerName).trainable = False #or True
Run Code Online (Sandbox Code Playgroud)

这必须在编译之前完成.

  • “还有很多其他原因可能导致你想要使举重变得不可训练。”如果你愿意解释一下,这些是什么? (2认同)
  • 例如,您可能有一个“预训练模型”,您知道它运行良好并且您不想更改。您可能正在训练 GAN 并且一次只训练一侧。创意的原因确实有很多,取决于你想要什么。 (2认同)

Dar*_*nus 14

不可训练的参数是相当广泛的主题.一个简单的例子是考虑任何特定NN模型及其架构的情况.

假设我们已经在Keras中设置了您的网络定义,您的架构就像256->500->500->1.根据这个定义,我们似乎有一个回归模型(一个输出),有两个隐藏层(每个500个节点)和256个输入.

例如,模型的一个不可训练的参数是隐藏层本身的数量(2).其他可能是每个隐藏层上节点(在这种情况下为500),甚至是每个单独层上的节点,每层提供一个参数加上层数本身.

这些参数是"不可训练的",因为您无法使用训练数据优化其值.训练算法(如反向传播)将优化和更新网络的权重,这是这里的实际可训练参数(通常为几千,取决于您的连接).您的训练数据无法帮助您确定那些不可训练的参数.

然而,这并不意味着numberHiddenLayers根本不可训练,它只意味着在这个模型及其实现中我们无法这样做.我们可以numberHiddenLayers训练 ; 最简单的方法是定义另一个ML算法,该算法将此模型作为输入并使用多个值进行训练numberHiddenLayers.使用优于其他模型的模型获得最佳值,从而优化numberHiddenLayers变量.

换句话说,模型的不可训练参数是那些在训练期间不会更新和优化的参数,必须先验地定义或作为输入传递.

  • 关于原始问题,我相信“不可训练参数”将是例如在 BatchNorm 层中计算的均值“mu”和标准差“sigma”,而参数“gamma”和“beta”是可训练参数。总而言之:“可训练参数”是根据其梯度(误差/损失/成本相对于参数的导数)修改值的那些参数,而“不可训练参数”是那些值未根据其优化的参数到他们的梯度。 (5认同)
  • 我相信这里会造成混乱……网络拓扑等(学习率,辍学率等)*不是*“不可训练的参数”;他们被称为“超参数”。在训练期间,使用训练集自动优化参数(使用梯度下降)。超参数是手动优化的(使用工程师的大脑),并使用开发集进行评估。 (4认同)

Mat*_*gro 9

还有一些其他答案未涵盖的细节。

在Keras中,不可训练参数是未使用梯度下降训练的参数。这也由trainable每一层中的参数控制,例如:

from keras.layers import *
from keras.models import *
model = Sequential()
model.add(Dense(10, trainable=False, input_shape=(100,)))
model.summary()
Run Code Online (Sandbox Code Playgroud)

这将打印零个可训练参数和1010个不可训练参数。

_________________________________________________________________    
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 10)                1010      
=================================================================
Total params: 1,010
Trainable params: 0
Non-trainable params: 1,010
_________________________________________________________________
Run Code Online (Sandbox Code Playgroud)

现在,如果将图层设置为可训练,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
_________________________________________________________________
Run Code Online (Sandbox Code Playgroud)

现在所有参数都是可训练的,并且不可训练参数为零。但是也有一些层同时具有可训练和不可训练的参数,一个例子是该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
_________________________________________________________________
Run Code Online (Sandbox Code Playgroud)

BatchNormalization的这种特定情况共有40个参数,20个可训练参数和20个不可训练参数。这20个不可训练的参数对应于在测试时间内使用的计算的激活平均值和标准偏差,并且这些参数在使用梯度下降时将永远不可训练,并且不受trainable标记影响。

  • 这实际上是这个问题的正确答案,因为作者问为什么即使您将所有层都设置为可训练,Inception 模型中的某些参数总是“不可训练”。答案是 batchnorm 层的均值/方差参数。 (3认同)