PyTorch训练DCGAN时256*256图像报target与input尺寸不匹配错误怎么办
DCGAN切换256*256图像训练时形状不匹配错误解决方案
错误原因
该报错核心是判别器(netD)的输出形状与构造的target形状不匹配:
训练6464尺寸图像时,判别器的下采样层数刚好可以将输入下采样到11的特征图,输出为每个样本对应1个0~1的置信度标量,和[batch_size]形状的target匹配。
切换到256*256尺寸后,原判别器的下采样倍率不足,最终输出的是形状为[batch_size, 1, 13, 13]的特征图,展平后每个样本对应169个预测值,和target形状不符,触发BCELoss的报错。
解决方法
方案1:修改判别器结构(推荐)
两种可选修改方式,二选一即可:
- 额外增加2层带步幅的下采样卷积层:256尺寸输入要下采样到1*1需要8次减半操作(2^8=256),如果原适配64尺寸的判别器只有6次下采样,补上2层「带步幅2的卷积+BN+LeakyReLU」结构即可。
- 判别器末尾加全局自适应池化:在判别器最后一层卷积后、Sigmoid激活前,新增
nn.AdaptiveAvgPool2d(1)层,不管输入特征图尺寸多大,直接池化到1*1,无需调整下采样层数,适配性更强。
方案2:训练代码层面修正输出形状
如果不想调整网络结构,直接在训练时对判别器的输出做形状对齐即可,需要修改三处调用netD()后的代码,同时同步调整target的形状:
# 原代码: # output = netD(input) # target = Variable(torch.ones(input.size()[0])) # 修改为: output = netD(input) # 将输出调整为[batch_size, 1]的形状 output = output.view(output.size(0), -1).mean(1, keepdim=True) # 同步调整target为相同形状,避免广播警告 target = Variable(torch.ones(input.size()[0], 1))
三处需要修改的位置分别是:
- 训练判别器用真实图像前向传播后
- 训练判别器用生成图像前向传播后
- 训练生成器用生成图像前向传播后
可选优化
当前代码里使用的Variable在PyTorch 0.4及之后版本已经废弃,可以直接用原生Tensor搭配requires_grad=True使用,不影响现有逻辑。
内容的提问来源于stack exchange,提问作者Mobashshir
相关产品推荐
相关产品推荐

