【问题标题】:Why results are different from call and predict in a Keras model? It seems predict ignore any random generated value为什么结果与 Keras 模型中的调用和预测不同?似乎预测忽略任何随机生成的值
【发布时间】:2020-04-17 00:08:52
【问题描述】:

我看到调用模型和调用 predict 方法之间的不同行为。似乎 predict 会忽略所有随机生成的值。

在这个notebook 中,我试图将随机过程引入我的网络。

基本上,对于每个条目,我将其复制 10 次,并为每个切片添加一些随机噪声。

当使用张量调用模型时,我看到了预期的输出,其中输入条目会产生一些噪音。 在相同的数据上调用 predict 时,我看到的只是相同的输出。

所以我保存了模型权重,并将权重加载到没有任何噪音的类似模型中以验证我的假设。实际上,在没有噪声的情况下,它在调用和预测时产生相同的输出,并且在调用 predict 时与之前的噪声模型产生相同的输出。

为什么我会看到这种行为?是不是说用fit训练网络时,也会忽略随机值?

【问题讨论】:

  • 我认为predict 可能使用的是模型的图形编译版本,其中批处理维度为None,因此在foo 函数的分支中采用第一条路径。你为什么不干脆做return x + tf.random.normal(K.shape(x))
  • 这很好。我对 TF 中的这个图形概念仍然很陌生。起初我使用的是 K.random_normal(K.int_shape(x)),它抛出了异常,因为有些维度是无的。我会试试你的建议。
  • @jdehesa 太好了!我需要使用 K.shape 而不是 K.int_shape 因为我需要符号尺寸。现在预测并调用同意输出。您的评论与答案一样好,因此您可以根据需要在此处粘贴答案。

标签: python tensorflow keras


【解决方案1】:

当您调用 predict 时,Keras 使用 TensorFlow 编译图来运行模型,这意味着数据张量的批次维度通常为 None(因为您可以预测任何批次的尺寸)。在将噪声添加到输入的 foo 函数中:

def foo(x):
    B, D = K.int_shape(x)
    if B is None:
        return x
    else:
        mask = tf.random.normal((B,D))
        return x + mask

您使用int_shapex 的形状作为Python 整数,或None 用于未知维度。这与预想的张量一样工作,其中所有维度总是已知的,但在图形模式下,返回的批处理维度 BNone,因此条件通过第一个分支并且输入保持不变。

最简单的解决方案是改用shape,这将为您提供另一个包含x 完整形状的张量(符号或急切),您可以使用它来生成随机噪声:

def foo(x):
    return x + tf.random.normal(K.shape(x))

这应该总是按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 2014-09-28
    • 2021-12-18
    • 2021-10-06
    相关资源
    最近更新 更多