Pytorch學習手札(一)---安裝、數據類型、張量

1.安裝

安裝cuda
安裝pytorch

具體參考Pytorch快速安裝與環境配置

2.PyTorch基本數據類型

python           Pytorch
int,             intTensor
float,           Float tensor
int array,       IntTensor of size [d1,d2...]
flaot array      FloatTensor of size[d1,d2,...]

3.數據類型1

對於pytorch,並不能表示string類型的數據類型,一般情況下,可以將其數據分類的string結果進行編碼表示, 將其編碼爲一個向量的數據類型[d1,d2…dn],這個方法將其稱爲One-hot的編碼表示方法。
其中,n爲數據分類結果的類別數目,即表示向量的總長度。
例如:對於數據進行分類的時候,其實現的功能是區分貓和狗,一共含有兩個數據分類結果,因此可以將其結果的類別進行編碼表示爲[0,1]貓和[1,0]狗

4. 數據類型2

對於pytorch裏面的數據進行數據類型判斷和輸出時,一般有三種方法:
(1)print(a.type):輸出數據a的詳細數據類型;
(2)print(type(a)):輸出數據a的基本數據類型,沒有(1)中那麼詳盡;
(3)print(isinstance(a,torch.FloatTensor)):用來輸出數據a是否爲torch.Tensor數據類型,即返回值爲True或者False.

5.張量的定義

對於pytorch裏面的標量數據a,進行相關的數據定義時,一般將其定義爲torch.tensor(a),則輸出時返回爲tensor(a)

6.張量的形狀大小

對於標量的數據類型,其數據shape輸出一般爲a.shape=tensor.size([]),對於其長度輸出len(a.shape)=0,另外,對於a.size也是等於tensor.size([])的。

7.DIM和size

對於pytorch裏面的任何一個張量數據torch.tensor([d1,d2,d3,d4])DIM和size以及shape三種數據屬性的含義解析與區分如下:
DIM是指張量數據的長度(即數據的層數)=len(a.shape),size和shape都是指張量數據的形狀;
另外,a.numel()是指數據的大小爲d1d2d3*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)

9.1 設置默認的類型

torch.set_default_tensor_type(torch.DoubleTensor)

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個索引

16.本節代碼彙總

# -*- coding: utf-8 -*-
'''
@Author: Jason
@Desc  : Pytorch 張量學習
'''
import torch
import numpy as np
#1張量的創建
#1.1從numpy數據轉變
npData1 = np.array([1,2])
data1 = torch.from_numpy(npData1)
# print(data1) #tensor([1, 2], dtype=torch.int32)
npData2 = np.ones([2,3]) #注意這裏是創建愛你2行3列元素爲1 的矩陣
data2 = torch.from_numpy(npData2)
# print(data2)
'''
tensor([[1., 1., 1.],
        [1., 1., 1.]], dtype=torch.float64)
'''
#1.2 從list中導入
listData1 = [1,2]
# print(torch.tensor(listData1))#tensor([1, 2])
# print(torch.FloatTensor([1.,2.3]))#tensor([1.0000, 2.3000])


#1.3 未初始化張量
data3 = torch.empty(1)
# print(data3,data3.type()) #tensor([3.5733e-43]) torch.FloatTensor
data4 = torch.FloatTensor(2,3)#2行3列 數據大小懸殊
# print(data4)
'''
tensor([3.5733e-43]) torch.FloatTensor
tensor([[-1.4225e+27,  4.1198e-43,  1.7796e-43],
        [ 0.0000e+00,  0.0000e+00,  0.0000e+00]])
'''
# 1.4 修改默認張量類型
#上面data3 是torch.FloatTensor,現在將默認類型改爲DoubleTensor
torch.set_default_tensor_type(torch.DoubleTensor)
# print(torch.empty(1),torch.empty(1).type()) #tensor([4.9407e-324]) torch.DoubleTensor

# 1.5 隨機初始化
data5 = torch.rand(3,4)# torch.rand(m,n) 生成m行n列的0-1之間的張量
# print(data5)
'''
tensor([[0.9729, 0.6026, 0.4288, 0.3520],
        [0.7018, 0.4884, 0.7247, 0.6212],
        [0.0974, 0.7153, 0.4548, 0.4730]])
'''
#1.6 產生一個類似data5的張量(shape相同,值不同)
data6 = torch.rand_like(data5)#
# print(data6)
'''
tensor([[0.1862, 0.5182, 0.9033, 0.9588],
        [0.0946, 0.5798, 0.4647, 0.1398],
        [0.4490, 0.7391, 0.6581, 0.5851]])
'''
#torch.randint(min,max,[d1,d2,d3]) [min,max]區間,維度
data7 = torch.randint(1,10,[2,3])#
# print(data7)
'''
tensor([[6, 7, 7],
        [5, 6, 1]])
'''
#服從正太分佈(0,1)
data8 = torch.randn(3,3)
# print(data8)
'''
tensor([[-1.4928,  0.2712,  1.3751],
        [-1.2528,  1.3756,  1.0473],
        [ 0.8514,  0.6558,  0.2690]])
'''
data9 = torch.normal(mean=torch.full([10],0),std=torch.arange(1,0,-0.1))#長度爲10全爲0==>[1,0.9,0.8,...0.1]
# print(data9)
'''
tensor([ 0.4317, -0.1543, -0.4910,  0.0124,  1.0574,  0.0117,  0.7898, -0.6395,
         0.2374, -0.1907])
'''

#1.7 生成相同數據
data10 = torch.full([2,3],9)
print(data10)
'''
tensor([[9., 9., 9.],
        [9., 9., 9.]])
'''
if __name__ == "__main__":
    print(" ")

轉載請標明轉自:https://leejason.blog.csdn.net/article/details/106865563

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章