婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 解決pytorch下只打印tensor的數值不打印出device等信息的問題

解決pytorch下只打印tensor的數值不打印出device等信息的問題

熱門標簽:如何申請400電話費用 武漢外呼系統平臺 富錦商家地圖標注 沈陽人工外呼系統價格 池州外呼調研線路 江西省地圖標注 外呼系統哪些好辦 沈陽外呼系統呼叫系統 沈陽防封電銷卡品牌

torch.Tensor類型的數據loss和acc打印時

如果寫成以下寫法

print('batch_loss: '+str(loss.data)+'batch acc: '+str(acc.data))

則不僅會打印出loss和acc的值,還會打印出device信息和 tensor字樣,如下:

如果僅想打印出數值,使得打印出的信息更加簡潔

則要用以下寫法

print('batch_loss: {:.3f} batch acc: {:.3f}'.format(loss.data, acc.data))

該寫法還可控制輸出格式,結果類似如下:

補充:關于pytorch中用plt顯示tensor的問題(tensor轉numpy)

問題

圖像的張量結構為(C,H,W),而plt可以顯示的圖片格式要求(H,W,C),C為顏色通道數,可以沒有。

所以問題就是將Tensor(C,H,W)=> numpy(H,W,C)

解決辦法

def transimg(img):
    img = img / 2 + 0.5 # unnormalize
    npimg = img.numpy()
    npimg1 = np.transpose(npimg,(1,2,0)) # C*H*W => H*W*C
    return npimg1

補充:PyTorch代碼調試利器: 自動print每行代碼的Tensor信息

本文介紹一個用于 PyTorch 代碼的實用工具 TorchSnooper。作者是TorchSnooper的作者,也是PyTorch開發者之一。

GitHub 項目地址: https://github.com/zasdfgbnm/TorchSnooper

大家可能遇到這樣子的困擾:比如說運行自己編寫的 PyTorch 代碼的時候,PyTorch 提示你說數據類型不匹配,需要一個 double 的 tensor 但是你給的卻是 float;再或者就是需要一個 CUDA tensor, 你給的卻是個 CPU tensor。

比如下面這種:

RuntimeError: Expected object of scalar type Double but got scalar type Float

這種問題調試起來很麻煩,因為你不知道從哪里開始出問題的。比如你可能在代碼的第三行用 torch.zeros 新建了一個 CPU tensor, 然后這個 tensor 進行了若干運算,全是在 CPU 上進行的,一直沒有報錯,直到第十行需要跟你作為輸入傳進來的 CUDA tensor 進行運算的時候,才報錯。要調試這種錯誤,有時候就不得不一行行地手寫 print 語句,非常麻煩。

再或者,你可能腦子里想象著將一個 tensor 進行什么樣子的操作,就會得到什么樣子的結果,但是 PyTorch 中途報錯說 tensor 的形狀不匹配,或者壓根沒報錯但是最終出來的形狀不是我們想要的。這個時候,我們往往也不知道是什么地方開始跟我們「預期的發生偏離的」。我們有時候也得需要插入一大堆 print 語句才能找到原因。

TorchSnooper 就是一個設計了用來解決這個問題的工具。TorchSnooper 的安裝非常簡單,只需要執行標準的 Python 包安裝指令就好:

pip install torchsnooper

安裝完了以后,只需要用 @torchsnooper.snoop() 裝飾一下要調試的函數,這個函數在執行的時候,就會自動 print 出來每一行的執行結果的 tensor 的形狀、數據類型、設備、是否需要梯度的信息。

安裝完了以后,下面就用兩個例子來說明一下怎么使用。

例子1

比如說我們寫了一個非常簡單的函數:

def myfunc(mask, x):
    y = torch.zeros(6)
    y.masked_scatter_(mask, x)
    return y

我們是這樣子使用這個函數的:

mask = torch.tensor([0, 1, 0, 1, 1, 0], device='cuda')
source = torch.tensor([1.0, 2.0, 3.0], device='cuda')
y = myfunc(mask, source)

上面的代碼看起來似乎沒啥問題,然而實際上跑起來,卻報錯了:

RuntimeError: Expected object of backend CPU but got backend CUDA for argument #2 'mask'

問題在哪里呢?讓我們 snoop 一下!用 @torchsnooper.snoop() 裝飾一下 myfunc 函數:

import torch
import torchsnooper
@torchsnooper.snoop()
def myfunc(mask, x):
    y = torch.zeros(6)
    y.masked_scatter_(mask, x)
    return y

mask = torch.tensor([0, 1, 0, 1, 1, 0], device='cuda')
source = torch.tensor([1.0, 2.0, 3.0], device='cuda')
y = myfunc(mask, source)

然后運行我們的腳本,我們看到了這樣的輸出:

