class NLayerDiscriminator(nn.Module): def init(self, input_nc=3, ndf=64, n_layers=3, norm_layer=nn.BatchNorm2d, use_sigmoid=False, use_parallel=True): super(NLayerDiscriminator, self).init() self.use_parallel = use_parallel if type(norm_layer) == functools.partial: use_bias = norm_layer.func == nn.InstanceNorm2d else: use_bias = norm_layer == nn.InstanceNorm2d kw = 4 padw = int(np.ceil((kw - 1) / 2)) sequence = [ nn.Conv2d(input_nc, ndf, kernel_size=kw, stride=2, padding=padw), nn.LeakyReLU(0.2, True) ] nf_mult = 1 for n in range(1, n_layers): nf_mult_prev = nf_mult nf_mult = min(2 ** n, 8) if n == 1: num_filters = ndf * nf_mult self.conv1 = nn.Conv2d(4 * num_filters, num_filters, kernel_size=3, padding=1) self.conv_offset1 = nn.Conv2d(512, 18, kernel_size=3, stride=1, padding=1) init_offset1 = torch.Tensor(np.zeros([18, 512, 3, 3])) self.conv_offset1.weight = torch.nn.Parameter(init_offset1) self.conv_mask1 = nn.Conv2d(512, 9, kernel_size=3, stride=1, padding=1) init_mask1 = torch.Tensor(np.zeros([9, 512, 3, 3]) + np.array([0.5])) self.conv_mask1.weight = torch.nn.Parameter(init_mask1) sequence += [ torchvision.ops.DeformConv2d(ndf * nf_mult_prev, ndf * nf_mult, kernel_size=kw, stride=2, padding=padw, bias=use_bias), norm_layer(ndf * nf_mult), nn.LeakyReLU(0.2, True) ] nf_mult_prev = nf_mult nf_mult = min(2 ** n_layers, 8) sequence += [ torchvision.ops.DeformConv2d(ndf * nf_mult_prev, ndf * nf_mult, kernel_size=kw, stride=1, padding=padw, bias=use_bias), norm_layer(ndf * nf_mult), nn.LeakyReLU(0.2, True), nn.Conv2d(ndf * nf_mult, 1, kernel_size=kw, stride=1, padding=padw) ] if use_sigmoid: sequence += [nn.Sigmoid()] self.model = nn.Sequential(*sequence) def forward(self, input): offset1 = self.conv_offset1(input) mask1 = self.conv_mask1(input) input = torch.cat([input, offset1, mask1], dim=1) return self.model(input),运行上述代码出现错误:RuntimeError: Given groups=1, weight of size [18, 512, 3, 3], expected input[1, 3, 512, 512] to have 512 channels, but got 3 channels instead,如何修改,给出代码
时间: 2023-08-22 08:05:09 浏览: 129
5G 3GPP标准协议中英文对照翻译 23222-g50 功能架构和信息流,以支持3GPP北向API的通用API框架.docx
根据错误提示,可以发现是因为 `conv_offset1` 的输入通道数为 512,但是 `input` 的通道数为 3。因此需要将 `conv_offset1` 的输入通道数修改为 3。同时,根据代码中的注释,`num_filters` 应该为 `ndf * nf_mult_prev`,因此需要将 `num_filters` 的计算公式修改为 `ndf * nf_mult_prev * 4`。修改后的代码如下:
```
class NLayerDiscriminator(nn.Module):
def __init__(self, input_nc=3, ndf=64, n_layers=3, norm_layer=nn.BatchNorm2d, use_sigmoid=False, use_parallel=True):
super(NLayerDiscriminator, self).__init__()
self.use_parallel = use_parallel
if type(norm_layer) == functools.partial:
use_bias = norm_layer.func == nn.InstanceNorm2d
else:
use_bias = norm_layer == nn.InstanceNorm2d
kw = 4
padw = int(np.ceil((kw - 1) / 2))
sequence = [
nn.Conv2d(input_nc, ndf, kernel_size=kw, stride=2, padding=padw),
nn.LeakyReLU(0.2, True)
]
nf_mult = 1
for n in range(1, n_layers):
nf_mult_prev = nf_mult
nf_mult = min(2 ** n, 8)
if n == 1:
num_filters = ndf * nf_mult_prev * 4
self.conv1 = nn.Conv2d(num_filters, num_filters, kernel_size=3, padding=1)
self.conv_offset1 = nn.Conv2d(3, 18, kernel_size=3, stride=1, padding=1)
init_offset1 = torch.Tensor(np.zeros([18, 3, 3, 3]))
self.conv_offset1.weight = torch.nn.Parameter(init_offset1)
self.conv_mask1 = nn.Conv2d(3, 9, kernel_size=3, stride=1, padding=1)
init_mask1 = torch.Tensor(np.zeros([9, 3, 3, 3]) + np.array([0.5]))
self.conv_mask1.weight = torch.nn.Parameter(init_mask1)
sequence += [
torchvision.ops.DeformConv2d(ndf * nf_mult_prev, ndf * nf_mult, kernel_size=kw, stride=2, padding=padw, bias=use_bias),
norm_layer(ndf * nf_mult),
nn.LeakyReLU(0.2, True)
]
nf_mult_prev = nf_mult
nf_mult = min(2 ** n_layers, 8)
sequence += [
torchvision.ops.DeformConv2d(ndf * nf_mult_prev, ndf * nf_mult, kernel_size=kw, stride=1, padding=padw, bias=use_bias),
norm_layer(ndf * nf_mult),
nn.LeakyReLU(0.2, True),
nn.Conv2d(ndf * nf_mult, 1, kernel_size=kw, stride=1, padding=padw)
]
if use_sigmoid:
sequence += [nn.Sigmoid()]
self.model = nn.Sequential(*sequence)
def forward(self, input):
offset1 = self.conv_offset1(input)
mask1 = self.conv_mask1(input)
input = torch.cat([input, offset1, mask1], dim=1)
return self.model(input)
```
阅读全文