Keras:如何在自定义损失中获得张量尺寸?

mrgloom:

我正在尝试编写我的自定义损失函数:我想应用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直接写损失:

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()表明最后一层是(None, 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
=================================================================
MarcinMożejko:

这里有两件事:

  1. 如果要获得张量形状,则应使用中的int_shape函数keras.backend
  2. 第一维设置为批次尺寸,因此int_shape(y_true)[0]将返回您的批次尺寸。您应该使用int_shape(y_true)[1]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在keras中测试自定义损失函数?

如何在tf.keras自定义损失函数中触发python函数?

如何从Keras中的自定义损失函数获取结果?

Keras中的自定义损失函数

如何在Tensorflow中编写自定义损失函数?

在自定义损失函数中重塑张量

自定义损失函数中的张量索引

如何在Keras中包装自定义TensorFlow损失函数?

如何在自定义Keras / Tensorflow损失函数中对值进行排序?

如何在自定义损失函数中遍历张量?

Keras自定义损失

在Keras中的自定义损失函数中重塑张量

如何在简单的数学运算中定义keras自定义损失函数

在Keras中设计自定义损失函数(在Keras中以张量为单位的索引)

如何在TensorFlow中的自定义损失函数中标准化张量?

Keras自定义损失函数打印张量值

如何在发生器提供的Keras自定义损失函数中访问样本权重?

如何在Keras模型的自定义损失中访问Tensor的内容

如何在Keras自定义损失函数中使用张量?

如何在Keras的自定义批处理培训中获得每个时期的损失?

张量流中具有循环的自定义损失

在自定义损失函数中迭代张量

如何在张量流中表达此自定义损失函数?

张量流中的自定义损失函数

Keras 中自定义损失的输出

如何在 Keras 中实现自定义加权 MSE 损失函数?

如何在 keras 中创建自定义损失函数?(自定义加权二元交叉熵)

您如何在 Keras 中编译自定义损失函数,将预测与来自输入张量的信息连接起来?

涉及卷积的张量流中的自定义损失函数