【问题标题】:Build layers with fixed weights in TensorFlow在 TensorFlow 中构建具有固定权重的层
【发布时间】:2020-01-16 12:43:44
【问题描述】:

我想为回归任务构建一个全连接(密集)层。我通常使用 TF2,使用 Keras API,例如:

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(units=2, activation='sigmoid', input_shape=(1, )))
model.add(tf.keras.layers.Dense(units=2, activation='linear'))
model.compile(optimizer='adam', loss='mae')
model.fit(inp_data, out_data, epochs=1000)

现在我想构建一个自定义层。该层由 10 个单元组成,其中 8 个单元具有预定义的、固定的、不可训练的权重和偏差,2 个单元具有随机选择的权重和偏差,由网络训练。有谁知道如何在 Tensorflow 中定义它?

【问题讨论】:

  • 有很多方法可以做到这一点,例如,将变量标记为不可训练,在优化器中选择要训练的变量或简单地使用常量而不是变量,但这取决于您如何构建您的神经网络(原始 TF,tf.layers,Keras,...)。还有关于您使用的是 TF 1.x 还是 2.x。请在您的问题中提供更多详细信息,最好是您通常如何构建简单神经网络的最小示例。

标签: tensorflow machine-learning neural-network


【解决方案1】:

Keras 层可能会收到一个trainable 参数,默认情况下是True,以指示您是否希望它们被训练。不可训练的层只会保留初始化器给定的值。如果我理解正确,你想要一层只能部分训练。这在现有层中是不可能的。也许您可以使用自定义层类来做到这一点,但是您可以通过使用两个简单的层然后将它们连接起来来获得等效的行为(只要您的激活在元素方面有效,即使它没有,就像在 softmax 中一样层,您可以在连接后应用该激活)。这就是它的工作方式:

inputs = tf.keras.Input(shape=(1,))
# This is the trainable part of the layer
layer_train = tf.keras.layers.Dense(units=8, activation='sigmoid')(inputs)
# This is the non-trainable part
layer_const = tf.keras.layers.Dense(units=2, activation='sigmoid', trainable=False)(inputs)
# Merge both parts
layer = tf.keras.layers.Concatenate()([layer_train, layer_const])
# Make model
model = tf.keras.Model(inputs=inputs, outputs=layer)
# ...

【讨论】:

    猜你喜欢
    • 2017-07-30
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 2021-05-12
    相关资源
    最近更新 更多