pytorch的Backward過(guò)程用時(shí)太長(zhǎng)問(wèn)題及解決
pytorch Backward過(guò)程用時(shí)太長(zhǎng)
問(wèn)題描述
使用pytorch對(duì)網(wǎng)絡(luò)進(jìn)行訓(xùn)練的時(shí)候遇到一個(gè)問(wèn)題,forward階段很快(只需要幾毫秒),backward階段卻用時(shí)很長(zhǎng)(需要十多秒)。
導(dǎo)致這個(gè)問(wèn)題的原因很容易被大家忽視,而且網(wǎng)上基本上沒(méi)有直接的解決方案,經(jīng)過(guò)一天的折騰,總算把導(dǎo)致這個(gè)問(wèn)題的原因搞清楚了。
解決方案
導(dǎo)致這個(gè)問(wèn)題的原因在于訓(xùn)練數(shù)據(jù)的淺拷貝,由于backward過(guò)程中的梯度是和模型推理過(guò)程中的張量相關(guān)的,如果這些張量在被模型使用之前沒(méi)有被深拷貝,意味著backward過(guò)程的會(huì)重復(fù)從這些張量的原始內(nèi)存地址中取值,這個(gè)過(guò)程非常耗時(shí)。所以為了避免這個(gè)問(wèn)題,需要養(yǎng)成一個(gè)好習(xí)慣,就是將張量數(shù)據(jù)輸入模型之前進(jìn)行深拷貝
pytorch的深拷貝方式如下:
tensor_a = tensor_b.clone().detach()
Pytorch backward()簡(jiǎn)單理解
backward()是反向傳播求梯度,具體實(shí)現(xiàn)過(guò)程如下
import torch x=torch.tensor([1,2,3],requires_grad=True,dtype=torch.double) y=x**2 z=y.mean() z.backward() print(x.grad)
結(jié)果
tensor([0.6667, 1.3333, 2.0000], dtype=torch.float64)
有幾個(gè)重要的點(diǎn)
1.必須要加上requires_grad=True才能求
2. 一般來(lái)說(shuō),需要標(biāo)量才能求梯度。
3.具體過(guò)程如下:
z是一個(gè)標(biāo)量(1*1矩陣)分別對(duì)x1,x2,x3求偏導(dǎo), 再代入x1,x2,x3的數(shù)值,就是如上程序輸出的結(jié)果
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
深入理解Python虛擬機(jī)中字節(jié)(bytes)的實(shí)現(xiàn)原理及源碼剖析
在本篇文章當(dāng)中主要給大家介紹在?cpython?內(nèi)部,bytes?的實(shí)現(xiàn)原理、內(nèi)存布局以及與?bytes?相關(guān)的一個(gè)比較重要的優(yōu)化點(diǎn)——?bytes?的拼接,需要的可以參考一下2023-03-03Python3.4學(xué)習(xí)筆記之列表、數(shù)組操作示例
這篇文章主要介紹了Python3.4列表、數(shù)組操作,結(jié)合實(shí)例形式分析了Python3.4列表的創(chuàng)建、元素追加、刪除、排序等相關(guān)操作技巧,需要的朋友可以參考下2019-03-03Python的內(nèi)建模塊itertools的使用解析
這篇文章主要介紹了Python的內(nèi)建模塊itertools的使用解析,itertools是python的迭代器模塊,itertools提供的工具相當(dāng)高效且節(jié)省內(nèi)存,Python的內(nèi)建模塊itertools提供了非常有用的用于操作迭代對(duì)象的函數(shù),需要的朋友可以參考下2023-09-09全面解析Python的While循環(huán)語(yǔ)句的使用方法
這篇文章主要介紹了全面解析Python的While循環(huán)語(yǔ)句的使用方法,是Python入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10numpy concatenate數(shù)組拼接方法示例介紹
這篇文章主要介紹了numpy concatenate數(shù)組拼接方法示例介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-057個(gè)關(guān)于Python的經(jīng)典基礎(chǔ)案例
這篇文章主要給大家分享 7個(gè)關(guān)于Python的經(jīng)典基礎(chǔ)案例,列表排序、調(diào)換字典鍵值、刪除列表中的重復(fù)元素、輸出質(zhì)數(shù)、判斷是一年中第幾天、猜數(shù)字、進(jìn)制轉(zhuǎn)換;,需要的朋友可以參考一下2021-11-11Python greenlet和gevent使用代碼示例解析
這篇文章主要介紹了Python greenlet和gevent使用代碼示例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04python字典嵌套字典的情況下找到某個(gè)key的value詳解
這篇文章主要介紹了python字典嵌套字典的情況下找到某個(gè)key的value詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07