python - 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]
这是怎么回事?它应该是损失矩阵(预缩减)与权重的直接乘法。怎么修?
解决方案
超级简单的修复!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)
推荐阅读
- python - 在 python 中,x = y == "true" 的计算顺序是什么
- laravel - Laravel - 登录后的语言环境会话
- visual-studio - 如何在开发使用 Azure AD B2C 进行身份验证的 Blazor Web Assembly 应用程序期间保持登录状态
- javascript - 过滤记录时如何应用动态样式
- javascript - Angular 在给定毫秒后停止发出 api 请求,即使它没有成功
- if-statement - 无论实际值如何,条件始终评估为真
- python - 无法单击选项包装器中的选项 - python selenium
- c# - 使用 DownloadToFileParallelAsync 跟踪更改
- google-fit - 用户 googlefit 步数数据未同步
- javascript - Highcharts 饼图的个别部分没有获得焦点。工具提示不显示在焦点上