在講述with torch.no_grad()前,先從requires_grad講起
requires_grad
在pytorch中奸远,tensor有一個(gè)requires_grad參數(shù)磅氨,如果設(shè)置為True尺栖,則反向傳播時(shí),該tensor就會(huì)自動(dòng)求導(dǎo)烦租。tensor的requires_grad的屬性默認(rèn)為False,若一個(gè)節(jié)點(diǎn)(葉子變量:自己創(chuàng)建的tensor)requires_grad被設(shè)置為True延赌,那么所有依賴它的節(jié)點(diǎn)requires_grad都為True(即使其他相依賴的tensor的requires_grad = False)
x = torch.randn(10, 5, requires_grad = True)
y = torch.randn(10, 5, requires_grad = False)
z = torch.randn(10, 5, requires_grad = False)
w = x + y + z
w.requires_grad
True
volatile
首先說(shuō)明除盏,該用法已經(jīng)被移除,但為了說(shuō)明torch.no_grad挫以,還是需要講解下該作用者蠕。在之前的版本中,tensor(或者說(shuō)variable掐松,以前版本tensor會(huì)轉(zhuǎn)化成variable踱侣,目前該功能也被廢棄,直接使用tensor即可)還有一個(gè)參數(shù)volatile大磺,如果一個(gè)tensor的volatile = True抡句,那么所有依賴他的tensor會(huì)全部變成True,反向傳播時(shí)就不會(huì)自動(dòng)求導(dǎo)了杠愧,因此大大節(jié)約了顯存或者說(shuō)內(nèi)存待榔。
既然一個(gè)tensor既有requires_grad,又有volatile流济,那么當(dāng)兩個(gè)參數(shù)設(shè)置相矛盾時(shí)怎么辦锐锣?volatile=True的優(yōu)先級(jí)高于requires_grad,即當(dāng)volatile = True時(shí)绳瘟,無(wú)論requires_grad是Ture還是False雕憔,反向傳播時(shí)都不會(huì)自動(dòng)求導(dǎo)。volatile可以實(shí)現(xiàn)一定速度的提升稽荧,并節(jié)省一半的顯存橘茉,因?yàn)槠洳恍枰4嫣荻取#╲olatile默認(rèn)為False姨丈,這時(shí)反向傳播是否自動(dòng)求導(dǎo),取決于requires_grad)
with torch.no_grad
上文提到volatile已經(jīng)被廢棄擅腰,替代其功能的就是with torch.no_grad蟋恬。作用與volatile相似,即使一個(gè)tensor(命名為x)的requires_grad = True趁冈,由x得到的新tensor(命名為w-標(biāo)量)requires_grad也為False歼争,且grad_fn也為None,即不會(huì)對(duì)w求導(dǎo)。例子如下所示:
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
引用:https://blog.csdn.net/weixin_43178406/article/details/89517008