1. 程式人生 > >pytorch 程式碼筆記

pytorch 程式碼筆記

轉到pytorch之後,還沒有系統的學習,然而在看一些原始碼的時候,還是遇到了不少由於版本以及API變動所帶來的一些問題,然鵝網上關於這件事的相關資料較少,暫時記錄一下,以後有空了再探究一下底層實現細節問題。

torch.cat()

  • input param:[ tuple, dim=]
  • return : tensor
  • problem describe:
    本來正常使用應該不會有什麼問題,但是我在閱讀原始碼的時候,遇到了一題提示錯誤:
    RuntimeError: zero-dimensional tensor (at position 0) cannot be concatenated

導致這個問題的code部分如下:

x = torch.tensor(0.5)
y = torch.tensor(0.4)
m = torch.cat((x, y))
>>  "RuntimeError: zero-dimensional tensor (at position 0)"

#  this is the right code:
x = torch.tensor([0.5])
y = torch.tensor([0.4])
m = torch.cat((x, y))
>>   m   tensor([0.5,  0,4])

也就是說這個問題的根本在於,torch.cat() 函式傳入的tuple裡面的tensor維度不可以為0,而我們直接建立一個非list的tensor的時候,就有了zero-dimensional tensor, 這在pytorch0.3 版本沒有什麼問題,但pytorch0.4版本中,加入了zero-dimensional tensor 的概念,做出了區分。

ps:之所以會這樣,是因為我想要做concatenate操作的是一個tensor的浮點型資料,loss.data, 而loss.data 是一個tensor()型別, 跟tensor([])型別是完全不一樣的!

int() float() str()

遇到的另一個問題就是如何把一個tensor 型別的資料,轉為Python所能操作的對應的型別,需要注意的一點是,在pytorch0.4版本中,int和float對應的tensor都有對應的直接型別轉換,但是沒辦法直接變成一個string型別!!!
直接來看幾個例子吧:

>>   x = torch.tensor(0.5)
torch.tensor(0.5)    torch.size([])
>>  float(x)
0.5
>>  str(x)
'tensor(0.5000)'

>> str(float(x))
'0.5'

劃重點啦,torch.tensor 是沒辦法直接轉到str型別的!!!