首页 > 解决方案 > tensorflow中带样本权重的多任务学习——形状问题

问题描述

我正在做序列分类,我有 1、5 个结果的批量大小和可变时间步长(本例中为 14 个)。我的样本重量w与我的标签形状相同y

y = tf.convert_to_tensor(np.ones(shape = (1,14,5)))
w = tf.convert_to_tensor(np.random.uniform(size = (1,14,5)))

y.shape
Out[53]: TensorShape([1, 14, 5])

w.shape
Out[54]: TensorShape([1, 14, 5])

当我尝试通过损失函数运行它时,我收到以下错误:

loss_object = tf.keras.losses.BinaryCrossentropy(from_logits=False)
loss_object(y_true = y, 
            y_pred = y,
            sample_weight = w)

InvalidArgumentError: Can not squeeze dim[2], expected a dimension of 1, got 5 [Op:Squeeze]

这是怎么回事?它应该是损失矩阵(预缩减)与权重的直接乘法。怎么修?

标签: pythontensorflow

解决方案


超级简单的修复!Tensorflow 压缩了样本权重的最后一个维度,因为它们应该应用于每个样本,因此,您需要做的就是沿最后一个轴向权重矩阵添加一个维度:

y = tf.convert_to_tensor(np.ones(shape = (1,14,5)))
w = tf.convert_to_tensor(np.random.uniform(size = (1,14,5,1))) # Change made here
loss_object = tf.keras.losses.BinaryCrossentropy(from_logits=False)
loss_object(y_true = y, 
            y_pred = y,
            sample_weight = w)

您也可以在创建后更改权重矩阵的形状:

w = tf.expand_dims(w, axis=-1)

推荐阅读