keras自定义loss

loss是model.compile编译时所需的参数之一,可以用损失函数名或者 TensorFlow 符号函数:

#损失函数名
model.compile(loss='mean_squared_error', optimizer='sgd')
#符号函数
model.compile(loss=losses.mean_squared_error, optimizer='sgd')

自定义损失函数时参数必须并且只有两个,一个是y_true,一个是y_pred,并且y_true参数放在y_pred的前面(Keras自动会检测到y_true和 y_pred):

def myself_loss(y_true, y_pred):
	losses = y_true - y_pred
	return losses
model.compile(loss=myself_loss, optimizer='sgd')

Keras教学(12):使用Keras自定义神经网络的损失函数,你学废了吗_是猪哥不是诸葛的博客-CSDN博客_keras自定义损失函数

model = Model(inputs=inputs, outputs=[x1, x2, x3])

 Keras会为Model的每一个输出out构建一个loss,这些loss之间无法交互。且loss_weights对应每个loss的权重,最后输出loss的和。

model.compile(optimizer=opt, loss='myself_loss', loss_weights=[1, 1, 1])

同时,Model中每一个outut都必须在fit()有对应的y_ture。

model.fit([trainX], [trainY1, trainY2, trainY3], epochs=600, batch_size=batchsize1, verbose=2, callbacks=callback)

loss 对应的关系是x1和trainY1算‘myself_loss’,x2和trainY2算‘myself_loss’, x3和trainY3算‘myself_loss’,而模型的输入是trainX

Keras多输入、多输出、多loss模型构建 - 百度文库

“让Keras更酷一些!”:随意的输出和灵活的归一化 - 科学空间|Scientific Spaces

在自己编写的代码文件中直接使用自定义的loss,在训练和验证的时候是行得通的;但是在测试时,是行不通的,因为在Keras库中的loss.py没有定义这个myloss()函数,故而在评估的时候不能应用myloss()来加以评估。

通过以下方法解决这个问题的:
**打开Keras库中的loss.py文件,添加你刚才自定义的函数,即复制—>粘贴**。
在这里插入图片描述

 Keras中自定义复杂的loss函数 - 科学空间|Scientific Spaces  双输出模型

compile的时候并没有传入loss,而是在compile之前通过另外的方式定义loss,然后通过add_loss加入到模型中,这样可以随意写足够灵活的loss,比如这个loss可以跟中间层的某个输出有关、跟输入有关

keras使用中的花式技巧 - 光彩照人 - 博客园

“让Keras更酷一些!”:随意的输出和灵活的归一化 - 科学空间|Scientific Spaces

猜你喜欢

转载自blog.csdn.net/Fwuyi/article/details/125166195