我做了很多搜索,但仍然无法弄清楚编写一个具有多个输出的自定义损失函数,它们会相互影响。
我的神经网络定义为:
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中处理多个输出时做错了,但是不确定我的错误在哪里。欢迎对我的前进方式提供任何帮助。
答案 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);