做企业网站制作,云服务器可以建设个人网站吗,东阳网站建设哪家好,做网站空间备案的职业【Pytorch】学习记录分享5——PyTorch经典网络 ResNet 1. ResNet #xff08;残差网络#xff09;基础知识2. 感受野3. 手写体数字识别3. 0 数据集#xff08;训练与测试集#xff09;3. 1 数据加载3. 2 函数实现#xff1a;3. 3 训练及其测试#xff1a; 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 torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torchvision import datasets,transforms
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
### 首先读取数据
# - 分别构建训练集和测试集验证集
# - DataLoader来迭代取数据# 定义超参数
input_size 28 #图像的总尺寸28*28
num_classes 10 #标签的种类数
num_epochs 3 #训练的总循环周期
batch_size 64 #一个撮批次的大小64张图片# 训练集
train_dataset datasets.MNIST(root./data, trainTrue, transformtransforms.ToTensor(), downloadTrue) # 测试集
test_dataset datasets.MNIST(root./data, trainFalse, transformtransforms.ToTensor())# 构建batch数据
train_loader torch.utils.data.DataLoader(datasettrain_dataset, batch_sizebatch_size, shuffleTrue)
test_loader torch.utils.data.DataLoader(datasettest_dataset, batch_sizebatch_size, shuffleTrue) 3. 2 函数实现
# 卷积网络模块构建
# 一般卷积层relu层池化层可以写成一个套餐
# 注意卷积最后结果还是一个特征图需要把图转换成向量才能做分类或者回归任务class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv1 nn.Sequential( # 输入大小 (1, 28, 28)nn.Conv2d(in_channels1, # 灰度图out_channels16, # 要得到几多少个特征图kernel_size5, # 卷积核大小stride1, # 步长padding2, # 如果希望卷积后大小跟原来一样需要设置padding(kernel_size-1)/2 if stride1), # 输出的特征图为 (16, 28, 28)nn.ReLU(), # relu层nn.MaxPool2d(kernel_size2), # 进行池化操作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(), lr0.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])) # 打印当前进度和准确率信息