1

我想在顺序模型中有一个层,它有一些固定的、不可训练的权重,稀疏地分布在层内。

例如:我创建了一个层数很少的模型

model = Sequential()
model.add(Dense(units=n_nodes, activation=activation, kernel_initializer='glorot_uniform'), input_shape=(n_nodes,))
model.add(Dense(....

然后我编译并拟合模型并获得具有训练权重的两层。

接下来,我想例如model.layer[0]修改和修复一些权重,然后对网络进行再训练。

例如,训练层是

a b c
d e f
g h i

我希望它是这样的:

A* b  c
d  e  F*
g  H* I*

使用 A*、F*、H* 和 I* 编辑权重并设置为不可训练,因此在另一轮训练之后,该层会产生类似这样的结果

A*  b2  c2
d2  e2  F*
g2  H*  I*

我的网络是在 Keras 中构建的,我没有找到进行这种转换的方法。甚至可能吗?我考虑过创建一个自定义层,但我不知道如何只使某些值不可训练。

4

1 回答 1

1

我不确定这是否可行,但您可以向图层权重添加自定义约束,如此处所示

要修复特定权重,请使用自定义约束类(感谢@Artem Glukhov 提及tf.keras.backend.set_value):

class FixWeights(tf.keras.constraints.Constraint):

    def __call__(self, w):
        tf.keras.backend.set_value(w[0, 0], A)
        tf.keras.backend.set_value(w[1, 2], F)
        tf.keras.backend.set_value(w[2, 1], H)
        tf.keras.backend.set_value(w[2, 2], I)
 
        return w

并将其添加到您的图层中:

tf.keras.layers.Dense(..., kernel_constraint=FixWeights())
于 2021-09-14T15:42:32.013 回答