不可训练参数的定义是什么?
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
标志的影响。
模型中不可训练参数的定义是什么?
例如,当你在构建自己的模型时,它的默认值是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
标志的影响。