我最近开始使用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后端表示形式重写超卷函数。您能否让我知道是否还有其他便捷的方法?
非常感谢您提供任何帮助或建议。
谢谢。
答案 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')