我正在尝试编写我的自定义损失函数:我想将 categorical_crossentropy
应用于输入向量的各个部分,然后求和。
假设 y_true, y_pred 是一维向量。
代码:
def custom_loss(y_true, y_pred):
loss_sum= 0.0
for i in range(0,y_true.shape[0],dictionary_dims):
loss_sum+= keras.backend.categorical_crossentropy(y_true[i*dictionary_dims:(i+1)*dictionary_dims], y_pred[i*dictionary_dims:(i+1)*dictionary_dims])
return loss_sum
但是我得到一个错误:
for i in range(0,y_true.shape[0],dictionary_dims):
TypeError: __index__ returned non-int (type NoneType)
那么如何访问输入张量的形状以获得张量的子集呢?
更新: 也试过直接通过tensorflow写loss:
def custom_loss_tf(y_true, y_pred):
print('tf.shape(y_true)',tf.shape(y_true)) #
print('type(tf.shape(y_true))',type(tf.shape(y_true))) #
sys.exit()
loss_sum= 0.0
for i in range(0,y_true.shape[0],dictionary_dims):
loss_sum+= keras.backend.categorical_crossentropy(y_true[i*dictionary_dims:(i+1)*dictionary_dims], y_pred[i*dictionary_dims:(i+1)*dictionary_dims])
return loss_sum
输出:
tf.shape(y_true) Tensor("Shape:0", shape=(2,), dtype=int32)
type(tf.shape(y_true)) <class 'tensorflow.python.framework.ops.Tensor'>
不确定 shape=(2,)
是什么意思,但这不是我所期望的,因为 model.summary()
显示最后一层是(无,26)
:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 80, 120, 3) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 80, 120, 32) 896
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 40, 60, 32) 0
_________________________________________________________________
activation_1 (Activation) (None, 40, 60, 32) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 40, 60, 32) 9248
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 20, 30, 32) 0
_________________________________________________________________
activation_2 (Activation) (None, 20, 30, 32) 0
_________________________________________________________________
conv2d_3 (Conv2D) (None, 20, 30, 64) 18496
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 10, 15, 64) 0
_________________________________________________________________
activation_3 (Activation) (None, 10, 15, 64) 0
_________________________________________________________________
conv2d_4 (Conv2D) (None, 10, 15, 64) 36928
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 5, 7, 64) 0
_________________________________________________________________
activation_4 (Activation) (None, 5, 7, 64) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 2240) 0
_________________________________________________________________
head (Dense) (None, 26) 58266
=================================================================
最佳答案
这里有两件事:
- 如果你想获得张量形状,你应该使用
int_shape
来自keras.backend
的函数。 - 第一个维度设置为批量维度,因此
int_shape(y_true)[0]
将返回批量大小。您应该使用int_shape(y_true)[1]
。
关于python - Keras:如何在自定义损失中获取张量尺寸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45480820/