【问题标题】:custom loss function in Keras combining multiple outputsKeras中的自定义损失函数结合了多个输出
【发布时间】:2020-04-12 11:36:44
【问题描述】:

我进行了大量搜索,但仍然无法编写一个自定义损失函数,其中包含多个交互的输出。

我有一个神经网络定义为:

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 中的多个输出时做错了,但不确定我的错误在哪里。欢迎任何有关我如何进行的帮助。

【问题讨论】:

    标签: keras loss-function


    【解决方案1】:

    我发现您不能只使用索引(即 [:,0] 或 [:,1] )来切片 tf.该操作似乎不起作用。相反,使用 tensorflow 中的内置函数作为 详见https://www.tensorflow.org/api_docs/python/tf/split?version=stable

    所以有效的代码是:

    (u_pred, k_pred) = tf.split(prediction, num_or_size_splits=2, axis=1)
    

    【讨论】:

    • 这几天我一直在到处寻找这个答案,感谢您在找到解决方案时回复它!
    猜你喜欢
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2021-01-22
    • 2020-12-19
    • 2017-12-18
    • 2020-03-27
    • 1970-01-01
    相关资源
    最近更新 更多