【Pytorch神经网络基础理论篇】 03 数据操作 + 数据预处理
生活随笔
收集整理的這篇文章主要介紹了
【Pytorch神经网络基础理论篇】 03 数据操作 + 数据预处理
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
1.數(shù)組樣例
?2.數(shù)據(jù)操作(代碼實(shí)現(xiàn)與結(jié)果截圖)
#首先導(dǎo)入torch,雖然被稱為pytorch,但是我們應(yīng)該導(dǎo)入torch而不是pytorch import torch #張量表示一個(gè)數(shù)值組成的數(shù)組,這個(gè)數(shù)字可能有多個(gè)維度 #這個(gè)行向量包含從0開(kāi)始的前12個(gè)整數(shù),默認(rèn)創(chuàng)建為浮點(diǎn)數(shù)。張量中的每個(gè)值都稱為張量的元素(element)。 #例如,張量x中有12個(gè)元素。除非額外指定,否則新的張量將存儲(chǔ)在內(nèi)存中,并采用基于CPU的計(jì)算。 x=torch.arange(12)x x.shape() #shape不是函數(shù)哦 #通過(guò)張量的shape屬性來(lái)訪問(wèn)張量的形狀 (沿每個(gè)軸的長(zhǎng)度) x.shape x.numel() #x的總數(shù) #要改變一個(gè)張量的形狀,而不改變?cè)氐臄?shù)量和元素值,我們可以調(diào)用reshape() #注意,通過(guò)改變張量的形狀,張量的大小不會(huì)改變。 x = x.reshape(3,4) x#不需要通過(guò)手動(dòng)指定每個(gè)維度來(lái)改變形狀。 #如果我們的目標(biāo)形狀是(高度,寬度),那么在知道寬度后,高度應(yīng)當(dāng)會(huì)隱式得出,我們不必自己做除法。在上面的例子中,為了獲得一個(gè)3行的矩陣,我們手動(dòng)指定了它有3行和4列。幸運(yùn)的是,張量在給出其他部分后可以自動(dòng)計(jì)算出一個(gè)維度。 #可以通過(guò)在希望張量自動(dòng)推斷的維度放置-1來(lái)調(diào)用此功能。 #即 x.reshape(-1,4) 或 x.reshape(3,-1) 等價(jià)于 x.reshape(3,4)。 #使用全0的張量 torch.zeros((2,3,4)) #使用全1的張量 torch.ones((2,3,4)) #使用包含數(shù)值的python列表給張量中的每個(gè)元素賦予確定值 torch.tensor([[2,1,4,3],[1,2,3,4],[4,3,2,1]]) #標(biāo)準(zhǔn)算數(shù)運(yùn)算符可以升級(jí)為按照元素運(yùn)算 x = torch.tensor([1.0,2,4,8]) y = torch.tensor([2,2,2,2]) x + y,x - y,x * y,x / y, x**y # **運(yùn)算符是求冪運(yùn)算 #創(chuàng)建一個(gè)形狀為(3,4)的張量。其中的每個(gè)元素都從均值為0、標(biāo)準(zhǔn)差為1的標(biāo)準(zhǔn)高斯(正態(tài))分布中隨機(jī)采樣。 torch.randn(3, 4) tensor([[-0.9464, 0.7712, -0.0070, 1.0236],[-2.1246, -0.7854, -1.9674, -0.1727],[ 0.0397, -0.0477, -0.0160, -0.0113]]) #按元素的方式進(jìn)行更多的計(jì)算 torch.exp(x) X = torch.arange(12, dtype=torch.float32).reshape((3,4)) Y = torch.tensor([[2.0,1,4,3],[1,2,3,4],[4,3,2,1]]) torch.cat((X,Y),dim=0), torch.cat((X,Y),dim=1) #dim=0按列排列 #dim=1按行排列 #通過(guò)邏輯運(yùn)算符構(gòu)建二元張量 X == Y #對(duì)于每個(gè)位置,如果X和Y在該位置相等,則新張量中相應(yīng)項(xiàng)的值為1,這意味著邏輯語(yǔ)句X == Y在該位置處為真,否則該位置為0。 #對(duì)于張量中的所有元素求和會(huì)產(chǎn)生只有一個(gè)元素的張量 X.sum()2.1.3廣播機(jī)制
在某些情況下,即使形狀不同,我們?nèi)匀豢梢酝ㄟ^(guò)調(diào)用廣播機(jī)制(broadcasting mechanism)來(lái)執(zhí)行按元素操作。這種機(jī)制的工作方式如下:首先,通過(guò)適當(dāng)復(fù)制元素來(lái)擴(kuò)展一個(gè)或兩個(gè)數(shù)組,以便在轉(zhuǎn)換之后,兩個(gè)張量具有相同的形狀。其次,對(duì)生成的數(shù)組執(zhí)行按元素操作。
#形狀不同 張量會(huì)進(jìn)行廣播機(jī)制 a = torch.arange(3).reshape((3,1)) b = torch.arange(2).reshape((1,2)) a,b #廣播機(jī)制 #由于a和b分別是 3×1 和 1×2 矩陣,如果我們讓它們相加,它們的形狀不匹配。我們將兩個(gè)矩陣廣播為一個(gè)更大的 3×2 矩陣,如下所示:矩陣a將復(fù)制列,矩陣b將復(fù)制行,然后再按元素相加。 a + b #[-1]選擇最后一個(gè)元素,[1:3]選擇第二個(gè)和第三個(gè)元素 X[-1],X[1:9] #1到9 但是最多有2行所以就顯示了第1行和第2行 #通過(guò)指定索引來(lái)將元素寫入矩陣 X[1,2]=9 X #為多個(gè)元素賦相同的值 X[0:2,:] =12 #將0至2行,全部賦值為12 X #運(yùn)行一些操作可能會(huì)為新結(jié)果分配內(nèi)存 before = id(Y) Y = X + Y id(Y) == before #執(zhí)行原地操作 內(nèi)存沒(méi)有變化 Z = torch.zeros_like(Y) print('id(Z)',id(Z)) Z[:] = X + Y print('id(Z)',id(Z)) #如果后續(xù)計(jì)算中沒(méi)有重復(fù)使用x,我們可以使用x[:]=X+Y 或者 x+=y來(lái)減少操作的內(nèi)存開(kāi)銷 before = id(X) X += Y #+=的本質(zhì)是調(diào)用append() id(X) == before A = X.numpy() #轉(zhuǎn)化為numpy張量 B = torch.tensor(A) type(A),type(B) a = torch.tensor([3.5])#將大小為1的張量轉(zhuǎn)化為python的標(biāo)量 a,a.item(),float(a),int(a)3.csv的讀取(代碼實(shí)現(xiàn)與結(jié)果截圖)
我們將簡(jiǎn)要介紹使用pandas預(yù)處理原始數(shù)據(jù)并將原始數(shù)據(jù)轉(zhuǎn)換為張量格式的步驟。我們將在后面的章節(jié)中介紹更多的數(shù)據(jù)預(yù)處理技術(shù)。
import os #創(chuàng)建一個(gè)人工數(shù)據(jù)集并且存儲(chǔ)在csv(逗號(hào)分割值)的文件中 os.makedirs(os.path.join('..','data'),exist_ok=True) data_file = os.path.join('..','data','house_tiny.csv') with open(data_file,'w') as f:f.write('NumRooms,Alley,Price\n') # 列名f.write('NA,Pave,127500\n') # 第1行的值f.write('2,NA,106000\n') # 第2行的值f.write('4,NA,178100\n') # 第3行的值f.write('NA,NA,140000\n') # 第4行的值 import pandas as pd #從創(chuàng)建的csv文件中加載原始數(shù)據(jù)集 data = pd.read_csv(data_file) print(data) data #注意,“NaN”項(xiàng)代表缺失值。為了處理缺失的數(shù)據(jù),典型的方法包括插值和刪除,其中插值用替代值代替缺失值。而刪除則忽略缺失值。在這里,我們將考慮插值。#通過(guò)位置索引iloc,我們將data分成inputs和outputs,其中前者為data的前兩列,而后者為data的最后一列。對(duì)于inputs中缺少的數(shù)值,我們用同一列的均值替換“NaN”項(xiàng)。 inputs,outputs = data.iloc[:,0:2],data.iloc[:,2] inputs = inputs.fillna(inputs.mean()) #在缺失數(shù)據(jù)處 添加平均值 print(inputs)?
#對(duì)于inputs中的類別值或離散值,我們將NaN視為一個(gè)類別 inputs = pd.get_dummies(inputs,dummy_na=True) #按類分 print(inputs)?
import torch X, y = torch.tensor(inputs.values),torch.tensor(outputs.values) X, y3.QA
1. b=a.reshape 并沒(méi)有申請(qǐng)新的內(nèi)存空間
?
2.學(xué)習(xí)一下numpy
3.快速區(qū)分維度:a.shape
4.視頻筆記截圖
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的【Pytorch神经网络基础理论篇】 03 数据操作 + 数据预处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: IDEA实时编译配置流程
- 下一篇: 【Pytorch神经网络实战案例】22