Pytorch 框架
第一章? 數(shù)據(jù)加載
Dataset:提供一種方式去獲取數(shù)據(jù)及其標(biāo)簽,并告訴我們有多少數(shù)據(jù)
Dataloader:為后面的網(wǎng)絡(luò)提供不同的數(shù)據(jù)形式
class MyData(Dataset): #創(chuàng)建一個(gè)MyData類,去繼承Datasetdef __init__(self,root_dir,label_dir): #創(chuàng)建全局變量,比如數(shù)據(jù)的路徑self.root_dir = root_dirself.label_dir = label_dir #self.設(shè)置全局變量self.path = os.path.join(self.root_dir,self.label_dir) #得到的是拼接的路徑self.img_path = os.listdir(self.path) #獲得path路徑下的所有文件(名字),是一個(gè)數(shù)組def __getiem__(self,index): #獲得圖片img_name = self.img_path[index] #獲得數(shù)組中的一個(gè)(文件名),不是路徑img_item_path = os.path.join(self.root_dir,self.label_dir,img_name)#再拼接上文件名label = self.label_dirreturn img,labeldef __len__(self):return len(self.img_path) #返回一個(gè)長(zhǎng)度#使用 root_dir = "database/train" data_label_dir = "data" data_dataset = MyDate(root_dir,data_label_dir) img,label = data_dataset[0] #第一張數(shù)據(jù) img.show() #放出來(lái)第二章? tensorboard的使用?
主要用于看loss的變化
writer = SummaryWriter("logs") #把文件存儲(chǔ)在logs文件夾下#有三種主要的使用 writer.add_image() #用來(lái)把圖片顯示在ten里 writer.add_scalar() #顯示函數(shù) writer.close()#在終端輸入命令,復(fù)制地址可打開。 #tensorboard --logdir=logs 其中l(wèi)ogdir=事件文件所在文件夾名 #tensorboard --logdir=logs --port=6007 指定端口其中add_image()讀取數(shù)據(jù)的類型必須是 torch.Tensor,? numpy.array,? 或者是string/blobname類型,故 要進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。
opencv-python是最常用來(lái)打開numpy類型的包
import numpy as np from PIL import Imageimage_path = '地址' img_PIL = Image.open(image_path) img_array = np.array(img_PIL) #先獲得PIL數(shù)據(jù)類型 print(type(img_array))第三章? ?transforms
用來(lái)對(duì)圖像進(jìn)行變換,也就是輸入一個(gè)特定格式的圖片,經(jīng)過transforms的函數(shù)后輸出我們想要的圖片結(jié)果
totensor數(shù)據(jù)類型:
img_path = '路徑' img = Image.open(img_path) print(img) #PIL類型的圖片tensor_trans = transforms.ToTensor() tensor_img = tensor_trans(img) #將PIL轉(zhuǎn)換為tensor數(shù)據(jù)類型Resize改變尺寸:
t_resize = transforms.Resize((512,512)) img_size = t_resize(img)第四章? 數(shù)據(jù)集的加載
轉(zhuǎn)換為tensor數(shù)據(jù)類型
import torchvisiondataset_transform = torchvision.transforms.Compose([torchvision.transforms.ToTensor() ])五? ?神經(jīng)網(wǎng)絡(luò)的搭建?
import torch.nn as nn import torch.nn.functional as Fclass Model(nn.Module): #相當(dāng)于nn.Module是一個(gè)網(wǎng)絡(luò)框架,我們對(duì)其一部分進(jìn)行更改def __init__(self):super().__init__()self.conv1 = nn.Conv2d(1, 20, 5)self.conv2 = nn.Conv2d(20, 20, 5)def forward(self, x): #神經(jīng)網(wǎng)絡(luò)經(jīng)過forward得到一個(gè)輸出(前向傳播)x = F.relu(self.conv1(x)) # x經(jīng)過一次卷積conv1,再經(jīng)過一次非線性relureturn F.relu(self.conv2(x)) #得到的x再經(jīng)過一次conv2再經(jīng)過一次relu卷積:用卷積核在輸入圖像上對(duì)應(yīng)相乘再相加。
import torch input = torch.tensor([[1,2,0,3,1], #[[表示是二維矩陣 #輸入圖像[0,1,2,3,1],[1,2,1,0,0],[5,2,3,1,1],[2,1,0,1,1]],dtype=torch.float32)#把lang型的1變成浮點(diǎn)型的1.0kernel = torch.tensor([[1,2,1], #卷積核[0,1,0],[2,1,0]])print(input.shape) # torch.Size([5,5]) input = torch.reshape(input,(1,1,5,5)) # 1-bachsize為1;1- 平面所以通道為1;(5,5)H,W kernel = torch.reshape(kernel,(1,1,3,3))#卷積 import torch.nn.functional as Foutput = F.conv2d(input,kernel,stride = 1) #stride = 1 走一步 padding輸入圖片填充 print(output) #結(jié)果就是對(duì)應(yīng)相乘相加得到的矩陣?conv2d的輸入要求:input(minibatch,in_channels,H,W)四個(gè)參數(shù),而圖片的shape只輸出(H,W)因此采用reshape函數(shù)
class Module(nn.Module)def __init__(self):super(Module,self).__init__() #初始化父類self.conv1 = Conv2d(in_channels=3,out_channels=6, #3-彩色,6-自己想要的層kernel_size=3,stride=1,padding=0) #3-卷積核3?3def forward(self,x):x = self.conv1(x)return x #想得到輸出x,所以返回xm = Module() print(m)六? ? ? 最大池化
? ? ? ?最大池化是指,對(duì)應(yīng)相乘的最大值(不相加)。最大池化的目的是保留輸入的特征,同時(shí)又把數(shù)據(jù)量進(jìn)行減小。
class Module(nn.Module)def __init__(self):super(Module,self).__init__() #初始化父類self.maxpool1 = MaxPool2d(kernel_size = 3,ceil_mode = True) #最大池化#ceil_mode=True 卷積核移動(dòng)的時(shí)候邊邊也算def forward(self,input):output = self.maxpool1(input)return x module = Module() output = module(input) #把輸入的數(shù)組傳進(jìn)去#如何把圖應(yīng)用在網(wǎng)絡(luò)里 dataset = torchvision.datasets.CIFAR10('../data',train=False,download=True,transform=torchvision.transforms.ToTensor()) dataloader = DataLoader(dataset,batch_size = 64) #按每次64張輸入圖片for data in dataloader: imgs,targets = dataout = module(imgs)七? ? ? ?非線性激活?
非線性變換目的是為網(wǎng)絡(luò)引入一些非線性特征,因?yàn)榉蔷€性越多,網(wǎng)絡(luò)才能訓(xùn)練出符合各種曲線特征的模型。如果大家都是線性的話,那模型的泛化能力將不夠好
nn.ReLU
class Module(nn.Module)def __init__(self):super(Module,self).__init__() #初始化父類self.relu1 = ReLU() #ReLU函數(shù)表示 小于0的為0,大于0的線性輸出def forward(self,input):output = self.relu1(input)return outputReLU對(duì)圖像的作用不是很明顯,Sigmoid函數(shù)明顯一些。
八? ? ? 正則化
可以加快神經(jīng)網(wǎng)絡(luò)的訓(xùn)練速度。用的少
總結(jié)
以上是生活随笔為你收集整理的Pytorch 框架的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【干货】营销拓客思维导图24式.pdf(
- 下一篇: optics hecht pdf 5_干