我目前正在尝试为Keras创建自己的损失函数(使用Tensorflow后端)。这是一个简单的分类交叉熵,但我在第1列应用了一个因子来惩罚第一类的更多损失。 然而我是Keras的新手,我无法弄清楚如何翻译我的函数(下图),因为我必须使用符号表达式,而且似乎我不能按元素进行:
def custom_categorical_crossentropy(y_true, y_pred):
y_pred = np.clip(y_pred, _EPSILON, 1.0-_EPSILON)
out = np.zeros(y_true.shape).astype('float32')
for i in range(0,y_true.shape[0]):
for j in range (0,y_true.shape[1]):
#penalize more all elements on class 1 so that loss takes its low proportion in the dataset into account
if(j==0):
out[i][j] = -(prop_database*(y_true[i][j] * np.log(y_pred[i][j]) + (1.0 - y_true[i][j]) * np.log(1.0 - y_pred[i][j])))
else:
out[i][j] = -(y_true[i][j] * np.log(y_pred[i][j]) + (1.0 - y_true[i][j]) * np.log(1.0 - y_pred[i][j]))
out = np.mean(out.astype('float32'), axis=-1)
return tf.convert_to_tensor(out,
dtype=tf.float32,
name='custom_loss')
有人可以帮助我吗?
非常感谢!
答案 0 :(得分:0)
您可以在class_weight
方法中使用fit
来惩罚类而不创建函数:
weights = {
0:2,
1:1,
2:1,
3:1,
...
}
model.compile(optimizer=chooseOne, loss='categorical_crossentropy')
model.fit(......., class_weight = weights)
这将使第一堂课成为其他班级的两倍。