Python 如何使用另一个模型的输出作为参数来实现自定义Keras调节器?

Python 如何使用另一个模型的输出作为参数来实现自定义Keras调节器?,python,tensorflow,neural-network,keras,loss-function,Python,Tensorflow,Neural Network,Keras,Loss Function,我试图复制这篇文章: 基本上,完全卷积网络(FCN)对图像的面片进行体素级预测,然后,该面片及其各自的标签通过自动编码器,然后进行比较,以评估预测的“全局形状” 因此损失函数(等式(1)第4页)是来自FCN的交叉熵和来自自动编码器的欧氏距离损失之间的线性组合 问题: 我有一个工作的FCN和一个工作的自动编码器,我的问题是在Keras/tensorflow中实现这个损失函数。那么,我该怎么做呢 这是我到目前为止尝试过的(没有方程的第三项),但给出了错误的结果: def euclidean_dist

我试图复制这篇文章:

基本上,完全卷积网络(FCN)对图像的面片进行体素级预测,然后,该面片及其各自的标签通过自动编码器,然后进行比较,以评估预测的“全局形状”

因此损失函数(等式(1)第4页)是来自FCN的交叉熵和来自自动编码器的欧氏距离损失之间的线性组合

问题:

我有一个工作的FCN和一个工作的自动编码器,我的问题是在Keras/tensorflow中实现这个损失函数。那么,我该怎么做呢

这是我到目前为止尝试过的(没有方程的第三项),但给出了错误的结果:

def euclidean_distance_loss(y_true, y_pred):
    from keras import backend as K
return K.sqrt(K.sum(K.square(y_pred - y_true)))

def ACNN_loss(l1, autoencoder):
    from keras import backend as K

    def loss(y_true, y_pred):
        ae_seg = autoencoder(y_pred)
        ae_gt = autoencoder(y_true)

        Lhe = K.sqrt(K.sum(K.square(ae_seg - ae_gt)))

        Lx = K.binary_crossentropy(y_true, y_pred)

        return Lx + (l1 * Lhe)

return loss

l1 = 0.01

ae_path = #path of my autoencoder model and its weights
autoencoder = keras.models.load_model(os.path.join(ae_path,'model.h5'), custom_objects={'euclidean_distance_loss': euclidean_distance_loss})

autoencoder.load_weights(os.path.join(ae_path,'weigths.h5'))


model.compile(loss = ACNN_loss(l1, autoencoder),
              optimizer = keras.optimizers.Adam(lr=0.0003, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0),
              metrics= ['accuracy', keras.metrics.binary_crossentropy]
              )

这是我的第一个问题,很抱歉,如果我在任何要求上弄错了。提前感谢

不需要平方根。从您所附的纸张上看,损失不包含sqrt函数。即,正则化项采用平方距离,而不是范数距离

具体来说,您应该替换

Lhe = K.sqrt(K.sum(K.square(ae_seg - ae_gt)))


通常,L2正则化总是采用平方距离。

您希望得到什么结果?标题应该是一个问题,以便我们了解您具体想要什么。谢谢您的提示。我想通过使用自动编码器丢失的信息来改进我的FCN预测。我的问题是如何在keras中使用另一个模型的输出作为参数来实现调节器。请在您的帖子中包含您的问题的任何附加信息。避免在评论中添加这些内容,因为它们更难阅读,也更容易删除。你的帖子的编辑按钮就在帖子标签下面。你是说欧几里得距离损失吗?我认为欧几里德范数是和我一样计算出来的,从我在维基百科上看到的我指的是
Lhe=K.sqrt(K.sum(K.square(ae_seg-ae_gt))
。总的来说,计算距离确实和你做的一样,但这不是计算损失的方式。同样,参见等式4。在报纸上。他们不接受sqrt。@jfga,太好了:)PS:如果你觉得我的答案有帮助,请投票或接受它
Lhe = K.sum(K.square(ae_seg - ae_gt))