Starting var:.. mask = tensor(6,), int64, cuda:0>
Starting var:.. x = tensor(3,), float32, cuda:0>
21:41:42.941668 call 5 def myfunc(mask, x):
21:41:42.941834 line 6 y = torch.zeros(6)
New var:....... y = tensor(6,), float32, cpu>
21:41:42.943443 line 7 y.masked_scatter_(mask, x)
21:41:42.944404 exception 7 y.masked_scatter_(mask, x)

結合我們的錯誤,我們主要去看輸出的每個變量的設備,找找最早從哪個變量開始是在 CPU 上的。我們注意到這一行:

New var:....... y = tensor(6,), float32, cpu>

這一行直接告訴我們,我們創建了一個新變量 y, 并把一個 CPU tensor 賦值給了這個變量。這一行對應代碼中的 y = torch.zeros(6)。于是我們意識到,在使用 torch.zeros 的時候,如果不人為指定設備的話,默認創建的 tensor 是在 CPU 上的。我們把這一行改成 y = torch.zeros(6, device='cuda'),這一行的問題就修復了。

這一行的問題雖然修復了,我們的問題并沒有解決完整,再跑修改過的代碼還是報錯,但是這個時候錯誤變成了:

RuntimeError: Expected object of scalar type Byte but got scalar type Long for argument #2 'mask'

好吧,這次錯誤出在了數據類型上。這次錯誤報告比較有提示性,我們大概能知道是我們的 mask 的數據類型錯了。再看一遍 TorchSnooper 的輸出,我們注意到:

Starting var:.. mask = tensor(6,), int64, cuda:0>

果然,我們的 mask 的類型是 int64, 而不應該是應有的 uint8。我們把 mask 的定義修改好:

mask = torch.tensor([0, 1, 0, 1, 1, 0], device='cuda', dtype=torch.uint8)

然后就可以運行了。

例子 2

這次我們要構建一個簡單的線性模型:

model = torch.nn.Linear(2, 1)

我們想要擬合一個平面 y = x1 + 2 * x2 + 3,于是我們創建了這樣一個數據集:

x = torch.tensor([[0.0, 0.0], [0.0, 1.0], [1.0, 0.0], [1.0, 1.0]])
y = torch.tensor([3.0, 5.0, 4.0, 6.0])

我們使用最普通的 SGD 優化器來進行優化,完整的代碼如下:

import torch
model = torch.nn.Linear(2, 1)
x = torch.tensor([[0.0, 0.0], [0.0, 1.0], [1.0, 0.0], [1.0, 1.0]])
y = torch.tensor([3.0, 5.0, 4.0, 6.0])

optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
for _ in range(10):
    optimizer.zero_grad()
    pred = model(x)
    squared_diff = (y - pred) ** 2
    loss = squared_diff.mean()
    print(loss.item())
    loss.backward()
    optimizer.step()

然而運行的過程我們發現,loss 降到 1.5 左右就不再降了。這是很不正常的,因為我們構建的數據都是無誤差落在要擬合的平面上的,loss 應該降到 0 才算正常。

乍看上去,不知道問題在哪里。抱著試試看的想法,我們來 snoop 一下子。這個例子中,我們沒有自定義函數,但是我們可以使用 with 語句來激活 TorchSnooper。把訓練的那個循環裝進 with 語句中去,代碼就變成了:

import torch
import torchsnooper
model = torch.nn.Linear(2, 1)
x = torch.tensor([[0.0, 0.0], [0.0, 1.0], [1.0, 0.0], [1.0, 1.0]])
y = torch.tensor([3.0, 5.0, 4.0, 6.0])
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

with torchsnooper.snoop():
    for _ in range(10):
        optimizer.zero_grad()
        pred = model(x)
        squared_diff = (y - pred) ** 2
        loss = squared_diff.mean()
        print(loss.item())
        loss.backward()
        optimizer.step()

運行程序,我們看到了一長串的輸出,一點一點瀏覽,我們注意到

New var:....... model = Linear(in_features=2, out_features=1, bias=True)
New var:....... x = tensor(4, 2), float32, cpu>
New var:....... y = tensor(4,), float32, cpu>
New var:....... optimizer = SGD (Parameter Group 0 dampening: 0 lr: 0....omentum: 0 nesterov: False weight_decay: 0)
02:38:02.016826 line 12 for _ in range(10):
New var:....... _ = 0
02:38:02.017025 line 13 optimizer.zero_grad()
02:38:02.017156 line 14 pred = model(x)
New var:....... pred = tensor(4, 1), float32, cpu, grad>
02:38:02.018100 line 15 squared_diff = (y - pred) ** 2
New var:....... squared_diff = tensor(4, 4), float32, cpu, grad>
02:38:02.018397 line 16 loss = squared_diff.mean()
New var:....... loss = tensor(), float32, cpu, grad>
02:38:02.018674 line 17 print(loss.item())
02:38:02.018852 line 18 loss.backward()
26.979290008544922
02:38:02.057349 line 19 optimizer.step()

