前言
剛接觸深度學習的同學,很多開源項目代碼中,張量tensor與數(shù)組array都有使用,不清楚兩者有什么區(qū)別,以及怎么使用,如何相互轉(zhuǎn)換等。博主起初也有類似的疑惑,經(jīng)過查閱資料以及實踐,逐漸有了深入了解,本文將記錄并分享自己對兩者的理解,可供參考。
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、先搞懂Torch中的tensor與Tensor
torch.Tensor()也就是torch.FloatTensor()的另一種簡寫,torch.Tensor()會生成**單精度浮點類型(32位)**的張量,如下所示:
#使用torch.FloatTensor()定義一個張量,查看類型
>>> import torch
>>> I = torch.Tensor([2, 3])
tensor([2., 3.])
>>> I.type()
'torch.FloatTensor'
>>>
與torch.Tensor()同級類似的還有torch.IntTensor(),torch.LongTensor(),torch.DoubleTensor(),分別為短整型、長整型、雙精度浮點型(64位)。
torch.tensor()中的數(shù)據(jù)類型決定生成張量的類型,如下所示:
>>> I = torch.tensor([2, 3])
>>> I.type()
'torch.LongTensor'
>>>
>>> I = torch.tensor([1., 2.])
>>> I.type()
'torch.FloatTensor'
>>>
可以通過torch.set_default_tensor_type(t)設置默認的tensor類型,如要使用torch.tensor()建立一個雙精度浮點類型的張量,如下所示:
>>> torch.set_default_tensor_type(torch.DoubleTensor) #指定默認類型
>>> torch.tensor([1.2, 3]).dtype
torch.float64
二、torch.tensor()的用處及數(shù)據(jù)特點
在深度學習pytorch框架中,torch.tensor是存儲和變換數(shù)據(jù)的重要工具。在torch中,為tensor計算提供了GPU加速、梯度自動求導等功能,這使得深度學習這種擁有龐大計算量的工程提高了計算效率,可以說torch.tensor專為深度學習設計的。
三、np.array()與torch.tensor()比較
numpy產(chǎn)生的數(shù)組類型為numpy.ndarray,
1、與torch.tensor()不同,另外打印數(shù)組類型的方式也有區(qū)別,umpy中沒有x.type()的用法,只能使用type(x);
2、numpy.ndarray類型的數(shù)據(jù)只能放在cpu中計算,而tensor可以放在GPU計算,也可以CPU計算。如下所示:
>>> import numpy as np
>>> A = np.array([[1, 2], [2, 4]])
>>> A
array([[1, 2],
[2, 4]])
>>> type(A)
<class 'numpy.ndarray'>
>>>
Pytorch中的Tensor又包括CPU上的數(shù)據(jù)類型和GPU上的數(shù)據(jù)類型,兩種數(shù)據(jù)類型之間也可以進行相互轉(zhuǎn)換。
三、np.array()與torch.tensor()相互轉(zhuǎn)換
訓練時,我們需要先把圖像數(shù)據(jù)讀取轉(zhuǎn)換為np.array()類型的數(shù)組,然后把np.array()轉(zhuǎn)換為torch.tensor,用于深度學習訓練加速。我們使用**numpy()和from_numpy()**將Tensor和NumPy中的數(shù)組相互轉(zhuǎn)換。
注意這兩個函數(shù)所產(chǎn)生的的Tensor和NumPy中的數(shù)組共享相同的內(nèi)存(所以他們之間的轉(zhuǎn)換很快),改變其中一個時另一個也會改變,
還有一個常用的將NumPy中的array轉(zhuǎn)換成Tensor的方法就是torch.tensor(),
需要注意的是,此方法總是會進行數(shù)據(jù)拷貝(就會消耗更多的時間和空間),
所以返回的Tensor和原來的數(shù)據(jù)不再共享內(nèi)存。
1.使用numpy()將Tensor轉(zhuǎn)換成NumPy數(shù)組:
代碼如下(示例):
>>> a = torch.ones(5)
>>> a
tensor([1., 1., 1., 1., 1.])
>>> a.type()
'torch.FloatTensor'
>>> b = a.numpy()
>>> b
array([1., 1., 1., 1., 1.], dtype=float32)
>>>
2.使用from_numpy()將NumPy數(shù)組轉(zhuǎn)換成Tensor:
代碼如下(示例):
>>> a = np.ones(5)
>>> a
array([1., 1., 1., 1., 1.])
>>> type(a)
<class 'numpy.ndarray'>
>>>
>>> b = torch.from_numpy(a)
>>> b
tensor([1., 1., 1., 1., 1.], dtype=torch.float64)
>>>
3.直接使用torch.tensor()將NumPy數(shù)組轉(zhuǎn)換成Tensor:
**注意:該方法總是會進行數(shù)據(jù)拷貝,返回的Tensor和原來的numpy數(shù)據(jù)不再共享內(nèi)存。**驗證代碼如下:文章來源:http://www.zghlxwxcb.cn/news/detail-402615.html
>>> a = np.ones(5)
>>> a
array([1., 1., 1., 1., 1.])
>>> type(a)
<class 'numpy.ndarray'>
>>>
>>> b = torch.from_numpy(a)
>>> b
tensor([1., 1., 1., 1., 1.], dtype=torch.float64)
>>>
>>> c = torch.tensor(a)
>>> c
tensor([1., 1., 1., 1., 1.], dtype=torch.float64)
>>> a += 1
>>> a
array([2., 2., 2., 2., 2.]) #a的值加1,改變
>>> c
tensor([1., 1., 1., 1., 1.], dtype=torch.float64) #c的值未變,因為是拷貝,不共享內(nèi)存
>>> b
tensor([2., 2., 2., 2., 2.], dtype=torch.float64) #b的值已經(jīng)改變,與a的值一樣,雖然類型不一樣
>>>
總結(jié)
本文主要記錄介紹torch.tensor與numpy.array之間的區(qū)別,以及應用場景,相互轉(zhuǎn)換的方法,講述了更多的細節(jié),這些知識點在深度學習模型訓練中非常有用,屬于基礎(chǔ)知識。博主后續(xù)會繼續(xù)更新分享深度學習筆記,記錄提煉知識點,總結(jié)學習經(jīng)驗及項目經(jīng)驗。如果本文對您的理解有幫助,請點贊+關(guān)注+收藏!文章來源地址http://www.zghlxwxcb.cn/news/detail-402615.html
到了這里,關(guān)于【深度學習筆記】徹底理解torch中的tensor與numpy中array區(qū)別及用法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!