国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

解決使用copy.deepcopy()拷貝Tensor或model時(shí)報(bào)錯(cuò)只支持用戶顯式創(chuàng)建的Tensor問(wèn)題

這篇具有很好參考價(jià)值的文章主要介紹了解決使用copy.deepcopy()拷貝Tensor或model時(shí)報(bào)錯(cuò)只支持用戶顯式創(chuàng)建的Tensor問(wèn)題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

模型訓(xùn)練過(guò)程中常需邊訓(xùn)練邊做validation或在訓(xùn)練完的模型需要做測(cè)試,通常的做法當(dāng)然是先創(chuàng)建model實(shí)例然后掉用load_state_dict()裝載訓(xùn)練出來(lái)的權(quán)重到model里再調(diào)用model.eval()把模型轉(zhuǎn)為測(cè)試模式,這樣寫對(duì)于訓(xùn)練完專門做測(cè)試時(shí)當(dāng)然是比較合適的,但是對(duì)于邊訓(xùn)練邊做validation使用這種方式就需要寫一堆代碼,如果能使用copy.deepcopy()直接深度拷貝訓(xùn)練中的model用來(lái)做validation顯然是比較簡(jiǎn)潔的寫法,但是由于copy.deepcopy()的限制,寫model里代碼時(shí)如果沒(méi)注意,調(diào)用copy.deepcopy(model)時(shí)可能就會(huì)遇到這個(gè)錯(cuò)誤:Only Tensors created explicitly by the user (graph leaves) support the deepcopy protocol at the moment,詳細(xì)錯(cuò)誤信息如下:

 File "/usr/local/lib/python3.6/site-packages/prc/framework/model/validation.py", line 147, in init_val_model
    val_model = copy.deepcopy(model)
  File "/usr/lib64/python3.6/copy.py", line 180, in deepcopy
    y = _reconstruct(x, memo, *rv)
  File "/usr/lib64/python3.6/copy.py", line 280, in _reconstruct
    state = deepcopy(state, memo)
  File "/usr/lib64/python3.6/copy.py", line 150, in deepcopy
    y = copier(x, memo)
  File "/usr/lib64/python3.6/copy.py", line 240, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/usr/lib64/python3.6/copy.py", line 180, in deepcopy
    y = _reconstruct(x, memo, *rv)
  File "/usr/lib64/python3.6/copy.py", line 306, in _reconstruct
    value = deepcopy(value, memo)
  File "/usr/lib64/python3.6/copy.py", line 180, in deepcopy
    y = _reconstruct(x, memo, *rv)
  File "/usr/lib64/python3.6/copy.py", line 280, in _reconstruct
    state = deepcopy(state, memo)
  File "/usr/lib64/python3.6/copy.py", line 150, in deepcopy
    y = copier(x, memo)
  File "/usr/lib64/python3.6/copy.py", line 240, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/usr/lib64/python3.6/copy.py", line 180, in deepcopy
    y = _reconstruct(x, memo, *rv)
  File "/usr/lib64/python3.6/copy.py", line 306, in _reconstruct
    value = deepcopy(value, memo)
  File "/usr/lib64/python3.6/copy.py", line 180, in deepcopy
    y = _reconstruct(x, memo, *rv)
  File "/usr/lib64/python3.6/copy.py", line 280, in _reconstruct
    state = deepcopy(state, memo)
  File "/usr/lib64/python3.6/copy.py", line 150, in deepcopy
    y = copier(x, memo)
  File "/usr/lib64/python3.6/copy.py", line 240, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/usr/lib64/python3.6/copy.py", line 161, in deepcopy
    y = copier(memo)
  File "/root/.local/lib/python3.6/site-packages/torch/_tensor.py", line 55, in __deepcopy__
    raise RuntimeError("Only Tensors created explicitly by the user "
RuntimeError: Only Tensors created explicitly by the user (graph leaves) support the deepcopy protocol at the moment

這個(gè)錯(cuò)誤簡(jiǎn)單地說(shuō)就是copy.deepcopy()不支持拷貝requires_grad=True的Tensor(在網(wǎng)絡(luò)中一般是非葉子結(jié)點(diǎn)Tensor, grad_fn不為None),開(kāi)始以為真的哪個(gè)地方Tensor的requires_grad沒(méi)有按要求設(shè)置,熬了幾個(gè)夜去檢查調(diào)試網(wǎng)絡(luò)代碼沒(méi)發(fā)現(xiàn)什么線索很郁悶,后來(lái)想既然是copy.deepcopy()里報(bào)錯(cuò)的,源碼也有那就去它里面debug看是拷貝網(wǎng)絡(luò)的那部分時(shí)拋出的Exception吧,折騰了一陣發(fā)現(xiàn)里面這個(gè)地方加breakpoint比較合適:

   if dictiter is not None:
        if deep:
            for key, value in dictiter:
                key = deepcopy(key, memo)
                value = deepcopy(value, memo)
                y[key] = value
        else:
            for key, value in dictiter:
                y[key] = value

我這個(gè)網(wǎng)絡(luò)的結(jié)構(gòu)是使用的python dict方式定義的,運(yùn)行時(shí)使用注冊(cè)機(jī)制動(dòng)態(tài)創(chuàng)建出來(lái)的,既然是dict,這里的key和value就是對(duì)應(yīng)配置文件里的定義網(wǎng)絡(luò)每層結(jié)構(gòu)的dict的key和value,在這里加bp可以比較清楚地跟蹤看到是在哪個(gè)地方導(dǎo)致的拋出Exception,結(jié)果發(fā)現(xiàn)原因是因?yàn)橛袀€(gè)實(shí)現(xiàn)分割功能的head類的內(nèi)部有個(gè)成員變量保存了這層的輸出結(jié)果Tensor用于后面計(jì)算loss,模型每層的輸出數(shù)據(jù)Tensor自然是requires_grad=True,把這個(gè)成員變量去掉,改成forward()輸出結(jié)果,然后在網(wǎng)絡(luò)的主類里接收它并傳入計(jì)算Loss的函數(shù),然后deepcopy(model)就不報(bào)上面的錯(cuò)了!

