Pytorch中目标和标签的尺寸

ia2d9nvy  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(140)

我知道这可能在某个地方讨论过,但我找不到它。当在目标和标签之间使用pytorch时,我总是有一个形状的missmatch。对于64的批量大小,我会得到[64, 1]的目标和[64]的标签。我总是在损失函数中使用label.view(-1, 1)来解决这个问题。
我想知道是否有一个“最好的方法”来解决这个问题。因为我也可以使用target.view(-1)来获得相同的结果。或者我甚至可以将网络中的输出更改为output.view(-1)。也许使用像.reshape()这样的东西也更好?
错误匹配可能来自dataloader内部,它将y_train,y_test作为Series而不是dataframe(从y = X.pop(target_name)开始)。因此执行y_train.values将给予一个1D数组。我应该在这里修复它吗?
我很高兴任何形式的反馈:)如果需要,我也可以提供一个过程的小例子,但我认为这个问题也应该工作,因为它是一个一般性的问题。

ars1skjm

ars1skjm1#

可能有一些损失函数沿着某个维度聚合,在这种情况下,维度的数量可能很重要,但在大多数情况下,这可能不是真的(即,在分类任务中,这可能大多是真的,其中pytorch损失函数对输入的维度和格式有些特殊)。
也就是说,在较低级别上,pytorch是用C后端实现的,并对某些维度沿着的向量操作进行了优化(例如参见channels first vs channels last computation)。我怀疑从计算时间的Angular 来看,任何此类影响都可以忽略不计。除非你的损失函数本身是计算量很大的输入维度。如果您想探索哪种操作最快,可以测试查看和重塑操作以获得不同的最终形状。
使用view或reshape都可以,显著的区别是view在输入不连续时会抛出异常,而reshape则会优雅地处理这种情况。通常,您可以考虑以下问题:
1.在重新构造以匹配维度的过程中,我是否执行任何不可微的操作/在pytorch中没有实现梯度?(显然这些会破坏计算图)。

  1. viewreshape的平凡梯度为1,即它们不会改变梯度。
    如果你不做这些事情,你的最终整形步骤是好的,虽然可能永远-略低于最佳的计算速度。

相关问题