Keras 交叉熵

7

我正在使用Keras进行工作,尝试通过使用Keras抽象后端来重写categorical_crossentropy,但我卡住了。

这是我的自定义函数,我只想得到交叉熵的加权和:

def custom_entropy( y_true, y_pred):
    y_pred /= K.sum(y_pred, axis=-1, keepdims=True)

    # clip to prevent NaN's and Inf's
    y_pred = K.clip(y_pred, K.epsilon(), 1 - K.epsilon())

   loss = y_true * K.log(y_pred) 
   loss = -K.sum(loss, -1)

   return loss

在我的程序中,我使用model.predict()生成了一个label_pred
最后,我执行以下操作:
    label_pred = model.predict(mfsc_train[:,:,5])
    cc = custom_entropy(label, label_pred)
    ce = K.categorical_crossentropy(label, label_pred)

I get the following error:

Traceback (most recent call last):
  File "SAMME_train_all.py", line 47, in <module>
    ce = K.categorical_crossentropy(label, label_pred)
  File "C:\Users\gionata\AppData\Local\Programs\Python\Python36\lib
s\keras\backend\tensorflow_backend.py", line 2754, in categorical_c
    axis=len(output.get_shape()) - 1,
AttributeError: 'numpy.ndarray' object has no attribute 'get_shape'

也许您可以告诉我们您希望如何计算它? - Daniel Möller
我用自定义损失编辑了先前的消息。 我尝试使用相同的参数调用它们进行测试(并将prob设置为np.ones()),但基本的交叉熵给出了一个错误:no getShape。 - Gionata Benelli
2个回答

7

Keras后端函数比如K.categorical_crossentropy需要张量作为输入。

从你的问题中无法确定label的类型。但是我们知道model.predict总是返回NumPy ndarrays,因此我们知道label_pred不是一个张量。很容易进行转换,例如(假设label已经是一个张量):

custom_entropy(label, K.constant(label_pred))

由于此函数的输出是张量,要实际评估它,您需要调用:

K.eval(custom_entropy(label, K.constant(label_pred)))

可以选择直接使用model作为操作符,在张量上调用它会生成另一个张量,例如:

label_pred = model(K.constant(mfsc_train[:,:,5]))
cc = custom_entropy(label, label_pred)
ce = K.categorical_crossentropy(label, label_pred)

现在,label_predccce都将成为张量。

2

根据文档提供的信息,参数是张量:

y_true: True labels. TensorFlow/Theano tensor.
y_pred: Predictions. TensorFlow/Theano tensor of the same shape as y_true.

将numpy数组转换为张量应该可以解决这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接