另外,顯式創(chuàng)建一個(gè)Tensor時(shí)指定requires_grad=True(默認(rèn)是False)并不會(huì)導(dǎo)致copy.deepcopy()報(bào)錯(cuò),不管這個(gè)Tensor是在cpu上還是gpu上,關(guān)鍵是用戶自己創(chuàng)建的Tensor是葉子結(jié)點(diǎn)Tensor,它的grad_fn是None,在這個(gè)Tensor上做切片或者加載到gpu上等操作得到的新的Tensor就不是葉子結(jié)點(diǎn)了,pytorch認(rèn)為requires_grad=Trued的Tensor經(jīng)過(guò)運(yùn)算得到新的Tensor是需要求導(dǎo)的會(huì)自動(dòng)加上grad_fn而不管這個(gè)Tensor是不是網(wǎng)絡(luò)的一部分,這時(shí)再使用copy.deepcopy()深度拷貝新的Tensor時(shí)會(huì)拋出上面的錯(cuò)誤,看完下面的示例就知道了:

>>> t = torch.tensor([1,2,3.5],dtype=torch.float32, requires_grad=True, device='cuda:0')
>>> t
tensor([1.0000, 2.0000, 3.5000], device='cuda:0', requires_grad=True)
>>> x = copy.deepcopy(t)
>>> x
tensor([1.0000, 2.0000, 3.5000], device='cuda:0', requires_grad=True)
>>> t1 = t[:2]
>>> t1
tensor([1., 2.], device='cuda:0', grad_fn=<SliceBackward0>)
>>> x = copy.deepcopy(t1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/python3.8/lib/python3.8/copy.py", line 153, in deepcopy
    y = copier(memo)
  File "/root/.local/lib/python3.8/site-packages/torch/_tensor.py", line 85, in __deepcopy__
    raise RuntimeError("Only Tensors created explicitly by the user "
RuntimeError: Only Tensors created explicitly by the user (graph leaves) support the deepcopy protocol at the moment

>>> t = torch.tensor([1,2,3.5],dtype=torch.float32, requires_grad=True)
>>> t1 = t.cuda()
>>> t1
tensor([1.0000, 2.0000, 3.5000], device='cuda:0', grad_fn=<ToCopyBackward0>)
>>> x = copy.deepcopy(t1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/python3.8/lib/python3.8/copy.py", line 153, in deepcopy
    y = copier(memo)
  File "/root/.local/lib/python3.8/site-packages/torch/_tensor.py", line 85, in __deepcopy__
    raise RuntimeError("Only Tensors created explicitly by the user "
RuntimeError: Only Tensors created explicitly by the user (graph leaves) support the deepcopy protocol at the moment

>>> t = torch.tensor([1,2,3.5],dtype=torch.float32, requires_grad=False)
>>> t
tensor([1.0000, 2.0000, 3.5000])
>>> x = copy.deepcopy(t)
>>> x
tensor([1.0000, 2.0000, 3.5000])
>>> t1 = t[:2]  
>>> t1
tensor([1., 2.])
>>> x = copy.deepcopy(t1)

為何deepcopy()不直接支持有梯度的Tensor,按理要支持復(fù)制一個(gè)當(dāng)時(shí)的瞬間值應(yīng)該也沒(méi)問(wèn)題,看到https://discuss.pytorch.org/t/copy-deepcopy-vs-clone/55022/10這里這個(gè)經(jīng)?;卮饐?wèn)題的胡子哥給了個(gè)猜測(cè):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-802331.html

runtimeerror: only tensors created explicitly by the user (graph leaves) sup,python,deepcopy,Tensor,requires_grad,grad_fn,Powered by 金山文檔
runtimeerror: only tensors created explicitly by the user (graph leaves) sup,python,deepcopy,Tensor,requires_grad,grad_fn,Powered by 金山文檔

到了這里,關(guān)于解決使用copy.deepcopy()拷貝Tensor或model時(shí)報(bào)錯(cuò)只支持用戶顯式創(chuàng)建的Tensor問(wèn)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Python - 拷貝 - 淺拷貝(Shallow Copy)和深拷貝(Deep Copy)

    假設(shè)我以這樣的方式創(chuàng)建一個(gè) 3 x 5 的二維數(shù)組: 然后我修改 a [ 2 ] [ 3 ] a[2][3] a [ 2 ] [ 3 ] 的值為 1 1 1 : 結(jié)果會(huì)發(fā)現(xiàn)數(shù)組 a a a 中第二維坐標(biāo)為 3 3 3 的數(shù)全部被修改為了 1 1 1 ,而沒(méi)有發(fā)生“第一維坐標(biāo)為 2 2 2 的數(shù)全部被改成了 1 1 1 ” 這就涉及到了Python中的拷貝機(jī)制。 Python中

    2023年04月08日
    瀏覽(16)
  • TypeError: can‘t convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to

    在用GPU訓(xùn)練模型時(shí)報(bào)如下的錯(cuò)誤: TypeError: can’t convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first. GPU上的tensor張量無(wú)法轉(zhuǎn)為numpy格式,那我們把它轉(zhuǎn)到CPU上即可。 方法非常簡(jiǎn)單,只需在目標(biāo)張量后面加 .cpu() 即可。 Before: After:

    2024年02月12日
    瀏覽(26)
  • Dockerfile 指令 COPY 拷貝文件夾

    網(wǎng)上查了查資料,這里記錄一下。 ????????今天在編寫 dockerfile 時(shí)使用 COPY 拷貝文件夾時(shí)遇到了意料之外的情況。在此記錄一下正確的使用方法。 ????????今天在通過(guò) dockerfile 將文件夾拷貝到鏡像的時(shí)候發(fā)現(xiàn),是把文件夾下的內(nèi)容拷貝進(jìn)去了。 dockerfile 如下: ????

    2024年01月18日
    瀏覽(27)
  • Kafka的零拷貝技術(shù)Zero-Copy

    Kafka的零拷貝技術(shù)Zero-Copy

    流程步驟: (1)操作系統(tǒng)將數(shù)據(jù)從磁盤文件中讀取到內(nèi)核空間的頁(yè)面緩存; (2)應(yīng)用程序?qū)?shù)據(jù)從內(nèi)核空間讀入用戶空間緩沖區(qū); (3)應(yīng)用程序?qū)⒆x到數(shù)據(jù)寫回內(nèi)核空間并放入socket緩沖區(qū); (4)操作系統(tǒng)將數(shù)據(jù)從socket緩沖區(qū)復(fù)制到網(wǎng)卡接口,此時(shí)數(shù)據(jù)才能通過(guò)網(wǎng)絡(luò)發(fā)送

    2024年02月08日
    瀏覽(20)
  • C++ 慣用法之 Copy-Swap 拷貝交換

    這是“C++ 慣用法”合集的第 3 篇,前面 2 篇分別介紹了 RAII 和 PIMPL 兩種慣用法: RAII: Resouce Acquistion Is Initialization PIMPL:Pointer To Implemetation 正式介紹 Copy-Swap 之前,先看下《劍指 Offer》里的第??題: 如下為類型 CMyString 的聲明,請(qǐng)為該類型添加賦值運(yùn)算符函數(shù)。 這道題目雖

    2024年02月13日
    瀏覽(31)
  • Secure Copy Protocol or SCP - 安全拷貝協(xié)議

    Secure Copy (remote file copy program) The SCP program is a software tool implementing the SCP protocol as a service daemon or client. It is a program to perform secure copying. The SCP server program is typically the same program as the SCP client. The SCP Server software can be installed on a Regular Machine and be configured to only accept SCP Traffic on

    2024年04月14日
    瀏覽(23)
  • 警告UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach

    這個(gè)警告信息是提示在構(gòu)造新的張量時(shí),推薦使用? sourceTensor.clone().detach() ?或? sourceTensor.clone().detach().requires_grad_(True) ,而不是使用? torch.tensor(sourceTensor) ?的方式。 警告信息提到了這個(gè)建議,是因?yàn)樵?PyTorch 中, torch.tensor() ?函數(shù)都會(huì)創(chuàng)建新的張量,并且不與原先的張量

    2024年02月16日
    瀏覽(27)
  • H.266/VVC SCC技術(shù)學(xué)習(xí):幀內(nèi)塊拷貝(Intra block copy, IBC)

    H.266/VVC SCC技術(shù)學(xué)習(xí):幀內(nèi)塊拷貝(Intra block copy, IBC)

    幀內(nèi)塊拷貝 (Intra block copy, IBC) 是 HEVC 針對(duì)屏幕內(nèi)容編碼(Screen content coding)序列的擴(kuò)展工具,它顯著提高了屏幕內(nèi)容序列的編碼效率。 IBC 是一種塊級(jí)編碼模式, IBC 編碼的 CU 被視為除幀內(nèi)或幀間預(yù)測(cè)模式之外的第三預(yù)測(cè)模式。和幀間技術(shù)類似,編碼端執(zhí)行運(yùn)動(dòng)搜索( 塊匹

    2023年04月22日
    瀏覽(20)
  • pytorch model代碼內(nèi)tensor device不一致的問(wèn)題

    在編寫一段處理兩個(gè)tensor的代碼如下,需要在forward函數(shù)內(nèi)編寫函數(shù)創(chuàng)建一個(gè)新的tensor進(jìn)行索引的掩碼計(jì)算 這段代碼報(bào)了這個(gè)錯(cuò)誤 統(tǒng)一下進(jìn)行掩碼計(jì)算的張量的設(shè)備即可

    2024年02月13日
    瀏覽(16)
  • 【四】3D Object Model之創(chuàng)建Creation——clear_object_model_3d()/copy_object_model_3d()算子

    ?????? 歡迎來(lái)到本博客 ?????? ?????? Halcon算子太多,學(xué)習(xí)查找都沒(méi)有系統(tǒng)的學(xué)習(xí)查找路徑,本專欄主要分享Halcon各類算子含義及用法,有時(shí)間會(huì)更新具體案例。 ?????? 具體食用方式:可以點(diǎn)擊本專欄【Halcon算子快速查找】–搜索你要查詢的算子名稱;或者點(diǎn)擊

    2024年02月11日
    瀏覽(19)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包