Keras crossentropy

时间:2017-11-29 14:50:32

标签: python keras

我正在与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

在我的计划中,我生成label_predmodel.predict()

最后我做了:

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

我收到以下错误:

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'

2 个答案:

答案 0 :(得分:6)

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都将成为张量。

答案 1 :(得分:2)

documentation中所述,参数是张量:

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

将numpy数组转换为张量应解决它。

相关问题