第四章 使用张量表征真实数据(1)
最近高產(chǎn)似那啥~
話不多說(shuō),直接開(kāi)始
本書(shū)第一部分的代碼和一些用到的數(shù)據(jù):
鏈接(阿里云盤(pán)):
「Pytorch DeepLearning」https://www.aliyundrive.com/s/wQmXYZSqyv4 點(diǎn)擊鏈接保存,或者復(fù)制本段內(nèi)容,打開(kāi)「阿里云盤(pán)」APP ,無(wú)需下載極速在線查看,視頻原畫(huà)倍速播放。
本章主要內(nèi)容
1.將真實(shí)數(shù)據(jù)表示為Pytorch張量。
2.處理一系列數(shù)據(jù)類型。
3.從文件加載數(shù)據(jù)。
4.將數(shù)據(jù)轉(zhuǎn)換為張量。
5.塑造張量,使之作為神經(jīng)網(wǎng)絡(luò)的輸入。
本文先介紹一部分。截止葡萄酒品質(zhì)鑒定那里。
4.1 處理圖像
1.加載圖像文件
###4.1.2 加載圖像文件 import imageio import torch img_arr = imageio.imread('D:\\DeepLearning data\\data\\p1ch4\\image-dog\\bobby.jpg') print(img_arr) print(img_arr.shape)輸出:
2.改變布局
###4.1.3 改變布局 img = torch.from_numpy(img_arr) out = img.permute(2,0,1)#permute()函數(shù)對(duì)通道進(jìn)行重排CxHxW—>HxWxC print(out) ###預(yù)先分配一個(gè)適當(dāng)大小的張量,并使用從目錄中加載的圖像填充它 batch_size = 3 batch = torch.zeros(batch_size, 3, 256, 256, dtype=torch.uint8) ####(3,3,256,256)張量 import os data_dir = 'D:\\DeepLearning data\\data\\p1ch4\\image-cats' filenames = [name for name in os.listdir(data_dir) ####os.listdir()返回指定路徑下的文件和文件夾列表if os.path.splitext(name)[-1]=='.png'] ####僅挑選.png文件 os.path.splitext() 分離文件名與擴(kuò)展名 for i ,filename in enumerate(filenames):img_arr = imageio.imread(os.path.join(data_dir,filename)) ####os.path.join()用于路徑拼接文件路徑;只是起到連接文件的作用,而不能生成文件img_t = torch.from_numpy(img_arr)img_t = img_t.permute(2, 0, 1)img_t = img_t[:3]batch[i] = img_t print(batch)?輸出:
3.正規(guī)化數(shù)據(jù)
batch = batch.float() batch /= 255.0 ###將數(shù)據(jù)歸一到[0,1] print(batch) ###另一種方法(0均值,1標(biāo)準(zhǔn)差) ###預(yù)先分配一個(gè)適當(dāng)大小的張量,并使用從目錄中加載的圖像填充它 batch_size = 3 batch = torch.zeros(batch_size, 3, 256, 256, dtype=torch.uint8) ####(3,3,256,256)張量 import os data_dir = 'D:\\DeepLearning data\\data\\p1ch4\\image-cats' filenames = [name for name in os.listdir(data_dir) ####os.listdir()返回指定路徑下的文件和文件夾列表if os.path.splitext(name)[-1]=='.png'] ####僅挑選.png文件 os.path.splitext() 分離文件名與擴(kuò)展名 for i ,filename in enumerate(filenames):img_arr = imageio.imread(os.path.join(data_dir,filename)) ####os.path.join()用于路徑拼接文件路徑;只是起到連接文件的作用,而不能生成文件img_t = torch.from_numpy(img_arr)img_t = img_t.permute(2, 0, 1) ###pytorch需要張量排列(CxHxW)轉(zhuǎn)變?yōu)?#xff08;3,256,256)img_t = img_t[:3]batch[i] = img_t print(batch) batch = batch.float() print(batch.shape) n_channels = batch.shape[1] for c in range(n_channels):###只保留前三個(gè)通道m(xù)ean = torch.mean(batch[:,c])std = torch.std(batch[:,c])batch[:,c] = (batch[:,c] - mean)/std print(batch) print(batch.shape)?輸出:
4.2 三維圖像:體數(shù)據(jù)
#4.2 三維圖像:體數(shù)據(jù) ###加載特定格式 使用imageio模塊中的volread()函數(shù)加載一個(gè)CT掃描樣本,該函數(shù)將目錄作為參數(shù) import imageio dir_path = 'D:\\DeepLearning data\\data\\p1ch4\\volumetric-dicom\\2-LUNG 3.0 B70f-04083' vol_arr = imageio.volread(dir_path,'DICOM') print(vol_arr.shape) #####shape(99,512,512)不包含通道信息,因此需要使用unsqueeze()函數(shù)為通道維數(shù)留出空間 vol = torch.from_numpy(vol_arr).float() vol = torch.unsqueeze(vol,0)##對(duì)數(shù)據(jù)維度進(jìn)行擴(kuò)充。給指定位置加上維數(shù)為一的維度 print(vol.shape)?輸出:
?4.3 表示表格數(shù)據(jù)
Pytorch提供了幾種加載csv文件的方法,最常用的三種是:Python自帶的CSV模塊、numpy、pandas.
本次使用numpy
1.讀取數(shù)據(jù)
###葡萄酒評(píng)分 import csv import numpy as np wine_path = 'D:\\DeepLearning data\\data\\p1ch4\\tabular-wine\\winequality-white.csv' wine_numpy = np.loadtxt(wine_path, dtype=np.float32, delimiter=";",skiprows=1) ###skiprows=1表示不讀第一行,因?yàn)槠渲邪忻?print(wine_numpy) wine_tensor = torch.from_numpy(wine_numpy) print(wine_tensor.shape,wine_tensor.dtype)輸出:
###表示分?jǐn)?shù) data = wine_tensor[:,:-1]###最后一列是分?jǐn)?shù),不輸入模型 print(data,data.shape) target = wine_tensor[:,-1].long()###轉(zhuǎn)換為標(biāo)簽張量 print(target,target.shape)?輸出:
2.獨(dú)熱編碼
使用scatter_()方法獲得獨(dú)熱編碼,該方法將沿著參數(shù)提供的索引方向?qū)⒃磸埩康闹堤畛溥M(jìn)輸入張量中
scatter_()? 下劃線表示該方法不會(huì)返回一個(gè)新的張量,而是在適當(dāng)?shù)奈恢眯薷脑瓘埩?br /> scatter_(input, dim, index, src) → Tensor
將src中的所有值按照index確定的索引寫(xiě)入本tensor中。其中索引是根據(jù)給定的dimension,dim按照gather()描述的規(guī)則來(lái)確定。
參數(shù):- input (Tensor)-源tensor
????? -dim (int)-索引的軸向
????? -index (LongTensor)-散射元素的索引指數(shù)
????? -src (Tensor or float)-散射的源元素
輸出:
?另一種獨(dú)熱編碼方式:
##感覺(jué)有點(diǎn)難理解,決定使用另一種方法 import torch.nn.functional as F target_onehot1 = F.one_hot(target) print(target_onehot1,target_onehot1.shape)輸出:
結(jié)果一樣~
3.處理數(shù)據(jù)
''' dim=0為第0個(gè)維度,代表行。對(duì)于torch.mean(s,dim=0),表示跨行求平均。 ''' ###處理張量表格數(shù)據(jù) data_mean = torch.mean(data, dim=0) print(data_mean,data_mean.shape) data_var = torch.var(data, dim=0) print(data_var,data_var.shape) data_normalized = (data - data_mean)/torch.sqrt(data_var) print(data_normalized,data_normalized.shape)輸出:
????
###尋找閾值 尋求一種簡(jiǎn)單方法快速分辨酒的好壞 例如分?jǐn)?shù)小于等于3的即為劣質(zhì)酒 bad_indexes = target <= 3 print(bad_indexes,bad_indexes.shape,bad_indexes.dtype,bad_indexes.sum())###布爾型數(shù)據(jù) bad_data = data[bad_indexes] print(bad_data,bad_data.shape)?輸出:
###分為好中劣三等 bad_data = data[target <= 3] mid_data = data[(target > 3) & (target < 7)] good_data = data[target >= 7] ###對(duì)每一列取均值 bad_mean = torch.mean(bad_data,dim=0) mid_mean = torch.mean(mid_data,dim=0) good_mean = torch.mean(good_data,dim=0) for i, args in enumerate(zip(col_list,bad_mean,mid_mean,good_mean)):print('{:2} {:20} {:6.2f} {:6.2f} {:6.2f}'.format(i,*args)) ###使用二氧化硫總量的閾值來(lái)區(qū)分酒的好劣 total_sulfur_threshold = 141.83 total_sulfur_data = data[:,6] predicted_indexes = torch.lt(total_sulfur_data,total_sulfur_threshold)##torch.lt(input,other)逐元素比較input和other即是否 input<other;返回bool型 print(predicted_indexes,predicted_indexes.dtype,predicted_indexes.shape,predicted_indexes.sum())輸出:
###得到真正好酒的索引 actual_indexes = target > 5 print(actual_indexes.shape,actual_indexes.dtype,actual_indexes.sum(),actual_indexes)輸出:
###檢驗(yàn)預(yù)測(cè)與實(shí)際結(jié)果是否相符 n_matches = torch.sum(actual_indexes & predicted_indexes).item()###。item()方法 將數(shù)組元素復(fù)制到標(biāo)準(zhǔn)Python標(biāo)量并返回它。 n_predicted = torch.sum(predicted_indexes).item() n_actual = torch.sum(actual_indexes).item() print(f'預(yù)測(cè)得到的優(yōu)質(zhì)酒數(shù)量:',n_matches) print(f'2700瓶中的預(yù)測(cè)準(zhǔn)確率:',n_matches/n_predicted) print(f'整個(gè)數(shù)據(jù)集中的預(yù)測(cè)準(zhǔn)確率:',n_matches/n_actual)?輸出:
OK,先寫(xiě)到這,太多了也沒(méi)人看(反正也沒(méi)人看) 記得看完點(diǎn)個(gè)贊~(磕頭辣)
所需的文件還在整理,最后附上鏈接,或者私信我獲取~
總結(jié)
以上是生活随笔為你收集整理的第四章 使用张量表征真实数据(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Ada语言如何支持中文目录?
- 下一篇: 全国计算机一级考点wps,2018年计算