当我在模型中运行以下代码时。
ValueError: 'context_vec'在循环之前具有形状(None, 512),但在一次迭代之后具有形状(None, None)。使用tf.autograph.experimental。Set_loop_options设置形状不变量
代码:
mel_outputs, attn_scores, stop_outputs = [], [], []
for t in range(0, steps, 2):
prenet_in = m[:, :, t - 1] if t > 0 else go_frame
mel_frames, scores, hidden_states, cell_states, context_vec, stop_tokens = self.decoder(encoder_seq, encoder_seq_proj, prenet_in,
hidden_states, cell_states, context_vec, t, x)
mel_outputs.append(mel_frames)
attn_scores.append(scores)
stop_outputs.extend([stop_tokens] * 2)
但我在训练中多次看不到任何形状变化。在eager_mode下,这些代码工作得很好。那么如何重写代码来得到正确的答案呢?我真的需要你的帮助!等待您的回复。
我之前遇到过同样的问题,我同意代码在渴望模式下工作得很好。问题是,在图模式下,TensorFlow跟踪整个代码,并尝试运行循环几次迭代,以实际跟踪循环行为。因此,当人们试图对张量进行操作,将结果形状改变为未知的东西时,这会产生一个问题,例如[None, None]。
因为你只能有一个未知的维度那就是你的批大小这会在TF循环中产生问题因为要么形状应该与循环一致要么你必须为所有改变形状的张量指定形状不变量
在你的例子中,看起来张量context_vec
正在改变形状。为了解决这个问题,在循环开始处或context_vec
:
tf.autograph.experimental.set_loop_options(
shape_invariants=[(context_vec, tf.TensorShape([None]))]
)