【问题标题】:How to use tf.autograph.experimental.set_loop_options to set shape invariants?如何使用 tf.autograph.experimental.set_loop_options 设置形状不变量?
【发布时间】:2021-08-06 15:03:13
【问题描述】:

当我在 model.fit 模式下运行以下代码时,出现错误:

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 while-loop shapes


【解决方案1】:

我前段时间遇到过同样的问题,我同意代码在急切模式下可以完美运行。问题在于,在图形模式下,TensorFlow 会跟踪整个代码,它会尝试运行循环进行几次迭代,以实际跟踪循环行为。因此,当人们尝试对张量进行操作以将结果形状更改为未知的形状时,这会产生问题,例如[无,无]。

因为您只能有一个未知维度,这将是您的批量大小,这会在 TF 循环中产生问题,因为形状应该与循环一致,或者您必须为所有张量指定形状不变量正在改变形状。

在您的情况下,张量 context_vec 似乎正在改变形状。所以要解决在循环开始或context_vec之前添加这些代码:

tf.autograph.experimental.set_loop_options(
                shape_invariants=[(context_vec, tf.TensorShape([None]))]
            )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    相关资源
    最近更新 更多