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

标签 python tensorflow neural-network deep-learning keras

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

最佳答案

这里有两件事:

  1. 如果你想获得张量形状,你应该使用 int_shape来自 keras.backend 的函数。
  2. 第一个维度设置为批量维度,因此 int_shape(y_true)[0] 将返回批量大小。您应该使用 int_shape(y_true)[1]

关于python - Keras:如何在自定义损失中获取张量尺寸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45480820/

相关文章:

python - TensorFlow CNN 教程 : How to edit top layer to be locally connected?

python - "ImportError: libcublas.so.10.0"仅在使用 GUI 时用于 Tensorflow

neural-network - Tensorflow:检索元图时修改占位符的形状

Python BeautifulSoup 相当于 lxml make_links_absolute

python - Redis 与 Twemproxy 对比 memcached

python - sympy 矩阵真的那么慢吗?

javascript - brain.js 神经网络的正确训练

python - 如何使用点 "."访问字典成员?

python - 为什么即使我设置了随机种子也无法在 Keras 中获得可重现的结果?

machine-learning - 如何绘制日志文件?