【发布时间】:2018-04-28 23:05:25
【问题描述】:
模型中non-trainable参数的定义是什么?
例如,当您构建自己的模型时,它的默认值是 0,但是当您想使用初始模型时,它会变成其他东西而不是 0。这背后的原因是什么?
【问题讨论】:
标签: tensorflow deep-learning keras theano caffe
模型中non-trainable参数的定义是什么?
例如,当您构建自己的模型时,它的默认值是 0,但是当您想使用初始模型时,它会变成其他东西而不是 0。这背后的原因是什么?
【问题讨论】:
标签: tensorflow deep-learning keras theano caffe
在 keras 中,non-trainable 参数(如model.summary() 所示)是指在反向传播训练期间未更新的权重数。
不可训练的权重主要有两种:
权重是网络内部执行操作的值,可以调整以得到我们想要的结果。反向传播算法最终将权重更改为较低的误差。
默认情况下,keras 模型中的所有权重都是可训练的。
当您创建层时,它会在内部创建自己的权重并且它们是可训练的。 (反向传播算法会更新这些权重)
当您使它们无法训练时,算法将不再更新这些权重。这很有用,例如,当您想要一个具有特定过滤器的卷积层时,例如 Sobel 过滤器。你不希望训练改变这个操作,所以这些权重/过滤器应该保持不变。
还有很多其他原因可能导致您想让重量变得无法训练。
更改参数:
为了决定权重是否可训练,您从模型中获取层并设置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()
这会打印 0 个可训练参数和 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 个),甚至是每个单独层上的节点,每层给你一个参数加上层本身的数量。
这些参数是“不可训练的”,因为您无法使用训练数据优化其值。训练算法(如反向传播)将优化和更新 权重 em> ,它们是此处实际可训练的参数(通常为数千,取决于您的连接)。您的训练数据无法帮助您确定那些不可训练的参数。
然而,这并不意味着numberHiddenLayers 根本不可训练,它只是意味着在这个模型 及其实现中我们无法这样做。 我们可以让numberHiddenLayers 可训练;最简单的方法是定义另一种 ML 算法,该算法将此模型作为输入,并使用多个 numberHiddenLayers 值对其进行训练。使用优于其他模型的模型获得最佳值,从而优化numberHiddenLayers 变量。
换句话说,模型的不可训练参数是那些在训练期间不会更新和优化的参数,它们必须先验定义,或作为输入传递。
【讨论】:
很明显,如果您冻结网络的任何层。该冻结层上的所有参数都变为不可训练。另一方面,如果你从头开始设计你的网络,它也可能有一些不可训练的参数。例如批标准化层有 4 个参数:
[gamma weights, beta weights, moving_mean, moving_variance]
前两个是可训练的,但后两个不是。因此,批量标准化层很可能是您的自定义网络具有不可训练参数的原因。
【讨论】: