【问题标题】:Can I use the output of a model's layer as a target to train that same model?我可以使用模型层的输出作为目标来训练相同的模型吗?
【发布时间】:2018-09-02 03:26:46
【问题描述】:

假设我有一个具有一个输入和两个输出的模型。我希望模型第三层的输出成为我的第二个输出的成本函数中的 y_true。 我试过这个:

model.fit(x, [y, model.layers[3].output], ...)

但得到错误:

'Tensor' object has no attribute 'ndim'

我相信这是指我给出的 fit 方法的第二个 y_true。

在 Keras 中可以做这样的事情吗?如果有,怎么做?

【问题讨论】:

  • model.layers[3].output 是一个张量,而不是一个numpy.array,它确实没有ndim 属性。你想做什么?通常,您可以使用numpy.array's。
  • 解释整个画面很复杂,但主要是我想使用其中一个层的输出作为成本函数的 y_true 来训练我的模型。我意识到输出确实是一个没有 ndim 的张量。不过,我想将它与来自相同形状的另一个张量(我的输出 2)进行比较
  • 也许您可以将第一个和第二个输出相减,并将其拟合为 [0,0,...,0] 作为numpy.array?尽管您需要考虑在这种情况下梯度下降和成本函数的作用。
  • 为什么网络很难保持这两个输出完全相同?不是在学习 output_1 和 output_2 之间的恒等函数吗?
  • 不,我的模型是其他几个模型的复杂连接,我只是为了这个问题试图简化它。你是对的,我不能提供一个张量来适应,但我可以在自定义损失函数中使用它,就像我在发布的答案中所做的那样

标签: tensorflow neural-network keras layer


【解决方案1】:

我通过仅更改成本函数来做到这一点,例如:

def custom_euclidean_distance_loss(layer_output):
    from keras import backend as K
    def wrap(y_true, y_pred):
        return K.mean(K.square(y_pred - layer_output))
    return wrap

因为我没有使用任何以前已知的 y_true,所以我只喂了一个假人来适应。请注意,Keras 打印出来的指标不会以这种方式正确,但模型会毫无问题地训练。

如果您知道更好的方法(例如实际输入层输出以适应),请告诉我

【讨论】:

    猜你喜欢
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    相关资源
    最近更新 更多