我的网络有两个输出。我试图在两个条件上有一个损失,这不是两个损失的线性和:
def weightedBCE(y_true, y_pred):
assert y_pred.shape[2] == 2
y_pred_val = y_pred[:,:,0]
stds = y_pred[:,:,1]
bce = K.binary_crossentropy(y_true, y_pred_val)
loss = bce * (1. + LAM*stds )
return loss我的模型的最后层定义如下(outSall有3个值):
std = make_std_model()(outSall)
final = Dense(1, activation="sigmoid")(outSall)
output = concatenate([DSAfinal, std ], axis=-1)但是它不起作用,因为Kears预计每输出有一个损失函数。我的损失一起使用网络的两个输出。
第一个输出是具有二进制交叉熵损失的标准分类,但我希望它乘以(1+ LAM* stds)和一个λ因子乘以stds。stds是网络的第二个输出。
我该怎么做?
断言y_pred.shape2 == 2 IndexError:列出超出范围的索引
更新:我有一个额外的索引,现在修正了。见下文。但下面贴错了。
def weightedBCE(y_true, y_pred):
assert y_pred.shape[1] == 2
y_pred_val = y_pred[:,0]
stds = y_pred[:,1]
bce = K.binary_crossentropy(y_true, y_pred_val)
loss = bce * (1. + LAM*stds )
return lossValueError: logits和标签必须具有相同的形状((?,) vs ( ?)
Update2:
Keras假设y_true具有与y_pred相同的形状。这就是问题所在。将损失改为:
def weightedBCE(y_true, y_pred):
assert y_pred.shape[1] == 2
y_pred_val = y_pred[:,0]
stds = y_pred[:,1]
bce = K.binary_crossentropy(y_true[:,0], y_pred_val)
loss = bce * (1. + LAM*stds )
return loss处理两个输出仍然存在一些问题,请参阅Binary Cross Entropy not giving similar results when I have 2 outputs
发布于 2019-06-19 13:54:23
与创建具有两个输出的Keras模型不同的是,创建一个具有单个输出的Keras模型,它是两个张量的连接(可以使用keras.layers.Concatenate )。然后,您可以像上面所写的那样,使用单个自定义丢失函数来编译模型。
https://stackoverflow.com/questions/56668996
复制相似问题