tensor是torch的核心,理論上四大框架如果不考慮直接匯編,使用更底層的語言,那么運算的速度和結果都應該是一樣的。
caffe有blob數據塊減小數據讀取時候造成的時間損失,而tensor也是一樣。(本人只了解過caffe、torch,其它兩款沒碰過)
tensor像是numpy的升級版,對速度十分重視的深度學習(等價於神經網絡模型)來說,對數據讀取,運算速度都嚴格要求。
--- 創建思維的tensor 4x5x6x2 z = torch.Tensor(4,5,6,2) --- 更多的維數需求也可以通過下面的方式實現,下面是6維的例子: s = torch.LongStorage(6) s[1] = 4; s[2] = 5; s[3] = 6; s[4] = 2; s[5] = 7; s[6] = 3; x = torch.Tensor(s)
而nDimension()可以得到維數大小,size()可以得到每個維的數量大小。LongStorage數據則會顯示數據的長度。
> x:nDimension() 6 > x:size() 4 5 6 2 7 3 [torch.LongStorage of size 6]
事實上Tensor數據是保存在Storage中,所以也能夠通過storage()函數獲取tensor數據中的值。但存儲的方式和讀取的方式不同。
對於三維的tensor數據來說
x:storage()[x:storageOffset() +(3-1)*x:stride(1)+(4-1)*x:stride(2)+(5-1)*x:stride(3)]
等價於
x[3][4][5]
tensor數據寫入的方式也能寫成:
x = torch.Tensor(4,5) s = x:storage() for i=1,s:size() do -- 填充storge s[i] = i end > x -- x被認為是2維矩陣 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [torch.DoubleTensor of dimension 4x5]
一行的數據元素是連續存儲的。
x = torch.Tensor(4,5) i = 0 x:apply(function() i = i + 1 return i end) > x 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [torch.DoubleTensor of dimension 4x5] > x:stride() 5 1 -- 在最后維之中的元素是連續的 [torch.LongStorage of size 2]
tensor之中數據元素的類別有(分別能在c對應):
ByteTensor -- 無符號字符串 CharTensor -- 有符號字符串 ShortTensor -- short IntTensor -- ints LongTensor -- longs FloatTensor -- floats DoubleTensor -- doubles
多數操作都只支持浮點類型數據
由於tensor已經使用了優化過的函數,所以多用已有函數進行操作。
甚至如果你想要復制一個數,也盡量使用函數。
y = torch.Tensor(x:size()):copy(x)
或者
y = x:clone()