在 TensorFlow 中构建具有固定权重的层

New*_*per 2 machine-learning neural-network tensorflow

我想为回归任务构建一个全连接(密集)层。我通常使用 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)
Run Code Online (Sandbox Code Playgroud)

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

jde*_*esa 6

默认情况下, 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)
# ...
Run Code Online (Sandbox Code Playgroud)