Pytorch张量,如何切换通道位置 - 运行时错误

Posted

技术标签:

【中文标题】Pytorch张量,如何切换通道位置 - 运行时错误【英文标题】:Pytorch tensor, how to switch channel position - Runtime error 【发布时间】:2020-04-26 03:14:20 【问题描述】:

我的训练数据集如下,其中 X_train 是具有 3 个通道的 3D

X_Train 的形状:(708, 256, 3) Y_Train 的形状:(708, 4)

然后我将它们转换为张量并输入到数据加载器中:

X_train=torch.from_numpy(X_data)
y_train=torch.from_numpy(y_data)
training_dataset = torch.utils.data.TensorDataset(X_train, y_train)
train_loader = torch.utils.data.DataLoader(training_dataset, batch_size=50, shuffle=False)

但是在训练模型时,我收到以下错误: RuntimeError: 给定组=1,大小为 24 3 5 的权重,预期输入 [708, 256, 3] 有 3 个通道,但有 256 个通道

我想这是由于频道的位置?在 Tensorflow 中,通道位置在末尾,但在 PyTorch 中,格式是“Batch Size x Channel x Height x Width”?那么如何交换 x_train 张量中的位置以匹配数据加载器中的预期格式?

class TwoLayerNet(torch.nn.Module):
    def __init__(self):
        super(TwoLayerNet,self).__init__()
        self.conv1 = nn.Sequential(
            nn.Conv1d(3, 3*8, kernel_size=5, stride=1),  
            nn.Sigmoid(),
            nn.AvgPool1d(kernel_size=2, stride=0))
        self.conv2 = nn.Sequential(
            nn.Conv1d(3*8, 12, kernel_size=5, stride=1),
            nn.Sigmoid(),
            nn.AvgPool1d(kernel_size=2, stride = 0))
        #self.drop_out = nn.Dropout()

        self.fc1 = nn.Linear(708, 732) 
        self.fc2 = nn.Linear(732, 4)

    def forward(self, x):
        out = self.conv1(x)
        out = self.conv2(out)
        out = out.reshape(out.size(0), -1)
        out = self.drop_out(out)
        out = self.fc1(out)
        out = self.fc2(out)
        return out

【问题讨论】:

这能回答你的问题吗? No N-dimensional tranpose in PyTorch 【参考方案1】:

使用permute

X_train = torch.rand(708, 256, 3)
X_train = X_train.permute(2, 0, 1)
X_train.shape
# => torch.Size([3, 708, 256])

【讨论】:

感谢它的工作!但我收到此错误:RuntimeError: Given groups=1, weight of size 24 3 5, expected input[3, 708, 256] to have 3 channels, but got 708 channels @NewGirl 使用X_train.unsqueeze(0),您缺少batch 维度。 感谢它的工作!顺便说一句,我还对 y_train 使用了 unsqueeze(0),但是对于损失阶段,如何减小维度?我用了squeeze(1),但是没有用 由于你是做一维卷积,有708个数据点,你需要把你的数据排列成(samples, channels, width),也就是(708, 3, 256)。使用置换。通过取消压缩,您是说只有一个数据点,我猜这不是真的。

以上是关于Pytorch张量,如何切换通道位置 - 运行时错误的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch:将预训练模型从 3 个 RGB 通道更改为 4 个通道后,出现“ValueError:无法优化非叶张量”

Pytorch 展开和折叠:如何将这个图像张量重新组合在一起?

如何在 PyTorch 中将 RGB 图像编码为 n_class One 热张量

在 PyTorch 中将 5D 张量转换为 4D 张量

PyTorch 中的连接张量

如何对两个 PyTorch 量化张量进行矩阵相乘?