pytorch張量數據類型入門
1、對於pytorch的深度學習框架,其基本的數據類型屬於張量數據類型,即Tensor數據類型,對於python里面的int,float,int array,flaot array對應於pytorch里面即在前面加一個Tensor即可——intTensor ,Float tensor,IntTensor of size [d1,d2...], FloatTensor of size[d1,d2,...]
2、對於pytorch,並不能表示string類型的數據類型,一般情況下,可以將其數據分類的string結果進行編碼表示,將其編碼為一個向量的數據類型[d1,d2...dn],這個方法將其稱為One-hot的編碼表示方法。其中,n為數據分類結果的類別數目,即表示向量的總長度。例如:對於數據進行分類的時候,其實現的功能是區分貓和狗,一共含有兩個數據分類結果,因此可以將其結果的類別進行編碼表示為[0,1]貓和[1,0]狗
3、對於pytorch里面的數據進行數據類型判斷和輸出時,一般有三種方法:
(1)print(a.type):輸出數據a的詳細數據類型;
(2)print(type(a)):輸出數據a的基本數據類型,沒有(1)中那么詳盡;
(3)print(isinstance(a,torch.FloatTensor)):用來輸出數據a是否為torch.Tensor數據類型,即返回值為True或者False.
4、對於pytorch的張量Tensor數據類型,在不同的平台上是不一樣的,如果在CPU上即為正常的張量Tensor數據類型,如果在GPU上面,則需要將其數據類型轉換:
data=data.cuda(),此時data的數據類型從torch.FlaotTensor轉換為了torch.cuda.FloatTensor,它可以在cuda上面進行算法的加速實現。
5、對於pytorch里面的標量數據a,進行相關的數據定義時,一般將其定義為torch.tensor(a),則輸出時返回為tensor(a)
6、對於標量的數據類型,其數據shape輸出一般為a.shape=tensor.size([]),對於其長度輸出len(a.shape)=0,另外,對於a.size也是等於tensor.size([])的。
7、對於pytorch里面的任何一個張量數據torch.tensor([d1,d2,d3,d4])DIM和size以及shape三種數據屬性的含義解析與區分如下:
DIM是指張量數據的長度(即數據的層數)=len(a.shape),size和shape都是指張量數據的形狀;
另外,a.numel()是指數據的大小為d1*d2*d3*d4
(1)DIM=2:
a=torch.tensor([4,784])
其中4是指數據圖片的數目,而784是指每一張圖片的特征維度
舉例:對於a=torch.tensor([1,2,3])
適用於普通的機器學習數據
(2)DIM=3:
1)a.size/shape=tensor.size([1,2,3])
2)a.size(0)=1
3)a.shape[2]=3
4)a[0].shape=[2,3]
適用於RNN神經網絡的數據類型[length,num,feature]
例如,對於RNN神經網絡進行語音識別與處理時[10,20,100]表示:每個單詞包含100個特征,一句話一共有10個單詞,而每次輸20句話
(3)DIM=4:
一般適用於CNN卷積神經網絡[b,c,h,w]:圖像處理中圖片的信息
torch.tensor([2,3,28,28]):
1)2是指每次輸入的圖片的個數
2)3是指每張圖片的基本特征通道類型
3)28,28是指每張圖片的像素特征:長和寬
8、創建Tensor數據的方法主要有以下幾種:
(1)Import from numpy:
a=np.array([1.1,2.1)
b=torch.from_numpy(a)
a=np.ones([2,3]) #定義矩陣的方式
b=torch.from_numpy(a)
注:從numpy中導入的數據float類型其實是double類型的。
(2)Import from List:
a=torch.tensor([[1.1,2.1],[1.5,1.2]]),這里的小寫tensor中的list數據就是指data本身數據
b=torch.FloatTensor/Tensor(d1,d2,d3),這里的大寫Tensor中為數據的shape,即數據的維度組成
9、生成未初始化的數據uninitialized:
(1)torch.empty()
(2)torch.FloatTensor(d1,d2,d3)
(3)torch.IntTensor(d1,d2,d3)
10、tensor數據的隨機初始化的方式—rand/rand_like(0-1),randint(整數數據類型),randn(正態分布數據):
(1)torch.rand():產生0-1之間的數據
(2)torch.rand_like(a):a為一個tensor數據類型,產生一個和a數據shape相同的隨機tensor數據類型
(3)torch.randint(min,max,[d1,d2,d3]):產生一個shape類型為[d1,d2,d3]的tensor數據,數據最小和最大分別為min和max
(4)torch.randn:產生一個正態分布的數據類型N(0,1),對於自定義的正態分布的數據N(mean,std),一般需要用到torch.normal()函數,一般需要兩步步驟進行,其具體的用法如下舉例所示:
a=torch.normal(mean=torch.full([10],0)),std=torch.arange(1,0,-0.1))
b=a.reshape(2,5)
11、生成一個全部填充相同的數據:torch.full([d1,d2,de3],a)其中填充數據為a
12、遞增或者遞減函數API:arange/range
torch.arange(min,max,distance):左閉右開區間,不包含最大值
torch。range(min,max,distance):全閉區間,包含最大值,不推薦使用
13、linspace/logspace:線性空間
(1)torch.linspace(min,max,steps=data number):返回的是等間距的數據,其中左右數據均包括,數據個數為steps,數據間隔為(max-min)/(steps-1)
(2)torch.logspace(min,max,steps=data number):返回的是10的各個線性空間次方的數值
14、torch中一些零、一和單位張量數據生成API:
torch.zeros(3,4) #零張量數據
torch.ones(3,4) #1張量數據
torch.eye(4,5) #單位張量數據
15、randperm:主要是產生隨機的索引值:
torch.randperm(10):在[0,10),即0-9產生隨機的10個索引
綜上所示,對於tensor張量數據類型的基礎訓練python代碼如下所示:
import torch
a=torch.randn([1,2,3,4])
print(a)
print(a.dim()) #輸出張量數據的層數,即長度
print(a.dim()==len(a.shape))
print(a.numel()) #輸出張量數據的總個數,即數據大小,占內存的個數
print(a.shape) #輸出數據的形狀
print(a.size())
print(a.size(3)) #輸出size和shape的其中元素
print(a.shape[3])
x=torch.empty(2,2,3)
print(x)
print(torch.IntTensor(2,3))
print(torch.FloatTensor(1,2,3))
print(torch.Tensor(1,2,10)) #未初始化tensor數據,占據一定的內存區間
print(x.type()) #輸出tensor數據類型
#torch.set_default_tensor_type(torch.DoubleTensor) #設置tensor的數據類型為doubletensor
x=torch.empty(2,2,3)
print(x)
print(x.type()) #重新輸出tensor數據類型
#隨機初始化的方式
a=torch.rand(3,3) #產生0-1的shape為[3,3]的tensor數據
print(a)
b=torch.rand_like(a) #產生一個和a的tensor數據類型相同的tensor數據,其數據大小也在0-1之間,如果變大可以利用一定的數據處理
print(b)
c=torch.randint(0,10,[3,5])
print(c)
a=torch.randn(2,5) #產生一個標准正態分布的數據
print(a)
a=torch.normal(mean=torch.full([10],0),std=torch.arange(1,0,-0.1)) #產生一般自定義的正態分布數據大小
b=a.reshape(2,5)
print(a)
print(b)
#torch.full
a=torch.full([2,3],3)
print(a)
b=torch.full([],1) #生成一個標量
print(b)
c=torch.full([1],1) #生成一個dim=1的tensor張量數據
print(c)
print(a.type(),b.type(),c.type())
a=torch.arange(0,10,2) #半開區間,左閉右開,不包含右邊的最大值
print(a)
b=torch.range(0,10) #包含右端數據10,全閉區間
print(b)
#linspace/logspace
#(1)torch.linspace(min,max,steps=data number):返回的是等間距的數據,其中左右數據均包括,數據個數為steps,數據間隔為(max-min)/(steps-1)
#(2)torch.logspace(min,max,steps=data number):返回的是10的各個線性空間次方的數值
a=torch.linspace(0,10,steps=10)
print(a)
b=torch.linspace(0,10,steps=11)
print(b)
c=torch.logspace(0,10,steps=11)
print(c)
d=torch.logspace(-1,0,steps=10)
print(d)
#Ones/zeros/eyes
print(torch.zeros(3,4)) #零張量數據
print(torch.ones(3,4)) #1張量數據
print(torch.eye(4,5)) #單位張量數據
#randperm產生隨機的索引值
a=torch.rand(2,3)
b=torch.rand(2,2)
print(a,b)
idx=torch.randperm(2)
print(idx)
a=a[idx]
b=b[idx]
print(a,b)
最終實現結果如下所示:

