【问题标题】:Keras can't compute a graph node in a callbackKeras 无法在回调中计算图形节点
【发布时间】:2018-08-17 00:15:02
【问题描述】:

为了说明问题,请考虑以下模型的(完全人为的)示例:

import numpy as np
from tensorflow.keras.utils import Sequence
from tensorflow.keras.callbacks import Callback
from tensorflow.keras import backend as K
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model

class RandomSeq(Sequence):
    def __len__(self):
        return 5

    def __getitem__(self, idx):
        return (np.array([np.arange(39).reshape((39,)) for i in range(100)]), 
                np.array([-np.arange(39).reshape((39,)) for i in range(100)]))

class Foo(Callback):
    def __init__(self, d):
        super(Foo, self).__init__()
        self._d = d

    def on_epoch_end(self, epoch, logs=None):
        print(epoch)
        print(K.eval(self._d))



x = Input(shape=(39,), dtype='float32', name='input')
y_pred = Dense(39)(x)

y_another = x * 2

m = Model(inputs=x, outputs=y_pred)
m.compile(optimizer='sgd', loss='mse')

seq = RandomSeq()
m.fit_generator(seq, epochs=5, callbacks=[Foo(y_another)])

RandomSeq 只是一个返回xy 批次的序列。 Foo 是一个回调,它将尝试在一个时期结束时评估附加数量 d。对我来说,如果我选择dy_predy_another,那么Keras 会抱怨占位符x (input) 没有被输入。

您必须使用 dtype float 和 shape [?,39] 为占位符张量“input_1”提供一个值

这是预期的行为吗?如果是这样,是否有另一种方法来计算 Keras 回调中的节点?请注意,如果没有计算上述图形节点的回调,则该示例可以正常工作。

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    这不是正确的做法。 运行 K.eval(y_another) 您要求 keras 后端评估一个 Input 对象(它只是您想要输入网络的数据的占位符)而不向它提供任何数据,这就是您的错误的原因。

    因此,假设您要计算网络的输出给定一个新输入,该输入是一个随机序列乘以 2(对吗?),那么您应该在回调中修改 on_epoch_end(self, epoch, logs=None) 的主体,如下所示:

    x, _ = next(RandomSeq())     
    print(self.model.predict(x*2))
    

    【讨论】:

    • 感谢您的回复。就像我说的那样,这个例子完全是人为的,除了强调问题之外没有其他目的。然而,它是我正在使用的更精细图表的代理。因此,您可以想象计算y_another 的分支也可能是一系列自定义层,需要在模型编译之前指定。由于这些层将与我的图表中的占位符相关联,我想问题变成了如何在回调中提供占位符,以便可以计算另一个分支中的边缘节点?
    • 所以如果我理解得很好,y_another 使用相同的输入但实现了不同的架构,对吧?在这种情况下,您应该将 y_another 添加到模型输出 Model(inputs=x, outputs=[y_pred, y_another] 并在回调中,而不是使用 K.eval,只需运行 self.model.predict(inputs),您将收到两个输出
    • 我也是这么想的。但是,如果它不计入损失,并且该分支中的任何内容都不应该优化,我该如何控制呢?这也使我的序列中的逻辑有点奇怪,因为现在我应该为这个新输出返回基本事实,以及没有。
    • 如果您不想优化该额外输出,那么我不明白您为什么要在网络内计算该值。如果您只想在 gpu 上运行计算,我建议您使用 tensorflow 而不是 keras。另一方面,如果操作非常简单,你可以使用 numpy。
    • 嗯,这是一个使用 tfmpl 转换为张量的 matplotlib 图。我打算把它写成一个摘要,以便它可以在 tensorboard 中可视化。顺便说一句,这是 Kinect 骨架的可视化。
    猜你喜欢
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多