当前位置:网站首页>pytorch-11.卷积神经网络(高级篇)
pytorch-11.卷积神经网络(高级篇)
2022-08-10 05:32:00 【生信研究猿】
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即沿着channel的维度拼起来
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
边栏推荐
猜你喜欢
随机推荐
Knowledge Distillation Thesis Learning
impdp 导入数据
Timer (setInterval) on and off
Linux database Oracle client installation, used for shell scripts to connect to the database with sqlplus
第二次实验
MySQL中MyISAM为什么比InnoDB查询快
数据库 笔记 创建数据库、表 备份
去中心化和p2p网络以及中心化为核心的传统通信
菜谱小程序源码免费分享【推荐】
String common methods
IDEA连接MySQL数据库并执行SQL查询操作
基于 .NET Core MVC 的权限管理系统
链读 | 最新最全的数字藏品发售日历-07.28
链读推荐:从瓷砖到生成式 NFT
MySql constraints
redis---非关系型数据库(NoSql)
Collection tool class
IDEA的database使用教程(使用mysql数据库)
最新最全的数字藏品发售日历-07.27
Collection工具类




![[Notes] Collection Framework System Collection](/img/6a/f0e69ebb60a3d958ec7bda33a60995.png)