仔細觀察這里面各個 tensor 的形狀,我們不難發現,y 的形狀是 (4,),而 pred 的形狀卻是 (4, 1),他們倆相減,由于廣播的存在,我們得到的 squared_diff 的形狀就變成了 (4, 4)。

這自然不是我們想要的結果。這個問題修復起來也很簡單,把 pred 的定義改成 pred = model(x).squeeze() 即可。現在再看修改后的代碼的 TorchSnooper 的輸出:

New var:....... model = Linear(in_features=2, out_features=1, bias=True)
New var:....... x = tensor(4, 2), float32, cpu>
New var:....... y = tensor(4,), float32, cpu>
New var:....... optimizer = SGD (Parameter Group 0 dampening: 0 lr: 0....omentum: 0 nesterov: False weight_decay: 0)
02:46:23.545042 line 12 for _ in range(10):
New var:....... _ = 0
02:46:23.545285 line 13 optimizer.zero_grad()
02:46:23.545421 line 14 pred = model(x).squeeze()
New var:....... pred = tensor(4,), float32, cpu, grad>
02:46:23.546362 line 15 squared_diff = (y - pred) ** 2
New var:....... squared_diff = tensor(4,), float32, cpu, grad>
02:46:23.546645 line 16 loss = squared_diff.mean()
New var:....... loss = tensor(), float32, cpu, grad>
02:46:23.546939 line 17 print(loss.item())
02:46:23.547133 line 18 loss.backward()
02:46:23.591090 line 19 optimizer.step()

現在這個結果看起來就正常了。并且經過測試,loss 現在已經可以降到很接近 0 了。大功告成。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Pytorch自定義Dataset和DataLoader去除不存在和空數據的操作
  • pytorch Dataset,DataLoader產生自定義的訓練數據案例
  • PyTorch實現重寫/改寫Dataset并載入Dataloader
  • 一文弄懂Pytorch的DataLoader, DataSet, Sampler之間的關系
  • PyTorch 解決Dataset和Dataloader遇到的問題
  • PyTorch 如何自動計算梯度
  • pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
  • 我對PyTorch dataloader里的shuffle=True的理解
  • pytorch 帶batch的tensor類型圖像顯示操作
  • Pytorch 如何查看、釋放已關閉程序占用的GPU資源
  • pytorch中的squeeze函數、cat函數使用
  • Pytorch數據讀取之Dataset和DataLoader知識總結

標簽:黑龍江 呂梁 銅川 阿里 潛江 常德 通遼 株洲

