如何在Keras中将外部python库中的函数设置为自定义损失函数?

时间:2018-07-12 13:45:19

标签: python keras loss-function

我最近开始使用python,更具体地说是与Keras一起用于机器学习应用程序。

我想用以下自定义损失函数训练一个人工神经网络,该函数利用pygmo库中提供的hypervolume

def hypervolume_difference_loss(y_true, y_pred):  

    import numpy as np
    from pygmo import hypervolume

    ref_point = [1.0, 1.0]
    ref_PF = np.array(y_true) 
    out_PF = np.array(y_pred)  

    hv_d = np.empty(shape=y_true.shape[0], dtype=float)

    for i, (ref_point _i, out_PF _i) in enumerate(zip(ref_point , out_PF )):
        ref_hv_obj = hypervolume(points=ref_point .reshape(10, -1,order='F'))  
        out_hv_obj = hypervolume(points=ref_point .reshape(10, -1,order='F'))  
        ref_hv = ref_hv_obj.compute(ref_point )
        out_hv = out_hv_obj.compute(ref_point )
        hv_d[i] = abs(ref_hv - out_hv)

    return hv_d

基于Keras文档,自定义损失函数必须是张量流符号函数。我发现了几个示例(例如link),这些示例显示了如何使用Keras后端函数编写这样的符号函数,但是我无法找到一种编写可以使用外部结果的符号函数的方法。库。

我最近在此link中发现了类似的问题,但未提供解决方案。我能想到的唯一解决方法是用Keras后端表示形式重写超卷函数。您能否让我知道是否还有其他便捷的方法?

非常感谢您提供任何帮助或建议。

谢谢。

1 个答案:

答案 0 :(得分:0)

我同意您的意见,以下实施方式将为您服务。我从GitHub获得了此实现,其中使用闭包技术来涉及损失函数。

import keras
from keras.models import Model
from keras.layers.convolutional import *

def penalized_loss(noise):
    def loss(y_true, y_pred):
        return K.mean(K.square(y_pred - y_true) - K.square(y_true - noise), axis=-1)
    return loss

batch_size=32
timesteps=6
features=8

input1 = keras.layers.Input(batch_shape=(batch_size, timesteps, features))
lstm =  keras.layers.LSTM(features, stateful=True, return_sequences=True)(input1)
output1 = keras.layers.TimeDistributed(Dense(features, activation='sigmoid'))(lstm)
output2 = keras.layers.TimeDistributed(Dense(features, activation='sigmoid'))(lstm)
model = Model(input=[input1], output=[output1, output2])
model.compile(loss=[penalized_loss(noise=output2), penalized_loss(noise=output1)], optimizer='rmsprop')