我知道这可能在某个地方讨论过,但我找不到它。当在目标和标签之间使用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数组。我应该在这里修复它吗?
我很高兴任何形式的反馈:)如果需要,我也可以提供一个过程的小例子,但我认为这个问题也应该工作,因为它是一个一般性的问题。
1条答案
按热度按时间ars1skjm1#
可能有一些损失函数沿着某个维度聚合,在这种情况下,维度的数量可能很重要,但在大多数情况下,这可能不是真的(即,在分类任务中,这可能大多是真的,其中pytorch损失函数对输入的维度和格式有些特殊)。
也就是说,在较低级别上,pytorch是用C后端实现的,并对某些维度沿着的向量操作进行了优化(例如参见channels first vs channels last computation)。我怀疑从计算时间的Angular 来看,任何此类影响都可以忽略不计。除非你的损失函数本身是计算量很大的输入维度。如果您想探索哪种操作最快,可以测试查看和重塑操作以获得不同的最终形状。
使用view或reshape都可以,显著的区别是
view
在输入不连续时会抛出异常,而reshape
则会优雅地处理这种情况。通常,您可以考虑以下问题:1.在重新构造以匹配维度的过程中,我是否执行任何不可微的操作/在pytorch中没有实现梯度?(显然这些会破坏计算图)。
view
和reshape
的平凡梯度为1,即它们不会改变梯度。如果你不做这些事情,你的最终整形步骤是好的,虽然可能永远-略低于最佳的计算速度。