当前位置:网站首页>pytorch-11. Convolutional Neural Network (Advanced)
pytorch-11. Convolutional Neural Network (Advanced)
2022-08-10 05:55:00 【Shengxin Research Ape】
Inception Moudel


import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optim
batch_size = 64
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307),(0.3081))
])
train_dataset = datasets.MNIST(root='../dataset/mnist/',train=True,download=True,transform=transform)
train_loader = DataLoader(train_dataset,shuffle = True,batch_size=batch_size)
test_dataset = datasets.MNIST(root='../dataset/mnist/',train=False,download=True,transform=transform)
test_loader = DataLoader(train_dataset,shuffle = False,batch_size=batch_size)
class InceptionA(torch.nn.Module):
def __init__(self,in_channels):
super(InceptionA, self).__init__()
self.branch1x1 = torch.nn.Conv2d(in_channels,16,kernel_size=1)
self.branch5x5_1 = torch.nn.Conv2d(in_channels,16,kernel_size=1)
self.branch5x5_2 = torch.nn.Conv2d(16,24,kernel_size=5,padding=2)
self.branch3x3_1 = torch.nn.Conv2d(in_channels, 16, kernel_size=1)
self.branch3x3_2 = torch.nn.Conv2d(16,24, kernel_size=3,padding=1)
self.branch3x3_3 = torch.nn.Conv2d(24, 24, kernel_size=3,padding=1)
self.branch_pool = torch.nn.Conv2d(in_channels,24,kernel_size=1)
def forward(self,x):
branch1x1 = self.branch1x1(x)
branch5x5 = self.branch5x5_1(x)
branch5x5 = self.branch5x5_2(branch5x5)
branch3x3 = self.branch3x3_1(x)
branch3x3 = self.branch3x3_2(branch3x3)
branch3x3 = self.branch3x3_3(branch3x3)
branch_pool =F.avg_pool2d(x,kernel_size=3,stride=1,padding=1)
branch_pool = self.branch_pool(branch_pool)
outputs = [branch1x1,branch5x5,branch3x3,branch_pool]
return torch.cat(outputs,dim=1) #batch channel W H dim=1即沿着channeldimensions
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = torch.nn.Conv2d(1,10,kernel_size=5)
self.conv2 = torch.nn.Conv2d(88,20,kernel_size=5) # input_channel , output_channel
self.incep1 = InceptionA(in_channels=10)
self.incep2 = InceptionA(in_channels=20)
self.mp = torch.nn.MaxPool2d(2)
self.fc = torch.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
model = Net()
device = torch.device("cuda:0"if torch.cuda.is_available() else "cpu")
model.to(device)
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(),lr=0.01,momentum=0.5)
def train(epoch):
running_loss = 0.0
for batch_idx,data in enumerate(train_loader,0):
inputs, target = data
inputs, target = inputs.to(device),target.to(device) #送到GPU
optimizer.zero_grad()
#forward + backward + update
outputs = model(inputs)
loss = criterion(outputs,target)
loss.backward()
optimizer.step()
running_loss +=loss.item()
if batch_idx % 300 ==299:
print('[%d,%5d]loss:%.3f'%(epoch+1,batch_idx+1,running_loss/300))
running_loss = 0
def test():
correct = 0
total = 0
with torch.no_grad():
for data in test_loader:
images,labels = data
images, labels = images.to(device), labels.to(device) # 送到GPU
outputs = model(images)
_,predicted = torch.max(outputs.data,dim=1) #dim=1维度1,行是第0个维度,列是第1个维度
total +=labels.size(0)
correct +=(predicted==labels).sum().item()
print('Accuracy on test set:%d %%'%(100*correct/total) )
if __name__ == '__main__':
for epoch in range(10):
train(epoch)
test()结果:
[1, 300]loss:0.880
[1, 600]loss:0.198
[1, 900]loss:0.144
Accuracy on test set:96 %
[2, 300]loss:0.111
[2, 600]loss:0.099
[2, 900]loss:0.090
Accuracy on test set:97 %
[3, 300]loss:0.078
[3, 600]loss:0.071
[3, 900]loss:0.076
Accuracy on test set:98 %
[4, 300]loss:0.062
[4, 600]loss:0.065
[4, 900]loss:0.057
Accuracy on test set:98 %
[5, 300]loss:0.055
[5, 600]loss:0.057
[5, 900]loss:0.052
Accuracy on test set:98 %
[6, 300]loss:0.047
[6, 600]loss:0.049
[6, 900]loss:0.050
Accuracy on test set:98 %
[7, 300]loss:0.045
[7, 600]loss:0.046
[7, 900]loss:0.043
Accuracy on test set:98 %
[8, 300]loss:0.040
[8, 600]loss:0.037
[8, 900]loss:0.041
Accuracy on test set:98 %
[9, 300]loss:0.038
[9, 600]loss:0.038
[9, 900]loss:0.034
Accuracy on test set:99 %
[10, 300]loss:0.035
[10, 600]loss:0.034
[10, 900]loss:0.034
Accuracy on test set:99 %
Process finished with exit code 0
Residual Block
Residual Block解决了梯度消失的问题

