在淘寶做網(wǎng)站和網(wǎng)絡(luò)公司做網(wǎng)站區(qū)別福州短視頻seo方法
文章目錄
- 一、網(wǎng)絡(luò)模型的搭建
- 二、網(wǎng)絡(luò)模型正確性檢驗(yàn)
- 三、創(chuàng)建網(wǎng)絡(luò)函數(shù)
一、網(wǎng)絡(luò)模型的搭建
以CIFAR10數(shù)據(jù)集作為訓(xùn)練例子
準(zhǔn)備數(shù)據(jù)集:
#因?yàn)镃IFAR10是屬于PRL的數(shù)據(jù)集,所以需要轉(zhuǎn)化成tensor數(shù)據(jù)集
train_data = torchvision.datasets.CIFAR10(root="./data", train=True, transform=torchvision.transforms.ToTensor(),download=True)
test_data = torchvision.datasets.CIFAR10(root="./data", train=False, transform=torchvision.transforms.ToTensor(),download=True)
查看數(shù)據(jù)集的長(zhǎng)度:
train_data_size = len(train_data)
test_data_size = len(test_data)
print(f"訓(xùn)練數(shù)據(jù)集的長(zhǎng)度為{train_data_size}")
print(f"測(cè)試數(shù)據(jù)集的長(zhǎng)度為{test_data_size}")
運(yùn)行結(jié)果:
利用DataLoader來(lái)加載數(shù)據(jù)集:
train_dataloader = DataLoader(train_data,batch_size=64)
test_dataloader = DataLoader(test_data,batch_size=64)
搭建CIFAR10數(shù)據(jù)集神經(jīng)網(wǎng)絡(luò):
卷積層【1】代碼解釋:
#第一個(gè)數(shù)字3表示inputs(可以看到圖中為3),第二個(gè)數(shù)字32表示outputs(圖中為32)
#第三個(gè)數(shù)字5為卷積核(圖中為5),第四個(gè)數(shù)字1表示步長(zhǎng)(stride)
#第五個(gè)數(shù)字表示padding,需要計(jì)算,計(jì)算公式:
nn.Conv2d(3, 32, 5, 1, 2)
最大池化代碼解釋:
#數(shù)字2表示kernel卷積核
nn.MaxPool2d(2)
讀圖
卷積層【1】的Inputs 和 Outputs是下圖這兩個(gè):
最大池化【1】的Inputs 和 Outputs是下圖這兩個(gè):
卷積層【2】的Inputs 和 Outputs是下圖這兩個(gè):
以此類推
展平:
Flatten后它會(huì)變成64*4 *4的一個(gè)結(jié)果
線性輸出:
線性輸入是64*4 *4,線性輸出是64,故如下代碼
nn.LInear(64 *4 *4,64)
繼續(xù)線性輸出
nn.LInear(64,10)
搭建網(wǎng)絡(luò)完整代碼:
class Sen(nn.Module):def __init__(self):super(Sen, self).__init__()self.model = nn.Sequential(nn.Conv2d(3, 32, 5, 1, 2),nn.MaxPool2d(2),nn.Conv2d(32, 32, 5, 1 ,2),nn.MaxPool2d(2),nn.Conv2d(32, 64, 5, 1, 2),nn.MaxPool2d(2),nn.Flatten(),nn.Linear(64*4*4, 64),nn.Linear(64, 10))def forward(self,x):x = self.model(x)return x
二、網(wǎng)絡(luò)模型正確性檢驗(yàn)
if __name__ == '__main__':sen = Sen()input = torch.ones((64, 3, 32, 32))output = sen(input)print(output.shape)
注釋:
input = torch.ones((64, 3, 32, 32))
這一行代碼的含義是:創(chuàng)建一個(gè)大小為 (64, 3, 32, 32) 的全 1 張量,數(shù)據(jù)類型為 torch.float32。
64:這是批次大小,代表輸入有 64 張圖片。
3:這是圖片的通道數(shù),通常為 RGB 圖像的三個(gè)通道 (紅、綠、藍(lán))。
32, 32:這是圖片的高和寬,表示每張圖片的尺寸為 32x32 像素。
torch.ones 函數(shù)用于生成一個(gè)全 1 的張量,這里的張量形狀適合用于輸入圖像分類或卷積神經(jīng)網(wǎng)絡(luò)(CNN)中常見(jiàn)的 CIFAR-10 或類似的 32x32 像素圖像數(shù)據(jù)。
運(yùn)行結(jié)果:
可以得到成功變成了【64, 10】的結(jié)果。
三、創(chuàng)建網(wǎng)絡(luò)函數(shù)
創(chuàng)建網(wǎng)絡(luò)模型:
sen = Sen()
搭建損失函數(shù):
loss_fn = nn.CrossEntropyLoss()
優(yōu)化器:
learning_rate = 1e-2
optimizer = torch.optim.SGD(sen.parameters(), lr=learning_rate)
優(yōu)化器注釋:
使用隨機(jī)梯度下降(SGD)優(yōu)化器
learning_rate = 1e-2 這里的1e-2代表的是:1 x (10)^(-2) = 1/100 = 0.01
記錄訓(xùn)練的次數(shù):
total_train_step = 0
記錄測(cè)試的次數(shù):
total_test_step = 0
訓(xùn)練的輪數(shù):
epoch= 10
進(jìn)行循環(huán)訓(xùn)練:
for i in range(epoch):print(f"第{i+1}輪訓(xùn)練開(kāi)始")for data in train_dataloader:imgs, targets = dataoutputs = sen(imgs)loss = loss_fn(outputs, targets)optimizer.zero_grad()loss.backward()optimizer.step()total_train_step = total_train_step + 1print(f"訓(xùn)練次數(shù):{total_train_step},Loss:{loss.item()}")
注釋:
imgs, targets = data
是解包數(shù)據(jù),imgs 是輸入圖像,targets 是目標(biāo)標(biāo)簽(真實(shí)值)
outputs = sen(imgs)
將輸入圖像傳入模型 ‘sen’,得到模型的預(yù)測(cè)輸出 outputs
loss = loss_fn(outputs, targets)
計(jì)算損失值(Loss),loss_fn 是損失函數(shù),它比較outputs的值與targets 是目標(biāo)標(biāo)簽(真實(shí)值)的誤差
optimizer.zero_grad()
清除優(yōu)化器中上一次計(jì)算的梯度,以免梯度累積
loss.backward()
反向傳播,計(jì)算損失相對(duì)于模型參數(shù)的梯度
optimizer.step()
使用優(yōu)化器更新模型的參數(shù),以最小化損失
loss.item() 將張量轉(zhuǎn)換為 Python 的數(shù)值
loss.item演示:
import torch
a = torch.tensor(5)
print(a)
print(a.item())
運(yùn)行結(jié)果:
因此可以得到:item的作用是將tensor變成真實(shí)數(shù)字5
本章節(jié)完整代碼展示:
import torchvision.datasets
from torch import nn
from torch.utils.data import DataLoaderclass Sen(nn.Module):def __init__(self):super(Sen, self).__init__()self.model = nn.Sequential(nn.Conv2d(3, 32, 5, 1, 2),nn.MaxPool2d(2),nn.Conv2d(32, 32, 5, 1 ,2),nn.MaxPool2d(2),nn.Conv2d(32, 64, 5, 1, 2),nn.MaxPool2d(2),nn.Flatten(),nn.Linear(64*4*4, 64),nn.Linear(64, 10))def forward(self,x):x = self.model(x)return x
#準(zhǔn)備數(shù)據(jù)集
#因?yàn)镃IFAR10是屬于PRL的數(shù)據(jù)集,所以需要轉(zhuǎn)化成tensor數(shù)據(jù)集
train_data = torchvision.datasets.CIFAR10(root="./data", train=True, transform=torchvision.transforms.ToTensor(),download=True)
test_data = torchvision.datasets.CIFAR10(root="./data", train=False, transform=torchvision.transforms.ToTensor(),download=True)#length長(zhǎng)度
train_data_size = len(train_data)
test_data_size = len(test_data)
print(f"訓(xùn)練數(shù)據(jù)集的長(zhǎng)度為{train_data_size}")
print(f"測(cè)試數(shù)據(jù)集的長(zhǎng)度為{test_data_size}")train_dataloader = DataLoader(train_data,batch_size=64)
test_dataloader = DataLoader(test_data,batch_size=64)sen = Sen()#損失函數(shù)
loss_fn = nn.CrossEntropyLoss()#優(yōu)化器
learning_rate = 1e-2
optimizer = torch.optim.SGD(sen.parameters(), lr=learning_rate)#記錄訓(xùn)練的次數(shù)
total_train_step = 0
#記錄測(cè)試的次數(shù)
total_test_step = 0
#訓(xùn)練的輪數(shù)
epoch= 10for i in range(epoch):print(f"第{i+1}輪訓(xùn)練開(kāi)始")for data in train_dataloader:imgs, targets = dataoutputs = sen(imgs)loss = loss_fn(outputs, targets)optimizer.zero_grad()loss.backward()optimizer.step()total_train_step = total_train_step + 1print(f"訓(xùn)練次數(shù):{total_train_step},Loss:{loss.item()}")
運(yùn)行結(jié)果:
可以看到訓(xùn)練的損失函數(shù)在一直進(jìn)行修正。