pytorch中.numpy()item()cpu()detach()以及.data的使用方法_第1頁(yè)
pytorch中.numpy()item()cpu()detach()以及.data的使用方法_第2頁(yè)
pytorch中.numpy()item()cpu()detach()以及.data的使用方法_第3頁(yè)
pytorch中.numpy()item()cpu()detach()以及.data的使用方法_第4頁(yè)
pytorch中.numpy()item()cpu()detach()以及.data的使用方法_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第pytorch中.numpy()、.item()、.cpu()、.detach()以及.data的使用方法目錄.numpy().item().cpu().detach()和.data(重點(diǎn))補(bǔ)充:關(guān)于.data和.cpu().data的各種操作總結(jié)

.numpy()

Tensor.numpy()將Tensor轉(zhuǎn)化為ndarray,這里的Tensor可以是標(biāo)量或者向量(與item()不同)轉(zhuǎn)換前后的dtype不會(huì)改變

a=torch.tensor([[1.,2.]])

a_numpy=a.numpy()#[[1.,2.]]

.item()

將一個(gè)Tensor變量轉(zhuǎn)換為python標(biāo)量(intfloat等)常用于用于深度學(xué)習(xí)訓(xùn)練時(shí),將loss值轉(zhuǎn)換為標(biāo)量并加,以及進(jìn)行分類(lèi)任務(wù),計(jì)算準(zhǔn)確值值時(shí)需要

optimizer.zero_grad()

outputs=model(data)

loss=F.cross_entropy(outputs,label)

#計(jì)算這一個(gè)batch的準(zhǔn)確率

acc=(outputs.argmax(dim=1)==label).sum().cpu().item()/len(labels)#這里也用到了.item()

loss.backward()

optimizer.step()

train_loss+=loss.item()#這里用到了.item()

train_acc+=acc

.cpu()

將數(shù)據(jù)的處理設(shè)備從其他設(shè)備(如.cuda()拿到cpu上),不會(huì)改變變量類(lèi)型,轉(zhuǎn)換后仍然是Tensor變量。

.detach()和.data(重點(diǎn))

.detach()就是返回一個(gè)新的tensor,并且這個(gè)tensor是從當(dāng)前的計(jì)算圖中分離出來(lái)的。但是返回的tensor和原來(lái)的tensor是共享內(nèi)存空間的。

舉個(gè)例子來(lái)說(shuō)明一下detach有什么用。如果A網(wǎng)絡(luò)的輸出被喂給B網(wǎng)絡(luò)作為輸入,如果我們希望在梯度反傳的時(shí)候只更新B中參數(shù)的值,而不更新A中的參數(shù)值,這時(shí)候就可以使用detach()

a=A(input)

a=a.deatch()#或者a.detach_()進(jìn)行in_place操作

out=B(a)

loss=criterion(out,labels)

loss.backward()

Tensor.data和Tensor.detach()一樣,都會(huì)返回一個(gè)新的Tensor,這個(gè)Tensor和原來(lái)的Tensor共享內(nèi)存空間,一個(gè)改變,另一個(gè)也會(huì)隨著改變,且都會(huì)設(shè)置新的Tensor的requires_grad屬性為False。這兩個(gè)方法只取出原來(lái)Tensor的tensor數(shù)據(jù),丟棄了grad、grad_fn等額外的信息。

tensor.data是不安全的,因?yàn)閤.data不能被autograd追蹤求微分

這是為什么呢?我們對(duì).data進(jìn)行進(jìn)一步探究

importtorch

a=torch.tensor([4.,5.,6.],requires_grad=True)

print("a",a)

out=a.sigmoid()

print("out",out)

print(out.requires_grad)#在進(jìn)行.data前仍為true

result=out.data#共享變量,同時(shí)將requires_grad設(shè)置為false

result.zero_()#改變c的值,原來(lái)的out也會(huì)改變

print("result",result)

print("out",out)

out.sum().backward()#對(duì)原來(lái)的out求導(dǎo),

print(a.grad)#不會(huì)報(bào)錯(cuò),但是結(jié)果卻并不正確

'''運(yùn)行結(jié)果為:

atensor([4.,5.,6.],requires_grad=True)

outtensor([0.9820,0.9933,0.9975],grad_fn=SigmoidBackward0)

resulttensor([0.,0.,0.])

outtensor([0.,0.,0.],grad_fn=SigmoidBackward0)

tensor([0.,0.,0.])

由于更改分離之后的變量值result,導(dǎo)致原來(lái)的張量out的值也跟著改變了,但是這種改變對(duì)于autograd是沒(méi)有察覺(jué)的,它依然按照求導(dǎo)規(guī)則來(lái)求導(dǎo),導(dǎo)致得出完全錯(cuò)誤的導(dǎo)數(shù)值卻渾然不知。

那么我們繼續(xù)看看.detach()

可以看到將.data改為.detach()后程序立馬報(bào)錯(cuò),阻止了非法的修改,安全性很高

我們需要記住的就是:

.data是一個(gè)屬性,二.detach()是一個(gè)方法;.data是不安全的,.detach()是安全的。

補(bǔ)充:關(guān)于.data和.cpu().data的各種操作

先上圖

仔細(xì)分析:

1.首先a是一個(gè)放在GPU上的Variable,a.data是把Variable里的tensor取出來(lái),

可以看出與a的差別是:缺少了第一行(Variablecontaining)

2.a.cpu()和a.data.cpu()是分別把a(bǔ)和a.data放在cpu上,其他的沒(méi)區(qū)別,另外:a.data.cpu()和a.cpu().data一樣

3.

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論