巨人網絡通訊聲明:本文標題《解決pytorch下只打印tensor的數值不打印出device等信息的問題》,本文關鍵詞  解決,pytorch,下,只,打印,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《解決pytorch下只打印tensor的數值不打印出device等信息的問題》相關的同類信息!
  • 本頁收集關于解決pytorch下只打印tensor的數值不打印出device等信息的問題的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产剧情av麻豆香蕉精品| 九九精品一区二区| 日日夜夜免费精品| 色一情一伦一子一伦一区| 综合久久久久综合| 色综合久久综合中文综合网| 一区二区三区视频在线观看| 欧美性受xxxx黑人xyx| 偷拍一区二区三区| 日韩亚洲欧美综合| 国产一区高清在线| 国产精品第五页| 91免费版pro下载短视频| 亚洲另类色综合网站| 在线成人免费视频| 福利一区福利二区| 天天综合色天天综合色h| 久久在线观看免费| 色偷偷一区二区三区| 丝袜美腿成人在线| 国产精品久久久久影院| 欧美肥妇毛茸茸| 国产成人综合在线观看| 一区二区免费视频| 久久日一线二线三线suv| 91片在线免费观看| 另类欧美日韩国产在线| 综合欧美一区二区三区| 精品国产自在久精品国产| 色国产综合视频| 国产成人午夜片在线观看高清观看| 日韩中文字幕区一区有砖一区 | 日本一区二区三区四区| 久久精品国产色蜜蜜麻豆| 国产福利精品一区二区| 中文字幕中文字幕在线一区 | 久久超碰97中文字幕| 国产欧美一区视频| 日韩欧美国产电影| 精品在线你懂的| 一区二区在线免费| 欧美久久久久免费| 日韩影视精彩在线| 欧美激情一区在线观看| 欧美日韩综合不卡| 国产精选一区二区三区| 亚洲aaa精品| 中文字幕不卡在线观看| 日韩视频一区二区三区| 91色|porny| av高清久久久| 精品一区二区久久久| 亚洲小说欧美激情另类| 精品噜噜噜噜久久久久久久久试看| 日本高清不卡视频| 99久久伊人久久99| 99久久亚洲一区二区三区青草| 国产电影一区二区三区| 国产高清精品久久久久| 激情综合网激情| 精品在线一区二区三区| 老司机精品视频在线| 国产在线精品视频| 国产精品系列在线观看| 国产不卡视频在线观看| 大桥未久av一区二区三区中文| 国产九色精品成人porny| 成人激情综合网站| 在线视频一区二区三区| 欧美群妇大交群中文字幕| 在线播放91灌醉迷j高跟美女| 91电影在线观看| 欧美一区中文字幕| 日韩欧美国产一区二区三区| ww亚洲ww在线观看国产| 国产精品超碰97尤物18| 一区av在线播放| 韩国毛片一区二区三区| 91在线一区二区三区| 51午夜精品国产| 精品乱人伦小说| 2023国产精品自拍| 日韩理论电影院| 亚洲超丰满肉感bbw| 蜜臀精品一区二区三区在线观看 | 色综合久久九月婷婷色综合| 成人激情图片网| 欧美日韩一本到| 久久综合狠狠综合久久激情| 国产精品私人自拍| 五月天中文字幕一区二区| 偷拍日韩校园综合在线| 老司机免费视频一区二区三区| 国产一区二区精品久久99| 国产成人亚洲综合a∨婷婷 | 色哟哟在线观看一区二区三区| 亚洲人成精品久久久久久| 免费一级片91| 国产午夜精品一区二区| 国产精品久久久久久久久免费丝袜 | 岛国一区二区在线观看| 99久久99久久精品免费看蜜桃| 一本久久a久久免费精品不卡| 91 com成人网| 亚洲人一二三区| 激情五月激情综合网| 欧美乱妇15p| 亚洲成av人片在线观看无码| 95精品视频在线| 日韩女同互慰一区二区| 亚洲精品视频在线看| 99在线视频精品| 久久久久久久久久美女| 久久www免费人成看片高清| 欧美吞精做爰啪啪高潮| 亚洲成人免费影院| 色综合久久中文综合久久牛| 中文幕一区二区三区久久蜜桃| 免费观看一级欧美片| 欧美一区二区视频在线观看| 国产一区二区三区观看| 亚洲素人一区二区| 欧美不卡123| 色天天综合色天天久久| 成人免费高清在线观看| 久99久精品视频免费观看| 亚洲色图欧洲色图| 99精品欧美一区二区三区小说| 国产精品日韩成人| 欧美日韩一区二区在线观看视频| 日韩精品一级中文字幕精品视频免费观看 | 在线精品视频小说1| 一区二区三区四区在线| 日韩三级在线免费观看| 国产高清不卡一区| 亚洲乱码中文字幕| 欧美精品一区视频| 在线中文字幕一区二区| 国内精品久久久久影院色| 一区二区三区精品久久久| 亚洲免费观看高清完整版在线观看熊| 韩国理伦片一区二区三区在线播放| 国产精品自在在线| 狠狠色狠狠色综合| 国产成人av影院| 中文字幕av一区二区三区免费看| 亚洲伦理在线免费看| 久久在线免费观看| 欧美国产97人人爽人人喊| 久久免费视频一区| 日本一区二区成人| 亚洲精品成人精品456| 亚洲一区二区在线观看视频| 亚洲成人高清在线| 日本中文一区二区三区| 国产在线精品一区二区不卡了| 福利电影一区二区| 91久久精品一区二区二区| 日韩欧美国产综合一区 | 日韩av网站在线观看| 成人激情文学综合网| 777亚洲妇女| 蜜桃视频在线观看一区| 久久久精品免费观看| 日韩三级精品电影久久久| 欧美一级日韩一级| 色一情一乱一乱一91av| 成人福利视频在线看| 国产精品77777| 韩国v欧美v亚洲v日本v| 美国三级日本三级久久99| 手机精品视频在线观看| 亚洲国产精品久久久久婷婷884| 亚洲色图欧美在线| 亚洲日本丝袜连裤袜办公室| 中文字幕高清不卡| 欧美国产一区二区| 中文字幕av资源一区| 日本一区二区三级电影在线观看 | 亚洲综合久久久| 久久影院视频免费| 欧美日韩电影在线| 成人免费毛片嘿嘿连载视频| 蜜臀99久久精品久久久久久软件 | 国产日产欧产精品推荐色| 欧美一二三四在线| 欧美午夜精品久久久久久超碰| 成人黄页在线观看| 国产伦精品一区二区三区免费迷| 蜜桃视频第一区免费观看| 黄色日韩三级电影| 成人午夜又粗又硬又大| 99久久国产综合色|国产精品| 91影院在线观看| 日韩国产精品久久| 精品久久久久香蕉网| 国产亚洲成年网址在线观看| 国产精品久久久久久久久果冻传媒| 自拍偷拍国产亚洲| 亚洲午夜精品17c|