PyTorch 线性层输入维度不匹配
PyTorch Linear layer input dimension mismatch
我在将输入数据传递到 PyTorch 中的线性(全连接层)时遇到此错误:
matrices expected, got 4D, 2D tensors
我完全理解这个问题,因为输入数据的形状是 (N,C,H,W)(来自卷积+MaxPool 层),其中:
- N:数据样本
- C:数据通道
- H,W:高度和宽度
尽管如此,我还是希望 PyTorch 能够完成数据形式的 "reshaping":
- [ N , D1,...Dn] --> [ N, D] 其中 D = D1*D2*....Dn
我尝试重塑 Variable.data,但我读到不推荐使用这种方法,因为渐变会保留以前的形状,而且通常你不应该改变 Variable.data形状。
我很确定框架附带了一个简单的解决方案,但我还没有找到它。
有什么好的解决办法吗?
PD:全连接层的输入大小为 C * H * W
阅读一些 Examples 后我找到了解决方案。这是在不弄乱 forward/backward 传递流程的情况下如何做到这一点:
(_, C, H, W) = x.data.size()
x = x.view( -1 , C * H * W)
一个更通用的解决方案(无论 x 有多少维度都有效)是取所有维度大小的乘积,但第一个维度("batch size"):
n_features = np.prod(x.size()[1:])
x = x.view(-1, n_features)
保存批量大小并在展平中推断另一个维度是很常见的:
batch_size = x.shape[0]
...
x = x.view(batch_size, -1)
我在将输入数据传递到 PyTorch 中的线性(全连接层)时遇到此错误:
matrices expected, got 4D, 2D tensors
我完全理解这个问题,因为输入数据的形状是 (N,C,H,W)(来自卷积+MaxPool 层),其中:
- N:数据样本
- C:数据通道
- H,W:高度和宽度
尽管如此,我还是希望 PyTorch 能够完成数据形式的 "reshaping":
- [ N , D1,...Dn] --> [ N, D] 其中 D = D1*D2*....Dn
我尝试重塑 Variable.data,但我读到不推荐使用这种方法,因为渐变会保留以前的形状,而且通常你不应该改变 Variable.data形状。
我很确定框架附带了一个简单的解决方案,但我还没有找到它。
有什么好的解决办法吗?
PD:全连接层的输入大小为 C * H * W
阅读一些 Examples 后我找到了解决方案。这是在不弄乱 forward/backward 传递流程的情况下如何做到这一点:
(_, C, H, W) = x.data.size()
x = x.view( -1 , C * H * W)
一个更通用的解决方案(无论 x 有多少维度都有效)是取所有维度大小的乘积,但第一个维度("batch size"):
n_features = np.prod(x.size()[1:])
x = x.view(-1, n_features)
保存批量大小并在展平中推断另一个维度是很常见的:
batch_size = x.shape[0]
...
x = x.view(batch_size, -1)