pytorch中.numpy()、.item()、.cpu()、.detach()以及.data的使用方法
.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)量(int float等)常用于用于深度學(xué)習(xí)訓(xùn)練時(shí),將loss值轉(zhuǎn)換為標(biāo)量并加,以及進(jìn)行分類任務(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ì)改變變量類型,轉(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)說明一下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)?x.data 不能被 autograd 追蹤求微分
這是為什么呢?我們對(duì).data進(jìn)行進(jìn)一步探究
import torch
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é)果為:
a tensor([4., 5., 6.], requires_grad=True)
out tensor([0.9820, 0.9933, 0.9975], grad_fn=<SigmoidBackward0>)
True
result tensor([0., 0., 0.])
out tensor([0., 0., 0.], grad_fn=<SigmoidBackward0>)
tensor([0., 0., 0.])
'''
由于更改分離之后的變量值result,導(dǎo)致原來(lái)的張量out的值也跟著改變了,但是這種改變對(duì)于autograd是沒有察覺的,它依然按照求導(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的差別是:缺少了第一行(Variable containing)
2.a.cpu()和a.data.cpu()是分別把a(bǔ)和a.data放在cpu上,其他的沒區(qū)別,另外:a.data.cpu()和a.cpu().data一樣
3.a.data[0] | a.cpu().data[0] | a.data.cpu()[0]是一樣的,都是把第一個(gè)值取出來(lái),類型均為float
4.a.data.cpu().numpy()把tensor轉(zhuǎn)換成numpy的格式
總結(jié)
到此這篇關(guān)于pytorch中.numpy()、.item()、.cpu()、.detach()以及.data使用的文章就介紹到這了,更多相關(guān)pytorch .numpy()、.item()、.cpu()、.detach()及.data內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python的getattr和getattribute攔截內(nèi)置操作實(shí)現(xiàn)
在Python中,getattr和getattribute是用于動(dòng)態(tài)屬性訪問和自定義屬性訪問行為的重要工具,本文主要介紹了python的getattr和getattribute攔截內(nèi)置操作實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
python圖片剪裁代碼(圖片按四個(gè)點(diǎn)坐標(biāo)剪裁)
這篇文章主要介紹了python圖片剪裁代碼(圖片按四個(gè)點(diǎn)坐標(biāo)剪裁),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-03-03
利用Python開發(fā)微信支付的注意事項(xiàng)
如今支付的引入是很多互聯(lián)網(wǎng)產(chǎn)品都需要的。為了讓用戶用著更方便快捷,集成像支付寶、微信支付這樣的第三方支付也就成了常有的事。今天跟著小編就來(lái)看看微信支付開發(fā)中幾個(gè)值得注意的地方,涉及代碼之處均用 Python 編寫。2016-08-08
使用Python實(shí)現(xiàn)全攝像頭拍照與鍵盤輸入監(jiān)聽功能
這篇文章主要介紹了使用Python實(shí)現(xiàn)全攝像頭拍照與鍵盤輸入監(jiān)聽功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08
在Python程序中實(shí)現(xiàn)分布式進(jìn)程的教程
這篇文章主要介紹了在Python程序中實(shí)現(xiàn)分布式進(jìn)程的教程,在多進(jìn)程編程中十分有用,示例代碼基于Python2.x版本,需要的朋友可以參考下2015-04-04
Python中xrange與yield的用法實(shí)例分析
這篇文章主要介紹了Python中xrange與yield的用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了range和xrange功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-12-12
python深度學(xué)習(xí)tensorflow卷積層示例教程
這篇文章主要為大家介紹了python深度學(xué)習(xí)tensorflow卷積層示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

