我有一个期望的损失函数为:
one_weight = (1-num_of_ones)/(num_of_ones + num_of_zeros)
zero_weight = (1-num_of_zeros)/(num_of_ones + num_of_zeros)
def weighted_binary_crossentropy(zero_weight, one_weight):
def weighted_binary_crossentropy(y_true, y_pred):
b_ce = K.binary_crossentropy(y_true, y_pred)
# weighted calc
weight_vector = y_true * one_weight + (1 - y_true) * zero_weight
weighted_b_ce = weight_vector * b_ce
return K.mean(weighted_b_ce)
return weighted_binary_crossentropy
我试图在我的模型中使用这个损失函数,它是:
model = Sequential()
model.add(BatchNormalization())
model.add(Conv2D(16, kernel_size=(32,1),strides=(1,1), activation='relu', input_shape=(78,64,1)))
model.add(Conv2D(16, kernel_size=(1,10),strides=(1,10), activation='relu'))
model.add(BatchNormalization())
model.add(ReLU(max_value=None))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(2, activation='sigmoid'))
model.compile(optimizer=opt, loss = weighted_binary_crossentropy , metrics = ['acc'] )
history = model.fit(Train_Data, Train_labels, batch_size =20, epochs = 450, shuffle = True , validation_data = (Val_Data, Val_labels))
我的问题是,损失函数需要一个输入是y_pred
(由模型预测的测试数据的标签)。通过我想要的损失函数训练模型后,可以获得y_pred
,但损失函数在训练模型时需要y_pred
。
另一方面,我可以说:我使用损失函数来训练我的模型,但它给出了错误,因为没有y_pred
将其用作损失函数的输入。
在开始训练过程之前,我如何使用我想要的损失函数来训练模型,而我没有y_pred
?注意,我还有其他需要的损失函数参数。
将自己的参数传递给weighted_binary_crossentropy
。这个函数返回内部包装函数(weighted_binary_crossentropy
),它接受y_true
和y_pred
,你不需要对它做任何事情。
model.compile(optimizer=opt,
loss=weighted_binary_crossentropy(zero_weight,one_weight),
metrics=['acc'])