微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Keras自定义损失-多分支合并损失

如何解决Keras自定义损失-多分支合并损失

我有一个2分支网络,其中一个分支输出回归值,另一个分支输出分类标签

model = Model(inputs=inputs,outputs=[output1,output2])    
model.compile(loss=[my_loss_reg,my_loss_class],optimizer='adam')

我想为回归分支实现自定义损失函数(my_loss_reg()),以便在回归结束时我想按如下方式添加分类损失的一部分,

def my_loss_reg(y_true,y_pred):
        loss_mse=K.mean(K.sum(K.square(y_true-y_pred)))
        #loss_reg = calculate_classification_loss() # How to implement this? 
        final_loss = some_function(loss_mse,loss_reg) # Can calculate only if loss_reg is available
        return final_loss

y_truey_pred是真实的,并且在回归分支处预测回归值。要计算分类损失,我需要真实的和预测的分类标签,该标签my_loss_reg()中不可用。

我的问题是如何在网络回归端计算或访问分类损失?同样,在计算分类自定义损失函数my_loss_class()时,我想在分类结束时获得回归损失。

我该怎么做?任何代码段都将有所帮助。我发现了this solution,但这在Tensorflow和Keras的最新版本中不再有效。

解决方法

您所需要的只是在本地keras中提供

您可以使用loss_weights参数自动合并多个损失

在下面的示例中,我尝试重现一个任务,其中将mse损失用于回归分析,将sparse_categorical_crossentropy进行分类任务

features,n_sample,n_class = 10,200,3

X = np.random.uniform(0,1,(n_sample,features))
y = np.random.randint(0,n_class,n_sample)

inp = Input(shape=(features,))
x = Dense(64,activation='relu')(inp)
hidden = Dense(16,activation='relu')(x)
x = Dense(64,activation='relu')(hidden)
out_reg = Dense(features,name='out_reg')(x) # output regression
x = Dense(32,activation='relu')(hidden)
out_class = Dense(n_class,activation='softmax',name='out_class')(x) # output classification

model = Model(inp,[out_reg,out_class])
model.compile(optimizer='adam',loss = {'out_reg':'mse','out_class':'sparse_categorical_crossentropy'},loss_weights = {'out_reg':1.,'out_class':0.5})

model.fit(X,[X,y],epochs=10)

在这种情况下,损失是1*out_reg + 0.5*out_class

的结果

如果您想损失自定义损失,您只需要这样做

def my_loss_reg(y_true,y_pred):
    return ...

def my_loss_class(y_true,y_pred):
    return ...

model.compile(optimizer='adam',loss = {'out_reg':my_loss_reg,'out_class':my_loss_class},epochs=10)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。