我正在使用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)
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,cc并ce都将是张量.
| 归档时间: |
|
| 查看次数: |
356 次 |
| 最近记录: |