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