Keras crossentropy

Gio*_*lli 5 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
Run Code Online (Sandbox Code Playgroud)

在我的程序中,我生成一个label_predto to model.predict().

最后我做了:

    label_pred = model.predict(mfsc_train[:,:,5])
    cc = custom_entropy(label, label_pred)
    ce = K.categorical_crossentropy(label, label_pred)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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'
Run Code Online (Sandbox Code Playgroud)

tia*_*iao 6

Keras后端功能如此K.categorical_crossentropy期待张量.

从你的问题来看,什么类型并不明显label.但是,我们知道model.predict总是返回NumPy ndarrays,所以我们知道label_pred不是张量.它很容易转换,例如(假设label已经是张量),

custom_entropy(label, K.constant(label_pred))
Run Code Online (Sandbox Code Playgroud)

由于这个函数的输出是一个张量,为了实际评估它,你打电话

K.eval(custom_entropy(label, K.constant(label_pred)))
Run Code Online (Sandbox Code Playgroud)

或者,您可以只使用modelop作为操作,并在张量上调用它会产生另一个缩写,即

label_pred = model(K.constant(mfsc_train[:,:,5]))
cc = custom_entropy(label, label_pred)
ce = K.categorical_crossentropy(label, label_pred)
Run Code Online (Sandbox Code Playgroud)

现在label_pred,ccce都将是张量.