Python 卷积层有多少权重?

Python 卷积层有多少权重?,python,pytorch,conv-neural-network,Python,Pytorch,Conv Neural Network,我有一个简单的卷积网络: import torch.nn as nn class model(nn.Module): def __init__(self, ks=1): super(model, self).__init__() self.conv1 = nn.Conv2d(in_channels=4, out_channels=32, kernel_size=ks, stride=1) self.fc1 = nn.Linear(8*8*32*ks, 64)

我有一个简单的卷积网络:

import torch.nn as nn 

class model(nn.Module):
def __init__(self, ks=1):
    super(model, self).__init__()
    self.conv1 = nn.Conv2d(in_channels=4, out_channels=32, kernel_size=ks, stride=1)

    self.fc1 = nn.Linear(8*8*32*ks, 64)
    self.fc2 = nn.Linear(64, 64)

def forward(self, x):
    x = F.relu(self.conv1(x))
    x = x.view(x.size(0), -1)
    x = F.relu(self.fc1(x))
    x = self.fc2(x)
    return x

cnn = model(1)
因为内核大小是1,输出通道是32,所以我假设这个层中应该有32*1*1个权重。但是,当我问pytorch关于权重矩阵cnn.conv1.weight.shape的形状时,它返回torch.Size[32,4,1,1]。为什么输入通道的数量与conv2d层的重量有关


我遗漏了什么吗?

这很重要,因为您正在对图像进行2D卷积,这意味着filterkernel的深度必须等于in_channelspytorch为您设置的数量,因此真正的内核大小是[in_channels,1,1]。另一方面,我们可以说out_channels number是内核的数量,因此权重的数量=内核的数量*内核的大小=out_channels*in_channels*内核的大小。这是带有3D输入的2D conv

这很重要,因为您正在对图像进行2D卷积,这意味着过滤器内核的深度必须等于in_channelspytorch为您设置的数量,因此真正的内核大小为[in_channels,1,1]。另一方面,我们可以说out_channels number是内核的数量,因此权重的数量=内核的数量*内核的大小=out_channels*in_channels*内核的大小。这是带有3D输入的2D conv

我没有设置任何内容时,为什么过滤器需要深度?您在选择Conv2d时设置了深度。您正在告诉pytorch将内核深度设置为in_通道,以便完成计算。如果选择Conv3d,则conv1.weight.shape的结果将是torch.Size[32,1,1,1],如果选择Conv1d,则conv1.weight.shape的结果将是torch.Size[32,4,wedth,1]或torch.Size[32,1,1,height]检查我添加到回答中的图像为什么我没有设置任何内容时过滤器需要深度?您在选择Conv2d时设置了深度。您正在告诉pytorch将内核深度设置为in_通道,以便完成计算。如果选择Conv3d,则conv1.weight.shape的结果将是torch.Size[32,1,1,1],如果选择Conv1d,则conv1.weight.shape的结果将是torch.Size[32,4,wedth,1]或torch.Size[32,1,1,1,1]检查我添加到答案中的图像