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

问题描述 投票:16回答:5

模型中non-trainable参数的定义是什么?

例如,当您构建自己的模型时,其默认值为0,但是当您要使用初始模型时,它将变成其他值而不是0。其背后的原因是什么?

tensorflow deep-learning keras theano caffe
5个回答
13
投票

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

说我们已经在Keras中设置了您的网络定义,您的体系结构类似于256->500->500->1。基于此定义,我们似乎有一个回归模型(一个输出),其中包含两个隐藏层(每个500个节点),输入为256。

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

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

但是,这并不意味着numberHiddenLayers完全不可训练,仅意味着在this model及其实现中我们无法这样做。 我们可以使numberHiddenLayers可训练;最简单的方法是定义另一个ML算法,以该模型为输入并使用numberHiddenLayers的多个值对其进行训练。使用优于其他模型的模型可获得最佳值,从而优化numberHiddenLayers变量。

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


18
投票
在喀拉拉邦,

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

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

    您在训练时选择保持不变的那些。这意味着keras根本不会在训练期间更新这些权重。
  • 与BatchNormalization层中的统计信息类似的工具。使用均值和方差对它们进行了更新,但未对它们进行“反向传播训练”。
  • 权重是网络内部执行操作的值,可以进行调整以产生我们想要的值。反向传播算法最终将权重朝着较低的误差方向更改。

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

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

    当您将它们设为不可训练时,该算法将不再更新这些权重。例如,当您想要带特定滤镜(例如Sobel滤镜)的卷积层时,此功能很有用。您不希望培训更改此操作,因此这些权重/过滤器应保持恒定。

    还有很多其他原因使您无法使举重变得不可训练。


    更改参数:

  • 要确定权重是否可训练,请从模型中获取图层并设置trainable

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

    这必须在编译之前完成。 

    8
    投票
    [有些细节其他答案未涵盖。

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

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

    [gamma weights, beta weights, moving_mean, moving_variance]

    其中的前两个是可训练的,但后两个不是。因此,批处理规范化层极有可能是您的自定义网络具有不可训练的参数的原因。


    0
    投票
    在我们定义的每个模型中,都有参数,然后有超参数。参数主要由权重和偏差组成,而超参数则由滤波器数量,滤波器大小,辍学率,学习率等组成。

    回到您的问题,在模型中,我们训练层以减少损耗并优化参数,并使超参数保持恒定。因此,在反向传播期间,我们应用梯度下降或其他任何优化算法,我们会在每个反向传播步骤之后更新权重和偏差。

    简单来说,可训练参数在训练时会得到优化,而不可训练参数不会在训练时得到优化。

    © www.soinside.com 2019 - 2024. All rights reserved.