我正在尝试修复 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'
我究竟做错了什么?(可能一切,但是)我怎样才能达到预期的结果?