Keras中的自定义损失函数结合了多个输出

时间:2019-12-19 21:26:37

标签: keras loss-function

我做了很多搜索,但仍然无法弄清楚编写一个具有多个输出的自定义损失函数,它们会相互影响。

我的神经网络定义为:

def NeuralNetwork():

    inLayer = Input((2,));
    layers = [Dense(numNeuronsPerLayer,activation = 'relu')(inLayer)];
    for i in range(10):
        hiddenLyr = Dense(5,activation = 'tanh',name = "layer"+ str(i+1))(layers[i]);
        layers.append(hiddenLyr);
    out_u = Dense(1,activation = 'linear',name = "out_u")(layers[i]);
    out_k = Dense(1,activation = 'linear',name = "out_k")(layers[i]);

    outLayer = Concatenate(axis=-1)([out_u,out_k]);

    model = Model(inputs = [inLayer], outputs = outLayer);

    return model

我现在正尝试定义自定义损失函数,如下所示:

def computeLoss(true,prediction):

          u_pred = prediction[:,0];
          k_pred = prediction[:,1];
          loss = f(u_pred)*k_pred;
          return loss;

其中f(u_pred)是对u_pred的某种操纵。当我仅使用u_pred(即仅来自神经网络的单个输出)时,代码似乎可以正常工作并产生正确的结果。但是,当我尝试为k_pred包括另一个输出并在损失函数中执行预测张量的切片时,我开始得到错误的结果。我感觉在Keras中处理多个输出时做错了,但是不确定我的错误在哪里。欢迎对我的前进方式提供任何帮助。

1 个答案:

答案 0 :(得分:0)

我发现您不能仅使用索引(即[:,0]或[:,1])在tf中切片张量。该操作似乎无效。而是使用tensorflow中的内置函数作为 在https://www.tensorflow.org/api_docs/python/tf/split?version=stable

中有详细说明

所以有效的语法是

(u_pred,k_pred)= tf.split(预测,num_or_size_splits = 2,轴= 1);