我申请torch.nn.DataParallel
网络。网络用于分段,所有模块均由torch.nn.functional
代替构建torch.nn
。所以接下来,我需要将图像和权重输入网络:net(images, net.parameters())
。详细过程,例如。卷积运算:x = F.conv2d(x, w, b, stride=param[4], padding=param[5], dilation=param[6])
,我需要输入权重w
和偏差b
提取net.parameters()
但是,当我使用torch.nn.DataParallel
:
device_ids = [0, 1]
net_D = torch.nn.DataParallel(net_D, device_ids=device_ids).cuda()
,返回net.parameters()
将是 a GeneratorType
,它不能复制到 gpu 设备 1(我使用 2 GPU:设备 0 和 1 进行训练),错误是:
File "/home/xcy/UNet-MAML/DLinkNet/DLinkNet_model.py", line 107, in forward
x = F.conv2d(x, w, b, stride=param[4], padding=param[5], dilation=param[6])
RuntimeError: Expected tensor for argument #1 'input' to have the same device as tensor for argument #2 'weight'; but device 1 does not equal 0 (while checking arguments for cudnn_convolution)
我尝试使用weights.to('cuda:1')
,但似乎是因为权重的类型<class 'torch.nn.parameter.Parameter'>
不是torch.Tensor
,在这样做之后,权重仍然存在cuda:0
。
我也尝试制作net.parameters()
一个列表并将其输入到网络中,伪代码:
net(images, generator_to_list(net.parameters()))
但是当处理网络时torch.nn.DataParallel
,图像的第一维在第一维上被分割,图像在每个 GPU 上的形状从 [4, 3, 224, 224] 到 [2, 3, 224, 224](批量大小为 4 和使用 2 个 GPU)。然而,权重也在第一维上被分割,例如。一个 conv 权重形状为 [64, 3, 7, 7],当向前时,它变为 [32, 3, 7, 7]。
所以似乎进退两难了,list和generator都不能输入网络?我做了一个few-shot分割任务,参考了MAML算法。