0

我正在尝试基于预训练的 Inception_v3 创建一个生成网络。

1)我修复了模型中的所有权重

2) 创建一个大小为 (2, 3, 299, 299) 的变量

3) 创建大小为 (2, 1000) 的目标,我希望我的最终层激活通过优化变量变得尽可能接近。(我没有将batchsize设置为1,因为与VGG16不同,Inception_v3不采用batchsize=1,但这不是重点)。

以下代码应该可以工作,但给了我错误:«RuntimeError:梯度计算所需的变量之一已被就地操作修改»。

# minimalist code with Inception_v3 that throws the error:

import torch
from torch.autograd import Variable
import torch.optim as optim
import torch.nn as nn
import torchvision

torch.set_default_tensor_type('torch.FloatTensor')
Iv3 = torchvision.models.inception_v3(pretrained=True)
for i in Iv3.parameters():
    i.requires_grad = False

criterion = nn.CrossEntropyLoss()

x = Variable(torch.randn(2, 3, 299, 299), requires_grad=True)
target = torch.empty(2, dtype=torch.long).random_(1000)

output = Iv3(x)
loss = criterion(output[0], target)
loss.backward()

print(x.grad)

这很奇怪,因为如果我对 VGG16 做同样的事情,一切正常:

# minimalist working code with VGG16:

import torch
from torch.autograd import Variable
import torch.optim as optim
import torch.nn as nn
import torchvision

# torch.cuda.empty_cache()
# vgg16 = torchvision.models.vgg16(pretrained=True).cuda()
# torch.set_default_tensor_type('torch.cuda.FloatTensor')

torch.set_default_tensor_type('torch.FloatTensor')
vgg16 = torchvision.models.vgg16(pretrained=True)
for i in vgg16.parameters():
    i.requires_grad = False

criterion = nn.CrossEntropyLoss()

x = Variable(torch.randn(2, 3, 229, 229), requires_grad=True)
target = torch.empty(2, dtype=torch.long).random_(1000)

output = vgg16(x)
loss = criterion(output, target)
loss.backward()

print(x.grad)

请帮忙。

4

1 回答 1

1

感谢@iacolippo,问题得到解决。原来问题是由于 Pytorch 1.0.0。Pytorch 0.4.1 没问题。尽管。

于 2019-05-15T19:57:42.617 回答