0

我正在尝试修复 Keras Dense 层的一些权重,并使它们不可训练。我发现有效的解决方案在我之前提出的问题中进行了描述。

我正在创建一个密集层

model.Sequential()
model.add(Dense(units=n_nodes, 
    kernel_initializer=K.Constant(weights),
    kernel_constraint=constraint_fix(weights_nan),
    activation='relu'))
...

我创建了一个处理约束的类:

class constraint_fix(tf.keras.constraints.Constraint):
    def __init__(self, layer=None):
        self.layer=layer
    def __call__(self, w):
        c = np.isfinite(self.layer)
        for (x,y) in np.argwhere(c==True):
            tf.keras.backend.set_value(w[x,y],self.layer[x,y])
        return w

weights是一个代表层的起始权重的ndarray,例如

  1   0.4  0.3
 -2  -0.2    2
0.3    -1  1.4

whileweights_nan是一个 ndarray,其中一些权重发生了变化,其他的设置为 NaN:

 1.1    nan   0.4
-2.1   -0.1   nan
 nan    nan   1.7

constraint_fix将最后一个数组作为参数,并仅设置密集层的权重,让另一个在训练期间自由更改。

我的问题不在于这个操作计算量很大,因为网络实际上更大并且有很多层,并且在每个训练步骤constraint_fix()都被唤起并迭代 for 循环。

有没有一种方法可以加快进程并一步更新所有所需的层权重?我想过,K.batch_set_value()但我无法让它发挥作用,因为如果我让

z=list(zip(w[c], self.layer[c]))
K.batch_set_values(z)

输出是

AttributeError: 'tensorflow.python.framework.ops.EagerTensor' object has no attribute 'assign'

我究竟做错了什么?(可能一切,但是)我怎样才能达到预期的结果?

4

0 回答 0