pytorch 中的with torch.no_grad()

本文介绍了如何在PyTorch中使用with torch.no_grad()来避免不必要的梯度计算,提高代码效率。通过实例讲解了with语句的工作原理,并详细阐述了requires_grad和no_grad的作用。
摘要由CSDN通过智能技术生成

pytorch 中的with torch.no_grad():

在pytorch写的网络中,with torch.no_torch():非常常见。

首先,关于python中的with:

with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的”清理“操作,释放资源,比如文件使用后自动关闭/线程中锁的自动获取和释放等。

例如:

file = open("1.txt")
data =file.read()
file.close()

存在的问题如下:

(1)文件读取发生异常,但没有进行任何处理;

(2)可能忘记关闭文件句柄

改进:

try:
    f = open('1.txt)
 except:
             print("fail to open")
             exit(-1)
try:
             do somthing
except:
             do something 
finally:
             f.close()

虽然这段代码运行良好,但是比较冗长。而使用with的话,能够减少冗长,还能自动处理上下文环境产生的异常。如下面代码:

with open('1.txt') as f:
    data = f.read()

总结with工作原理:

(1)紧跟with后面的语句被求值后,返回对象的"–enter–()"方法被调用,这个方法的返回值将被复制给as 后面的变量。

(2)当with后面的代码块全部被执行完之后,见调用前面返回对象的"–exit()"方法。

关于torch.no_grad()

首先从requries_grad讲起:

requires_grad

在pytorch中,tensor有一个requires_grad参数,如果设置为True,则反向传播时,该tensor就会自动求导。tensor的requires_grad的属性默认为False,如哦一个节点(叶子变量:自己创建的tensor),requries_grad被设置为True,那么所有依赖它的节点requires_grad都会被设置为True(即使其他相依赖的tensor的requires_grad=False)

当requires_grad设置为False,反向传播时就不会自动求导,因此大大节约了显存或者说是内存。

with torch.no_grad()的作用

在该模块下,所有计算得出的tensor的requires_grad=True,在with torch.no_grad计算,得到x的新tensor(命名为w-标量)requires_grad也为False,且grad_fn也为None,即不会对w求导,例子下所示:

x = torch.randn(10, 5, requires_grad = True)
y = torch.randn(10, 5, requires_grad = True)
z = torch.randn(10, 5, requires_grad = True)
with torch.no_grad():
    w = x + y + z
    print(w.requires_grad)
    print(w.grad_fn)
print(w.requires_grad)

>>>False
>>>None
>>>False
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值