Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 在具有多个Keras模型的TF2自定义训练循环中应用渐变的正确方法_Tensorflow_Keras_Python 3.6_Tensorflow2.0 - Fatal编程技术网

Tensorflow 在具有多个Keras模型的TF2自定义训练循环中应用渐变的正确方法

Tensorflow 在具有多个Keras模型的TF2自定义训练循环中应用渐变的正确方法,tensorflow,keras,python-3.6,tensorflow2.0,Tensorflow,Keras,Python 3.6,Tensorflow2.0,我正在使用GradientTape实现一个定制的培训循环,涉及多个Keras模型。 我有3个网络,model_a,model_b,和model_c。我已经创建了一个列表来保存他们的trainbale\u重量: trainables = list() trainables.append(model_a.trainable_weights) # CovNet trainables.append(model_b.trainable_weights) # CovNet trainables.app

我正在使用GradientTape实现一个定制的培训循环,涉及多个Keras模型。 我有3个网络,
model_a
model_b
,和
model_c
。我已经创建了一个列表来保存他们的
trainbale\u重量

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]))

问题在于
tape.gradient
期望
trainables
是一个可培训变量的平面列表,而不是列表列表。您可以通过将所有可训练权重连接到一个平面列表中来解决此问题:

trainables = model_a.trainable_weights + model_b.trainable_weights + model_c.trainable_weights

问题在于
tape.gradient
期望
traineables
成为一个可训练变量的平面列表。
traineables=model_a.可训练重量+model_b.可训练重量+model_c.可训练重量
解决问题了吗?没有。它抛出
ValueError:太多的值无法解包(预期为2个)
错误。具体发生在哪里?调用“optimizer.apply_gradients”时,我担心这可能是另一个问题。
trainables=model_a.可训练权重+model_b.可训练权重+model_c.可训练权重
,解决了问题@里维纳斯。我想我之前错过了一些东西。