import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optim
batch_size = 64
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307),(0.3081))
])
train_dataset = datasets.MNIST(root='../dataset/mnist/',train=True,download=True,transform=transform)
train_loader = DataLoader(train_dataset,shuffle = True,batch_size=batch_size)
test_dataset = datasets.MNIST(root='../dataset/mnist/',train=False,download=True,transform=transform)
test_loader = DataLoader(train_dataset,shuffle = False,batch_size=batch_size)
class ResidualBlock(torch.nn.Module):
def __init__(self,channels):
super(ResidualBlock, self).__init__()
self.channels = channels
self.conv1 = torch.nn.Conv2d(channels,channels,kernel_size=3,padding=1)
self.conv2 = torch.nn.Conv2d(channels,channels,kernel_size=3,padding=1)
def forward(self,x):
y = F.relu(self.conv1(x))
y = self.conv2(y)
return F.relu(x+y)
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = torch.nn.Conv2d(1, 16, kernel_size=5)
self.conv2 = torch.nn.Conv2d(16, 32, kernel_size=5) # input_channel , output_channel
self.rblock1 = ResidualBlock(16)
self.rblock2 = ResidualBlock(32)
self.mp = torch.nn.MaxPool2d(2)
self.fc = torch.nn.Linear(512, 10)
def forward(self,x):
in_size = x.size(0)
x = self.mp(F.relu(self.conv1(x)))
x = self.rblock1(x)
x = self.mp(F.relu(self.conv2(x)))
x = self.rblock2(x)
x = x.view(in_size,-1)
x = self.fc(x)
return x
model = Net()
device = torch.device("cuda:0"if torch.cuda.is_available() else "cpu")
model.to(device)
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(),lr=0.01,momentum=0.5)
def train(epoch):
running_loss = 0.0
for batch_idx,data in enumerate(train_loader,0):
inputs, target = data
inputs, target = inputs.to(device),target.to(device) #送到GPU
optimizer.zero_grad()
#forward + backward + update
outputs = model(inputs)
loss = criterion(outputs,target)
loss.backward()
optimizer.step()
running_loss +=loss.item()
if batch_idx % 300 ==299:
print('[%d,%5d]loss:%.3f'%(epoch+1,batch_idx+1,running_loss/300))
running_loss = 0
def test():
correct = 0
total = 0
with torch.no_grad():
for data in test_loader:
images,labels = data
images, labels = images.to(device), labels.to(device) # 送到GPU
outputs = model(images)
_,predicted = torch.max(outputs.data,dim=1) #dim=1维度1,行是第0个维度,列是第1个维度
total +=labels.size(0)
correct +=(predicted==labels).sum().item()
print('Accuracy on test set:%d %%'%(100*correct/total) )
if __name__ == '__main__':
for epoch in range(10):
train(epoch)
test()结果:
[1, 300]loss:0.499
[1, 600]loss:0.159
[1, 900]loss:0.123
Accuracy on test set:96 %
[2, 300]loss:0.089
[2, 600]loss:0.083
[2, 900]loss:0.080
Accuracy on test set:97 %
[3, 300]loss:0.064
[3, 600]loss:0.062
[3, 900]loss:0.062
Accuracy on test set:98 %
[4, 300]loss:0.052
[4, 600]loss:0.052
[4, 900]loss:0.050
Accuracy on test set:98 %
[5, 300]loss:0.042
[5, 600]loss:0.043
[5, 900]loss:0.044
Accuracy on test set:98 %
[6, 300]loss:0.035
[6, 600]loss:0.040
[6, 900]loss:0.037
Accuracy on test set:98 %
[7, 300]loss:0.033
[7, 600]loss:0.033
[7, 900]loss:0.033
Accuracy on test set:98 %
[8, 300]loss:0.029
[8, 600]loss:0.029
[8, 900]loss:0.031
Accuracy on test set:99 %
[9, 300]loss:0.024
[9, 600]loss:0.028
[9, 900]loss:0.026
Accuracy on test set:99 %
[10, 300]loss:0.025
[10, 600]loss:0.023
[10, 900]loss:0.025
Accuracy on test set:99 %
Process finished with exit code 0
边栏推荐
- Database Notes Create Database, Table Backup
- LeetCode 1351.统计有序矩阵中的负数(简单)
- Collection set interface
- Knowledge Distillation Thesis Learning
- R语言聚类分析——代码解析
- The Principle of Union Search and API Design
- opencv
- MySql constraints
- 棋类游戏-五子棋小游戏
- WeChat applet wx.writeBLECharacteristicValue Chinese character to buffer problem
猜你喜欢
随机推荐
IO stream【】【】【】
Collection set interface
String常用方法
机器学习——聚类——商场客户聚类
定时器(setInterval)的开启与关闭
cesium rotate image
MySql constraints
十年磨一剑!数字藏品行情软件,链读APP正式开放内测!
The Principle of Union Search and API Design
network security firewall
常用类 String概述
Smart contracts and DAPP decentralized applications
事务、存储引擎
21天挑战杯MySQL——Day06
网络安全之防火墙
The submenu of the el-cascader cascade selector is double-clicked to display the selected content
LeetCode 面试题17.14 最小k个数(中等)
力扣——省份数量
图片批量添加水印批量缩放图片到指定大小
学生管理系统以及其简单功能的实现









