我正在与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_pred
至model.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'
答案 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_pred
,cc
和ce
都将成为张量。
答案 1 :(得分:2)
如documentation中所述,参数是张量:
y_true: True labels. TensorFlow/Theano tensor.
y_pred: Predictions. TensorFlow/Theano tensor of the same shape as y_true.
将numpy数组转换为张量应解决它。