【问题标题】:RuntimeError: Given groups=1, weight of size [32, 1, 3, 3], expected input[1, 3, 6, 7] to have 1 channels, but got 3 channels insteadRuntimeError: 给定组=1,大小为 [32, 1, 3, 3] 的权重,预期输入 [1, 3, 6, 7] 有 1 个通道,但有 3 个通道
【发布时间】:2021-03-11 09:37:40
【问题描述】:

有 6x7 numpy 数组:

<class 'numpy.ndarray'>
[[[0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]]]

模型正在正常训练,当它被传递到这个网络时:

class Net(BaseFeaturesExtractor):
    def __init__(self, observation_space: gym.spaces.Box, features_dim: int = 256):
        super(Net, self).__init__(observation_space, features_dim)
        # We assume CxHxW images (channels first)
        # Re-ordering will be done by pre-preprocessing or wrapper
        # n_input_channels = observation_space.shape[0]
        n_input_channels = 1
        print("Input channels:", n_input_channels)
        self.cnn = nn.Sequential(
            nn.Conv2d(n_input_channels, 32, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=0),
            nn.ReLU(),
            nn.Flatten(),
        )

        # Compute shape by doing one forward pass
        with th.no_grad():
            n_flatten = self.cnn(
                th.as_tensor(observation_space.sample()[None]).float()
            ).shape[1]

        self.linear = nn.Sequential(nn.Linear(n_flatten, features_dim), nn.ReLU())

    def forward(self, observations: th.Tensor) -> th.Tensor:
        return self.linear(self.cnn(observations))

6x7 numpy 数组修改为 3x6x7 numpy 数组:

<class 'numpy.ndarray'>

[[[0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]]

 [[0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]]

 [[0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [1 1 1 1 1 1 1]]]

修改数组后报错:

RuntimeError:给定组=1,大小为 [32, 1, 3, 3] 的权重,预期 input[1, 3, 6, 7] 有 1 个通道,但有 3 个通道

为了解决这个问题,我尝试过改变频道数:

n_input_channels = 3

但是,现在它显示了这个错误:

RuntimeError:给定组=1,大小为 [32, 3, 3, 3] 的权重,预期 input[1, 1, 6, 7] 有 3 个通道,但有 1 个通道

如何让网络接受 3x6x7 数组?

更新: 我提供了更多代码来说明我的情况:

6x7 输入数组案例:

...
board = np.array(self.obs['board']).reshape(1, self.rows, self.columns)
# board = board_3layers(self.obs.mark, board)
print(type(board))
print(board)
return board

输出:

<class 'numpy.ndarray'>
[[[0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]]]

通道数为 3:

n_input_channels = 1

它正在工作。

我正在尝试将数组修改为 3x6x7:

board = np.array(self.obs['board']).reshape(1, self.rows, self.columns)
board = board_3layers(self.obs.mark, board)
print(type(board))
print(board)
return board

输出:

<class 'numpy.ndarray'>
[[[0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]]

 [[0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]]

 [[0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [0 0 0 0 0 0 0]
  [1 1 1 1 1 1 1]]]

通道数为 3:

    n_input_channels = 3

我不明白为什么会显示此错误:

RuntimeError: Given groups=1, weight of size [32, 3, 3, 3], expected input[1, 1, 6, 7] to have 3 channels, but got 1 channels instead

【问题讨论】:

    标签: numpy pytorch


    【解决方案1】:

    您的模型可以使用任一 1 通道输入或 3 通道输入,但不能同时使用。

    如果设置n_input_channels=1,则可以使用1x6x7 输入数组。
    如果设置n_input_channels=3,则可以使用3x6x7 输入数组。

    您必须选择其中一个选项 - 您不能同时拥有它们。

    【讨论】:

    • 感谢您的回答。我想使用 3x6x7 输入数组。正如我所写的,我收到错误:RuntimeError: Given groups=1, weight of size [32, 3, 3, 3], expected input[1, 1, 6, 7] to have 3 channels, but got 1而是频道。我想让网络接受 3x6x7 输入数组
    • @JoeRakhimov 您设置了n_input_channels=3,但您使用的输入数组是6x7 并且不是 3x6x7 - 这就是您收到的错误消息。
    • 我想我使用的是 3x6x7 输入数组。我已经添加了代码,我是如何做到的。请查看更新部分
    • 再次感谢您的回答,问题出在其他地方。我有这个:形状=(1,self.rows,self.columns)。改成这个形状=(3, self.rows, self.columns)。现在它正在工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 2021-04-19
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    相关资源
    最近更新 更多