不可训练参数的定义是什么?

What is the definition of a non-trainable parameter?

模型中不可训练参数的定义是什么?

例如,当你在构建自己的模型时,它的默认值是0,但是当你想使用inception模型时,它变成了其他东西而不是0。这背后的原因是什么?

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

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

您的模型的一个不可训练参数是,例如,隐藏层本身的数量 (2)。其他可能是每个隐藏层上的节点(在本例中为 500),甚至是每个单独层上的节点,每层给你一个参数加上层本身的数量。

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

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

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

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

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

  • 您选择在训练时保持不变的那些。这意味着 keras 根本不会在训练期间更新这些权重。
  • 那些像 BatchNormalization 层中的统计数据一样工作的。它们用均值和方差更新,但不是 "trained with backpropagation"。

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

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

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

当你让它们不可训练时,算法将不再更新这些权重。这很有用,例如,当您想要一个具有特定过滤器(例如 Sobel 过滤器)的卷积层时。你不希望训练改变这个操作,所以这些 weights/filters 应该保持不变。

还有很多其他原因可能会让您无法训练权重。


更改参数:

为了决定权重是否可训练,您从模型中提取层并设置 trainable:

model.get_layer(layerName).trainable = False #or True

这必须在编译之前完成。

很明显,如果你冻结网络的任何一层。该冻结层上的所有参数都变为不可训练。另一方面,如果您从头开始设计网络,它也可能有一些不可训练的参数。例如 batchnormalization 层有 4 个参数,它们是;

[gamma weights, beta weights, moving_mean, moving_variance]

前两个是可训练的,但后两个不是。因此,批归一化层很可能是您的自定义网络具有不可训练参数的原因。

有一些其他答案没有涉及的细节。

在 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 标志的影响。