任务要求:利用PyTorch框架搭建一个LeNet模型,并针对MNIST数据集进行训练和测试。
数据集:MNIST

导入:

import torch
from torch import nn, optim
from torch.autograd import Variable
from torch.nn import functional as F
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
# %matplotlib inline
use_gpu = True if torch.cuda.is_available() else False
print('Use GPU:', use_gpu)

运行结果如下:

Use GPU: True

1. 数据集加载:

利用torchvision的datasets加载MNSIT数据集

transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize([0.5],[0.5])]
)batch_size = 64
train_dataset = datasets.MNIST(root='./data/', train=True, transform=transform, download=True)
print(train_dataset)train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
train_num = len(train_dataset)
print('train image num:', train_num)

运行结果如下:

Dataset MNISTNumber of datapoints: 60000Root location: ./data/Split: TrainStandardTransform
Transform: Compose(ToTensor()Normalize(mean=[0.5], std=[0.5]))
train image num: 60000
test_dataset = datasets.MNIST(root='./data/', train=False, transform=transform, download=True)
print(test_dataset)test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=True)
test_num = len(test_dataset)
print('test image num:', test_num)

运行结果如下:

Dataset MNISTNumber of datapoints: 10000Root location: ./data/Split: TestStandardTransform
Transform: Compose(ToTensor()Normalize(mean=[0.5], std=[0.5]))
test image num: 10000

2. LeNet模型构建:

利用PyTorch构建LeNet模型类

class LeNet(nn.Module):''' 请在下方编写LeNet模型的代码 '''def __init__(self):super(LeNet,self).__init__()self.conv1 = nn.Conv2d(1, 6, 5, 1,)self.conv2 = nn.Conv2d(6, 16, 5, 1)self.fc1 = nn.Linear(16*4*4, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x):#x:1*28*28x = F.max_pool2d(self.conv1(x), 2, 2)x = F.max_pool2d(self.conv2(x), 2, 2)x = x.view(-1, 16*4*4)x = self.fc1(x)x = self.fc2(x)x = self.fc3(x)return F.log_softmax(x,dim=1)
cnn = LeNet()
if use_gpu:cnn = cnn.cuda()
print(cnn)

运行结果如下:

LeNet((conv1): Conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))(conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))(fc1): Linear(in_features=256, out_features=120, bias=True)(fc2): Linear(in_features=120, out_features=84, bias=True)(fc3): Linear(in_features=84, out_features=10, bias=True)
)

3. 优化器和损失函数:

定义优化器(SGD/Adam)和交叉熵损失函数

# 优化器
import torch.optim as optim
# ''' 请在下方编写优化器定义代码 '''
optimizer = torch.optim.Adam(cnn.parameters(), lr=0.001, betas=(0.9, 0.99))
print(optimizer)# output = cnn(data)
from torch.nn import functional as F
# 损失函数
# ''' 请在下方编写损失函数定义代码 '''criterion = nn.CrossEntropyLoss(size_average=False)#         loss = F.cross_entropy(output,target)  #交叉熵损失函数
print(criterion)

运行结果如下:

Adam (
Parameter Group 0amsgrad: Falsebetas: (0.9, 0.99)eps: 1e-08lr: 0.001weight_decay: 0
)
CrossEntropyLoss()

4. 模型训练和测试:

模型训练函数(要求间隔记录输出损失函数及正确率)

# 训练CNN模型
def train(epoch):cnn.train()train_loss = 0correct = 0for batch_idx, (data, label) in enumerate(train_loader):''' 请在下方编写计算损失函数、预测正确数、误差反向传播、梯度更新相关代码 '''output = cnn(data)optimizer.zero_grad()loss = criterion(output,label)loss.backward()optimizer.step()                       #相当于更新权重值pred = output.max(1, keepdim=True)[1] # 找到概率最大的下标correct += pred.eq(label.view_as(pred)).sum().item()# 输出训练阶段loss信息train_loss += loss.item()train_loss_list.append(loss.item())if batch_idx % 200 == 0:print('Train Epoch: {} [{:05d}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(epoch, batch_idx * len(data), train_num,100 * batch_idx * len(data) / train_num, loss.item()))train_loss /= train_numaccuracy = correct / train_numtrain_acc_list.append(accuracy)# 输出训练阶段loss信息print('Train Epoch: {}\tAverage loss: {:.4f}\tAccuracy: {}/{} ({:.2f}%)'.format(epoch, train_loss, correct, train_num, 100.0 * accuracy))

模型测试函数(要求间隔记录输出损失函数及正确率)

# 测试CNN模型
def test():cnn.eval()test_loss = 0correct = 0for data, label in test_loader:if use_gpu:  # 使用GPUdata, label = Variable(data).cuda(), Variable(label).cuda()''' 请在下方编写计算损失函数、预测正确数相关代码 '''output = cnn(data)loss = criterion(output, label) # 将一批的损失相加pred = output.max(1, keepdim=True)[1] # 找到概率最大的下标correct += pred.eq(label.view_as(pred)).sum().item()test_loss += loss.item()test_loss_list.append(loss.item())test_loss /= test_numaccuracy = correct / test_numtest_acc_list.append(accuracy)# 输出测试阶段loss信息print('Test Epoch: {}\tAverage loss: {:.4f}\tAccuracy: {}/{} ({:.2f}%)\n'.format(epoch, test_loss, correct, test_num, 100.0 * accuracy))
train_loss_list = []
test_loss_list = []
train_acc_list = []
test_acc_list = []
epoch_num = 10for epoch in range(1, epoch_num+1):# 每轮训练完测试train(epoch)test()

