当前位置:首页 >> 编程语言 >> 【Pytorch】学习记录分享6——PyTorch经典网络 ResNet与手写体识别,gcn架构

【Pytorch】学习记录分享6——PyTorch经典网络 ResNet与手写体识别,gcn架构

0evadmin 编程语言 1
文件名:【Pytorch】学习记录分享6——PyTorch经典网络 ResNet与手写体识别,gcn架构 【Pytorch】学习记录分享6——PyTorch经典网络 ResNet与手写体识别

【Pytorch】学习记录分享5——PyTorch经典网络 ResNet 1. ResNet (残差网络)基础知识2. 感受野3. 手写体数字识别3. 0 数据集(训练与测试集)3. 1 数据加载3. 2 函数实现:3. 3 训练及其测试:

1. ResNet (残差网络)基础知识

图1 56层error比20层error高,提出ResNet (残差网络)的方案

网络效果:

网络结构:

2. 感受野

3. 手写体数字识别 3. 0 数据集(训练与测试集)

mnist 用于手写体训练与测试,这里包含完整的链接

3. 1 数据加载 import torchimport torch.nn as nnimport torch.optim as optimimport torch.nn.functional as Ffrom torchvision import datasets,transforms import matplotlib.pyplot as pltimport numpy as np%matplotlib inline### 首先读取数据# - 分别构建训练集和测试集(验证集)# - DataLoader来迭代取数据# 定义超参数 input_size = 28 #图像的总尺寸28*28num_classes = 10 #标签的种类数num_epochs = 3 #训练的总循环周期batch_size = 64 #一个撮(批次)的大小,64张图片# 训练集train_dataset = datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True) # 测试集test_dataset = datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor())# 构建batch数据train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=True)

3. 2 函数实现: # 卷积网络模块构建# 一般卷积层,relu层,池化层可以写成一个套餐# 注意卷积最后结果还是一个特征图,需要把图转换成向量才能做分类或者回归任务class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv1 = nn.Sequential( # 输入大小 (1, 28, 28)nn.Conv2d(in_channels=1, # 灰度图out_channels=16, # 要得到几多少个特征图kernel_size=5, # 卷积核大小stride=1, # 步长padding=2, # 如果希望卷积后大小跟原来一样,需要设置padding=(kernel_size-1)/2 if stride=1), # 输出的特征图为 (16, 28, 28)nn.ReLU(), # relu层nn.MaxPool2d(kernel_size=2), # 进行池化操作(2x2 区域), 输出结果为: (16, 14, 14))self.conv2 = nn.Sequential( # 下一个套餐的输入 (16, 14, 14)nn.Conv2d(16, 32, 5, 1, 2), # 输出 (32, 14, 14)nn.ReLU(), # relu层nn.MaxPool2d(2), # 输出 (32, 7, 7))self.out = nn.Linear(32 * 7 * 7, 10) # 全连接层得到的结果def forward(self, x):x = self.conv1(x)x = self.conv2(x)x = x.view(x.size(0), -1) # flatten操作,结果为:(batch_size, 32 * 7 * 7) output = self.out(x)return output# 准确率作为评估标准def accuracy(predictions, labels):pred = torch.max(predictions.data, 1)[1] rights = pred.eq(labels.data.view_as(pred)).sum() return rights, len(labels) 3. 3 训练及其测试: # 训练网络模型# 实例化net = CNN() #损失函数criterion = nn.CrossEntropyLoss() #优化器optimizer = optim.Adam(net.parameters(), lr=0.001) #定义优化器,普通的随机梯度下降算法#开始训练循环for epoch in range(num_epochs):#当前epoch的结果保存下来train_rights = []for batch_idx, (data, target) in enumerate(train_loader): #针对容器中的每一个批进行循环net.train() # 将模型设置为训练模式output = net(data) # 使用模型进行前向传播loss = criterion(output, target) # 计算损失optimizer.zero_grad() # 梯度清零loss.backward() # 反向传播计算梯度optimizer.step() # 更新参数right = accuracy(output, target) # 计算当前批次的准确率train_rights.append(right) # 将准确率保存起来if batch_idx % 500 == 0: # 每500个批次进行一次验证net.eval() # 将模型设置为评估模式val_rights = [] # 存储验证集的准确率for (data, target) in test_loader: # 在测试集上进行验证output = net(data) # 使用模型进行前向传播right = accuracy(output, target) # 计算验证集上的准确率val_rights.append(right) # 将准确率保存起来#准确率计算train_r = (sum([tup[0] for tup in train_rights]), sum([tup[1] for tup in train_rights])) # 计算训练集准确率的分子和分母val_r = (sum([tup[0] for tup in val_rights]), sum([tup[1] for tup in val_rights])) # 计算验证集准确率的分子和分母print('当前epoch: {} [{}/{} ({:.0f}%)]\t损失: {:.6f}\t训练集准确率: {:.2f}%\t测试集正确率: {:.2f}%'.format(epoch, batch_idx * batch_size, len(train_loader.dataset),100. * batch_idx / len(train_loader), loss.data, 100. * train_r[0].numpy() / train_r[1],100. * val_r[0].numpy() / val_r[1])) # 打印当前进度和准确率信息

协助本站SEO优化一下,谢谢!
关键词不能为空
同类推荐
«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接