当前位置:网站首页>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
边栏推荐
猜你喜欢
view【】【】【】【】
LeetCode 2011.执行操作后的变量值(简单)
MySql constraints
IO stream【】【】【】
Timer (setInterval) on and off
常用类 String概述
The complex "metaverse" will be interpreted for you, and the Link Reading APP will be launched soon!
Likou - Number of Provinces
LeetCode 剑指offer 10-I.斐波那契数列(简单)
One step ahead, don't miss it again, the chain reading APP will be launched soon!
随机推荐
pytorch-06.逻辑斯蒂回归
Chain Reading | The latest and most complete digital collection calendar-07.28
Notes 1
pytorch-11.卷积神经网络(高级篇)
Batch add watermark to pictures batch scale pictures to specified size
基于MNIST数据集的简单FC复现
[Notes] Collection Framework System Collection
一个基于.Net Core跨平台小程序考试系统
力扣——省份数量
Privatisation build personal network backup NextCloud
wiki confluence 安装
Linux database Oracle client installation, used for shell scripts to connect to the database with sqlplus
微信小程序-小程序的宿主环境
索引笔记【】【】
链读精选:星巴克着眼于数字收藏品并更好地吸引客户
力扣——情侣牵手
view【】【】【】【】
Operation table Function usage
视图【】【】【】【】
基于 .NET Core MVC 的权限管理系统