模型中non-trainable参数的定义是什么?
例如,当您构建自己的模型时,其默认值为0,但是当您要使用初始模型时,它将变成其他值而不是0。其背后的原因是什么?
不可训练参数是一个广泛的主题。一个简单的例子就是考虑任何特定的NN模型及其架构的情况。
说我们已经在Keras中设置了您的网络定义,您的体系结构类似于256->500->500->1
。基于此定义,我们似乎有一个回归模型(一个输出),其中包含两个隐藏层(每个500个节点),输入为256。
模型的一个不可训练参数是,例如,隐藏层本身的数量(2)。其他可能是每个隐藏层上的节点(在这种情况下为500),甚至每个单独层上的节点,为您提供每层一个参数以及层本身的数量。
这些参数是“不可训练的”,因为您无法使用训练数据优化其值。训练算法(例如反向传播)将优化和更新网络的权重,是此处的实际可训练参数(通常为数千个,具体取决于您的连接)。您的训练数据无法帮助您确定那些不可训练的参数。
但是,这并不意味着numberHiddenLayers
完全不可训练,仅意味着在this model及其实现中我们无法这样做。 我们可以使numberHiddenLayers
可训练;最简单的方法是定义另一个ML算法,以该模型为输入并使用numberHiddenLayers
的多个值对其进行训练。使用优于其他模型的模型可获得最佳值,从而优化numberHiddenLayers
变量。
换句话说,模型的不可训练参数是您在训练期间不会更新和优化的参数,必须定义为[[先验或作为输入传递。
不可训练参数(如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()
这将输出零个可训练参数,以及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
标志的影响。
[gamma weights, beta weights, moving_mean, moving_variance]
其中的前两个是可训练的,但后两个不是。因此,批处理规范化层极有可能是您的自定义网络具有不可训练的参数的原因。
回到您的问题,在模型中,我们训练层以减少损耗并优化参数,并使超参数保持恒定。因此,在反向传播期间,我们应用梯度下降或其他任何优化算法,我们会在每个反向传播步骤之后更新权重和偏差。
简单来说,可训练参数在训练时会得到优化,而不可训练参数不会在训练时得到优化。