我正在使用GradientTape实现涉及多个Keras模型的自定义训练循环。
我有3个网络,model_a
,model_b
和model_c
。我创建了一个列表,将其trainbale_weights
保留为:
trainables = list()
trainables.append(model_a.trainable_weights) # CovNet
trainables.append(model_b.trainable_weights) # CovNet
trainables.append(model_c.trainable_weights) # Fully Connected Network
然后我计算损耗并尝试将梯度应用为:
loss = 0.
optimizer = tf.keras.optimizers.Adam()
for _, (x, y) in enumerate(train_dataset):
with tf.GradientTape() as tape:
y = ...
loss = ... # custom loss function!
gradients = tape.gradient(loss, trainables)
optimizer.apply_gradients(zip(gradients, trainables))
但是我收到以下错误,我不确定错误在哪里:
AttributeError: 'list' object has no attribute '_in_graph_mode'
如果我遍历渐变和可训练对象,然后应用渐变,它会起作用,但是我不确定这是否是正确的方法。
for i in range(len(gradients)):
optimizer.apply_gradients(zip(gradients[i], trainables[i]))
答案 0 :(得分:0)
问题在于tape.gradient
期望trainables
是可训练变量的平面列表,而不是列表列表。您可以通过将所有可训练的权重串联到一个平面列表中来解决此问题:
trainables = model_a.trainable_weights + model_b.trainable_weights + model_c.trainable_weights