5. 损失函数和正确率曲线:

训练损失函数图 & 测试损失函数图 & 训练/测试正确率图

plt.figure(figsize=(12,6))
plt.plot(train_loss_list)
plt.title('train loss', fontsize=18)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.grid()
plt.show()plt.figure(figsize=(12,6))
plt.plot(test_loss_list)
plt.title('test loss', fontsize=18)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.grid()
plt.show()plt.figure(figsize=(12,8))
plt.plot(train_acc_list, 'o-')
plt.plot(test_acc_list, 'o-')
plt.title('Accuracy', fontsize=18)
plt.xlabel('Epoch', fontsize=16)
plt.ylabel('Accuracy', fontsize=16)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.legend(['Train', 'Test'], fontsize=16)
plt.grid()
plt.show()

运行结果如下:


python与机器学习(七)上——PyTorch搭建LeNet模型进行MNIST分类相关推荐

  1. 使用pytorch搭建MLP多层感知器分类网络判断LOL比赛胜负

    使用pytorch搭建MLP多层感知器分类网络判断LOL比赛胜负 1. 数据集 百度网盘链接,提取码:q79p 数据集文件格式为CSV.数据集包含了大约5万场英雄联盟钻石排位赛前15分钟的数据集合,总 ...

  2. 基于PyTorch搭建CNN实现视频动作分类任务代码详解

    数据及具体讲解来源: 基于PyTorch搭建CNN实现视频动作分类任务 import torch import torch.nn as nn import torchvision.transforms ...

  3. [Python图像识别] 四十八.Pytorch构建Faster-RCNN模型实现小麦目标检测

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  4. 机器学习(七)——tf.keras搭建神经网络固定模式

    一.总纲(一般按照下面6步搭建) import--导入相关模块 train,test--指定训练集与测试集 model = tf.keras.models.Sequential--在Sequentia ...

  5. 使用pytorch搭建AlexNet并训练花分类数据集

    深度学习学习笔记 导师博客:https://blog.csdn.net/qq_37541097/article/details/103482003 导师github:https://github.co ...

  6. 使用Pytorch搭建CNN模型完成食物图片分类(李宏毅视频课2020作业3,附超详细代码讲解)

    文章目录 0 前言 1 任务描述 1.1 数据描述 1.2 作业提交 1.3 数据下载 1.3.1 完整数据集 1.3.2 部分数据集 2 过程讲解 2.1 读取数据 2.2 数据预处理 2.3 模型 ...

  7. 3.2 使用pytorch搭建AlexNet并训练花分类数据集

    文章目录 class_indices.json model.py predict.py train.py 创建自己的数据集 #详解 class_indices.json {"0": ...

  8. Pytorch搭建GoogLeNet网络(奥特曼分类)

    1 爬取奥特曼 get_data.py import requests import urllib.parse as up import json import time import osmajor ...

  9. pytorch搭建TextRCNN模型与使用案例

    论文地址:http://www.nlpr.ia.ac.cn/cip/~liukang/liukangPageFile/Recurrent%20Convolutional%20Neural%20Netw ...

最新文章

  1. golang实现给图片加水印
  2. SIFT原理与源码分析 特征检测 描述子
  3. spinlock与linux内核调度的关系
  4. 串口通信模块4:串口操作自定义类(1)
  5. proe5.0安装教程
  6. 【剑指offer】面试题43:n个骰子的点数
  7. 01.analyzer简介及char_filter组件
  8. AttributeError: 'Polar AxesSubplot' object has no attribute 'set_axis_bgcolor'
  9. 最后一个单词的长度Python解法
  10. 如何种植屡获殊荣的青豆
  11. 云计算体系结构中soa构建层_云计算的服务模式及技术结构
  12. 618选购手机正当时,好评率高达99%的手机了解一下!
  13. C语言和设计模式(工厂模式)
  14. Cisco交换机密码忘记重置
  15. C语言 复制字符串 malloc
  16. RGSSAD解密程序(基于RgssadUnpacker改进以支持RGSS3A)
  17. 如何成为一名机器学习算法工程师
  18. huobi程序化交易项目
  19. 如何使用高德地图 API 做一个路线规划应用,展示自定义路线
  20. 全智通A+常见问题汇总解答—A+采购入库保存一张入库单,页面显示两张入库单

热门文章

  1. 《暖冬里的事儿 ——春假散札》
  2. Mediator模式(C++中介者模式含个人Demo源码)
  3. 令新手头痛的java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet错误...
  4. xadmin与admin设置
  5. python计算蛋白质的质量
  6. 磁盘IOPS计算与测量
  7. 外贸网站建设(转自xmfish)
  8. spring在java工程中的运用
  9. python画动态玫瑰花图片大全_【python】trutle绘制送给女神的玫瑰花图
  10. Java国际化概念和使用介绍