1

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

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

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

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

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

为什么我会看到这种行为?这是否意味着当用 训练网络时fit,它也会忽略随机值?

4

1 回答 1

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_shape获取xPython 整数或None未知维度的形状。这与期望的张量一样工作,其中所有维度总是已知的,但在图形模式下,返回的批量维度BNone,因此条件通过第一个分支并且输入保持不变。

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

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

这应该始终按预期工作。

于 2020-04-16T16:08:52.867 回答