【人工智能概論】 構(gòu)建神經(jīng)網(wǎng)絡(luò)——以用InceptionNet解決MNIST任務(wù)為例
一. 整體思路
- 兩條原則,四個(gè)步驟。
1.1 兩條原則
從宏觀到微觀
把握數(shù)據(jù)形狀
1.2 四個(gè)步驟
準(zhǔn)備數(shù)據(jù)
構(gòu)建模型
確定優(yōu)化策略
完善訓(xùn)練與測(cè)試代碼
二. 舉例——用InceptionNet解決MNIST任務(wù)
2.1 模型簡(jiǎn)介
- InceptionNet的設(shè)計(jì)思路是通過(guò)增加網(wǎng)絡(luò)寬度來(lái)獲得更好的模型性能。
- 其核心在于基本單元Inception結(jié)構(gòu)塊,如下圖:
- 通過(guò)縱向堆疊Inception塊構(gòu)建完整網(wǎng)絡(luò)。
2.2 MNIST任務(wù)
- MNIST是入門級(jí)的機(jī)器學(xué)習(xí)任務(wù);
- 它是一個(gè)手寫數(shù)字識(shí)別的數(shù)據(jù)集。
2.3 完整的程序
# 調(diào)包
import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.optim as optim
"""數(shù)據(jù)準(zhǔn)備"""
batch_size = 64
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,),(0.3081,))
])
train_dataset = datasets.MNIST(root='./mnist/',train=True,download=True,transform=transform)
train_loader = DataLoader(train_dataset,shuffle=True,batch_size=batch_size)
test_dataset = datasets.MNIST(root='./mnist/',train=False,download=True,transform=transform)
test_loader = DataLoader(test_dataset,shuffle=False,batch_size=batch_size)
"""構(gòu)建模型"""
# 需要指定輸入的通道數(shù)
class Inceptiona(nn.Module):
def __init__(self,in_channels):
super(Inceptiona,self).__init__()
self.branch1_1 = nn.Conv2d(in_channels , 16 , kernel_size= 1)
self.branch5_5_1 =nn.Conv2d(in_channels, 16, kernel_size= 1)
self.branch5_5_2 =nn.Conv2d(16,24,kernel_size=5,padding=2)
self.branch3_3_1 = nn.Conv2d(in_channels, 16,kernel_size=1)
self.branch3_3_2 = nn.Conv2d(16,24,kernel_size=3,padding=1)
self.branch3_3_3 = nn.Conv2d(24,24,kernel_size=3,padding=1)
self.branch_pooling = nn.Conv2d(in_channels,24,kernel_size=1)
def forward(self,x):
x1 = self.branch1_1(x)
x2 = self.branch5_5_1(x)
x2 = self.branch5_5_2(x2)
x3 = self.branch3_3_1(x)
x3 = self.branch3_3_2(x3)
x3 = self.branch3_3_3(x3)
x4 = F.avg_pool2d(x,kernel_size=3,stride = 1, padding=1)
x4 = self.branch_pooling(x4)
outputs = [x1,x2,x3,x4]
return torch.cat(outputs,dim=1)
# 構(gòu)建完整的網(wǎng)絡(luò)
class Net(nn.Module):
def __init__(self):
super(Net,self).__init__()
self.conv1 = nn.Conv2d(1,10,kernel_size=5)
self.conv2 = nn.Conv2d(88,20,kernel_size=5)
self.incep1 = Inceptiona(in_channels=10)
self.incep2 = Inceptiona(in_channels=20)
self.mp = nn.MaxPool2d(2)
self.fc = nn.Linear(1408,10)
def forward(self,x):
batch_size = x.size(0)
x = F.relu(self.mp(self.conv1(x)))
x = self.incep1(x)
x = F.relu(self.mp(self.conv2(x)))
x = self.incep2(x)
x = x.view(batch_size,-1)
x = self.fc(x)
return x
"""確定優(yōu)化策略"""
model = Net()
device = torch.device('cuda:0'if torch.cuda.is_available() else 'cpu')
model.to(device) # 指定設(shè)備
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(),lr=0.01,momentum=0.5)
"""完善訓(xùn)練與測(cè)試代碼"""
def train(epoch):
running_loss = 0.0
for batch_index, data in enumerate(train_loader,0):
inputs, target = data
# 把數(shù)據(jù)和模型送到同一個(gè)設(shè)備上
inputs, target = inputs.to(device), target.to(device)
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs,target)
loss.backward()
optimizer.step()
running_loss += loss.item()
# 用loss.item不會(huì)構(gòu)建計(jì)算圖,得到的不是張量,而是標(biāo)量
if batch_index % 300 == 299:
# 每三百組計(jì)算一次平均損失
print('[%d,%5d] loss: %.3f' %(epoch+1,batch_index+1,running_loss/300))
# 給出的是平均每一輪的損失
running_loss = 0.0
def test():
correct = 0
total = 0
with torch.no_grad():
# 測(cè)試的環(huán)節(jié)不用求梯度
for data in test_loader:
images , labels = data
images , labels = images.to(device), labels.to(device)
outputs = model(images)
_, predicted = torch.max(outputs.data,dim=1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print('accuracy on test set: %d,%%'%(100*correct/total))
return 100*correct/total # 將測(cè)試的準(zhǔn)確率返回
# 執(zhí)行訓(xùn)練
if __name__=='__main__':
score_best = 0
for epoch in range(10):
train(epoch)
score = test()
if score > score_best:
score_best = score
torch.save(model.state_dict(), "model.pth")
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-419523.html
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-419523.html
到了這里,關(guān)于【人工智能概論】 構(gòu)建神經(jīng)網(wǎng)絡(luò)——以用InceptionNet解決MNIST任務(wù)為例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!