Pytorch 运行卷积自动编码器RuntimeError时出错:张量的元素0不需要梯度,也没有梯度fn

Pytorch 运行卷积自动编码器RuntimeError时出错:张量的元素0不需要梯度,也没有梯度fn,pytorch,Pytorch,我是一个noob,第一次在PyTorch中创建一个模型。我试图创建一个卷积自动编码器,在运行模型时得到错误。我使用的代码是: 类MyDataset(数据集): 定义初始化(自身、图像路径、目标路径,序列=真): self.image\u路径=image\u路径 self.target\u路径=target\u路径 def变换(自身、图像、目标): #变换为张量 调整大小=变换。调整大小(大小=(23501650)) 图像=调整大小(图像) 目标=调整大小(目标) 灰度=变换。灰度(1) 图像=灰

我是一个noob,第一次在PyTorch中创建一个模型。我试图创建一个卷积自动编码器,在运行模型时得到错误。我使用的代码是:

类MyDataset(数据集):
定义初始化(自身、图像路径、目标路径,序列=真):
self.image\u路径=image\u路径
self.target\u路径=target\u路径
def变换(自身、图像、目标):
#变换为张量
调整大小=变换。调整大小(大小=(23501650))
图像=调整大小(图像)
目标=调整大小(目标)
灰度=变换。灰度(1)
图像=灰度(图像)
目标=灰度(目标)
image=TF.to_张量(image)
目标=TF.to_张量(目标)
返回图像、目标
定义uu获取项目uu(自身,索引):
image=image.open(self.image\u路径[索引])
target=Image.open(self.target\u路径[索引])
x、 y=自我变换(图像、目标)
返回x,y
定义(自我):
返回len(自映像路径)
列车数据=MyDataset(图像路径=列车数据,目标路径=目标数据,列车=真)
testdata=MyDataset(图像路径=测试数据,目标路径=无,序列=假)
火车装载机=数据装载机(火车数据,批量大小=1,随机播放=True,工人数量=4)
test\u loader=DataLoader(testdata,batch\u size=1,shuffle=False,num\u workers=4)
类卷积自动编码器(nn.模块):
定义初始化(自):
super(卷积自动编码器,self)。\uuuu init\uuuu()
self.encoder_block1=nn.顺序(
nn.Conv2d(1,64,3,步幅=1,填充=1),
nn.ReLU(正确),
nn.Conv2d(64,64,3,步幅=1,填充=1),
nn.ReLU(真)
)
self.decoder_block1=nn.Sequential(
nn.ConvTranspose2d(64,64,3,步幅=1,填充=1),
nn.ReLU(正确),
nn.ConvTranspose2d(64,64,3,步幅=1,填充=1),
nn.ReLU(真)
)
self.decoder_block0=nn.Sequential(
nn.ConvTranspose2d(64,1,3,步幅=1,填充=1),
nn.Sigmoid()
)
def前进(自身,x):
x1=自编码器_块1(x)
y1=自译码器_块1(x1)
y0=自译码器_块0(y1)
返回x
device=torch.device(“如果torch.cuda.is可用,则cuda:2(),否则为“cpu”)
打印(设备)
型号=卷积自动编码器()。到(设备)
#损失与优化
学习率=0.001
标准=nn.MSELoss()
optimizer=optim.Adam(model.parameters(),lr=learning\u rate)
params=list(model.parameters())
打印(len(params))
打印(参数[0].size())#conv1的.weight
num_epochs=30
总步进=长度(列车装载机)
对于范围内的历元(num_历元):
对于批处理idx,枚举(列装载机)中的数据:
inp,targ=数据
输入=输入到(设备)
目标=目标到(设备)
输出=型号(inp)
损耗=标准(输出,目标)
模型0_梯度()
loss.backward()
optimizer.step()
#打印统计数据
运行损失+=损失。项目()
如果(批次号+1)%10==0:
打印('Epoch[{}/{}],步骤[{}/{}],丢失:{:.4f}'
.format(历元+1,历元数,i+1,总步长,loss.item())
我得到的全部错误是:

---------------------------------------------------------------------------
运行时错误回溯(上次最近调用)
在里面
13
14型零度梯度()
--->15.损失向后()
16优化器。步骤()
17
~/anaconda3/envs/gautam\u new/lib/python3.6/site-packages/torch/tensor.py in backward(self、gradient、retain\u graph、create\u graph)
91种产品。默认值为“False”。
92         """
--->93火炬。自动标记。向后(自我、梯度、保留图、创建图)
94
95 def寄存器挂钩(自身,挂钩):
~/anaconda3/envs/gautam\u new/lib/python3.6/site packages/torch/autograd/\uuuuu init\uuuuuuuuuuuuuuuuy.py向后(张量、梯度张量、保留图、创建图、梯度变量)
88变量。\u执行\u引擎。向后运行\u(
89张量,梯度张量,保留图,创建图,
--->90 allow_unreachable=True)#allow_unreachable标志
91
92
RuntimeError:张量的元素0不需要梯度,也没有梯度fn
请帮忙。另外,如果可能的话,还可以给我一些建议,让我的模型更深入。我一直在把CUDA从内存错误中弄出来


谢谢。

我无法测试您的模型,但是考虑到错误消息,您的问题的原因在于您的
转发的返回值

当前您返回的是
x
,它是实际的输入而不是输出

def forward(self, x):
    x1 = self.encoder_block1(x)
    y1 = self.decoder_block1(x1)
    y0 = self.decoder_block0(y1)
    return x
因此,要返回输出,您可能需要将返回值表单
x
更改为
y0

def forward(self, x):
    x1 = self.encoder_block1(x)
    y1 = self.decoder_block1(x1)
    y0 = self.decoder_block0(y1)
    return y0

关于记忆:

请不要在一个问题中放太多的问题。假设你在一个问题中有三个完全不同的问题,并且有三个人在那里,他们每个人都能解决你的一个问题,你可能会得到一个答案。因为他们都不能给你一个答案ete回答所有这些问题。
但是如果你把问题分成三个问题,你可能只会得到三个答案,解决所有问题。在许多情况下,这也可以改善问题,因为你可以更具体地解决问题,而不必在问题中写一整部小说。
当然,如果你的问题非常相关,那么你可以你可以把它们放在一个问题中,但这里的情况似乎不是这样。

我想你的
转发
函数仍然有一些副作用导致内存问题的可能性(胡乱猜测-对此一点也不确定)。因此,如果你幸运的话