Python 在执行torch.nn.conv2d操作时,为什么需要从“真”变为“假”?

Python 在执行torch.nn.conv2d操作时,为什么需要从“真”变为“假”?,python,machine-learning,pytorch,cnn,Python,Machine Learning,Pytorch,Cnn,我有一个Unet网络,它接收大脑的MRI图像,目标是分割大脑中的白色物质。图像的形状为256x256x183(重塑为183x256x256)(FLAIR和T1图像)。我遇到的问题是,在将输入发送到Unet网络之前,我需要pytorch张量上的_grad=True,但在一次torch.nn.conv2d操作之后,需要_grad=False。这是一个巨大的问题,因为梯度不会更新和学习 从集合导入订单数据 进口火炬 导入torch.nn作为nn 类UNet(nn.模块): def_uuuinit_uu

我有一个Unet网络,它接收大脑的MRI图像,目标是分割大脑中的白色物质。图像的形状为256x256x183(重塑为183x256x256)(FLAIR和T1图像)。我遇到的问题是,在将输入发送到Unet网络之前,我需要pytorch张量上的_grad=True,但在一次torch.nn.conv2d操作之后,需要_grad=False。这是一个巨大的问题,因为梯度不会更新和学习

从集合导入订单数据
进口火炬
导入torch.nn作为nn
类UNet(nn.模块):
def_uuuinit_uuuu(self,in_通道=3,out_通道=1,init_功能=32):
super(UNet,self)。\uuuu init\uuuuu()
功能=初始功能
self.encoder1=UNet.\u块(在\u通道、特征中,name=“enc1”)
self.pool1=nn.MaxPool2d(内核大小=2,步幅=2)
self.encoder2=UNet.\u块(特征,特征*2,name=“enc2”)
self.pool2=nn.MaxPool2d(内核大小=2,步幅=2)
self.encoder3=UNet.\u块(特征*2,特征*4,name=“enc3”)
self.pool3=nn.MaxPool2d(内核大小=2,步幅=2)
self.encoder4=UNet.\u块(特征*4,特征*8,name=“enc4”)
self.pool4=nn.MaxPool2d(内核大小=2,步幅=2)
self.瓶颈=UNet.\u块(功能*8,功能*16,name=“瓶颈”)
self.upconv4=nn.ConvTranspose2d(
功能*16,功能*8,内核大小=2,步幅=2
)
self.decoder4=UNet.\u块((特征*8)*2,特征*8,name=“dec4”)
self.upconv3=nn.ConvTranspose2d(
功能*8,功能*4,内核大小=2,步幅=2
)
self.decoder3=UNet.\u块((特征*4)*2,特征*4,name=“dec3”)
self.upconv2=nn.ConvTranspose2d(
功能*4,功能*2,内核大小=2,步幅=2
)
self.decoder2=UNet.\u块((特征*2)*2,特征*2,name=“dec2”)
self.upconv1=nn.ConvTranspose2d(
功能*2,功能,内核大小=2,步幅=2
)
self.decoder1=UNet.\u块(特征*2,特征,name=“dec1”)
self.conv=nn.Conv2d(
输入通道=功能,输出通道=输出通道,内核大小=1
)
def前进(自身,x):
打印(x.U.grad)#我觉得很好用

“”
#我对你的代码做了一点修改以解决这个问题。
def前进(自身,x):

print(“encoder1”,x.requires_grad)#如果您只想训练和更新权重,那么训练代码很好,输入根本不需要梯度

真正的问题是这条线

 with torch.set_grad_enabled(is_train == "train"):
因此,如果您不进行训练,您希望禁用渐变。事情是这样的:
is\u train
是一个bool(从这里判断:
def\uu call\uuuu(self,is\u train=False):
),所以比较总是假的,不会设置梯度。把它改成

with torch.set_grad_enabled(is_train):

您会没事的。

我不想更新输入数据,但问题是丢失。backwards()不起作用。它引发错误RuntimeError:张量的元素0不需要grad,也没有grad_fn。我对原始帖子进行了编辑,并发布了培训脚本的源代码。啊,是的。。我完全忘记了那件事。有时人们会忘记最愚蠢和最明显的导致问题的事情。不管怎样,谢谢你指出这一点,哈哈
with torch.set_grad_enabled(is_train):