Python 3.x Keras自定义损失-多分支合并损失

Python 3.x Keras自定义损失-多分支合并损失,python-3.x,tensorflow,machine-learning,keras,loss-function,Python 3.x,Tensorflow,Machine Learning,Keras,Loss Function,我有一个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

我有一个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_true
y_pred
是回归分支的真回归值和预测回归值。要计算分类损失,我需要真实和预测的分类标签,这在
my\u loss\u reg()
中不可用

我的问题是如何计算或访问网络回归端的分类损失?类似地,我希望在计算分类的自定义损失函数
my_loss\u class()
时,在分类结束时获得回归损失


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

您所需要的只是在本地Keras中可用

您可以使用
loss\u weights
参数自动组合多个损失

在下面的示例中,我尝试重现一个任务,其中我将回归的
mse
损失与分类任务的
sparse\u categorical\u 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\u reg+0.5*out\u 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},
              loss_weights = {'out_reg':1., 'out_class':0.5})

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

这不是我要找的。根据您的回答,综合损失1*out_reg+0.5*out_类将通过共享层而不是单个分支传播。但是我想定制单个分支的损失,并且损失是其他分支损失的函数。记住,单个损失是最小化的(所有输出的综合损失)。您不能在同一网络中独立地最小化每个分支,因为据我所知,每个分支都有各自的损失值(这就是为什么它们是各自的)。共享层具有合并损失。我找到了此解决方案,但该解决方案在TensorFlow和Keras的最新版本中不再有效@你错了。。。来自文档:“如果模型有多个输出。。。然后,模型将最小化的损失值将是所有单个损失的总和(如合理)