#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Project :深度学习
@File :实验一手写体识别.py
@Author :郑家祥_202028019410032
@Date :2021/5/17 21:57
@Description:利用MNIST数据集在Pytorch框架上进行手写数字体识别,测试误差达到98%及以上
"""
import torch
import torchvision
from torch import nn
import torch.optim as optim
from torch.utils import data
from torchvision import transforms
import torch.utils.data as Data
from tensorboardX import SummaryWriter
import hiddenlayer as hl
def createBatchData(batch_size, resize=None):
'''
使用DataLoader创建随机批量数据
'''
trans = [transforms.ToTensor()]
if resize:
trans.insert(0, transforms.Resize(resize))
trans = transforms.Compose(trans)
mnist_train = torchvision.datasets.MNIST(root='data', train=True, transform=trans, download=False)
minst_test = torchvision.datasets.MNIST(root='data', train=False, transform=trans, download=False)
return (data.DataLoader(mnist_train, batch_size, shuffle = True, num_workers=4),
data.DataLoader(minst_test, batch_size, shuffle = False, num_workers=4))
class myNet(nn.Module):
'''
构建卷积神经网络,与LeNet类似
'''
def __init__(self):
super(myNet, self).__init__()
self.CNN1 = nn.Sequential(
nn.Conv2d(1, 6, kernel_size=3, stride=1, padding=1),#6*28*28
nn.ReLU(inplace=True),
nn.AvgPool2d(kernel_size=2,stride=2)#6*14*14
)
self.CNN2 = nn.Sequential(
nn.Conv2d(6, 16, kernel_size=5, stride=1), #16*10*10
nn.ReLU(inplace=True),
nn.AvgPool2d(kernel_size=2,stride=2) #16*5*5
)
self.FC1 = nn.Sequential(
nn.Flatten(),
nn.Linear(400, 120),
nn.ReLU(inplace=True),
nn.Linear(120, 84),
nn.ReLU(inplace=True),
nn.Linear(84, 10)
)
def reshape_(self, x):
return x.reshape(-1, 1, 28, 28)
def forward(self, x):
x = self.reshape_(x)
x = self.CNN1(x)
x = self.CNN2(x)
x = self.FC1(x)
return x
def sameNumber(y_hat, y):
'''
返回预测值与真实值相等的个数
'''
if len(y_hat.shape) > 1 and y_hat.shape[1] > 1:
y_hat = y_hat.argmax(axis=1)
cmp = y_hat.type(y.dtype) == y
return float(cmp.type(y.dtype).sum())
class Accumulator():
'''
构建n列变量,每列累加
'''
def __init__(self, n):
self.data = [0.0] * n
def add(self, *args):
self.data = [a + float(b) for a, b in zip(self.data, args)]
def reset(self):
self.data = [0.0] * len(self.data)
def __getitem__(self, index):
return self.data[index]
def testNet(net, testData):
'''
计算测试误差
'''
if isinstance(net, torch.nn.Module):
net.eval()
metric = Accumulator(2)
for X, y in testData:
X, y = X.to(device), y.to(device)
y_hat = net(X)
sameNum = sameNumber(y_hat, y)
metric.add(sameNum, y.numel())
return metric[0] / metric[1]
def trainNet(net, trainData, testData, num_epochs, lr, device):
'''
使用trainData训练网络
'''
def init(m):
if type(m) == nn.Linear or type(m) == nn.Conv2d:
nn.init.xavier_uniform_(m.weight)
net.apply(init)
net.to(device)
optimizer = optim.SGD(net.parameters(), lr=lr)
lossFun = nn.CrossEntropyLoss()
writer = SummaryWriter(logdir='assets/visualize', comment="test1")
for epoch in range(num_epochs):
metric = Accumulator(3)
net.train()
for i, (X, y) in enumerate(trainData):
X, y = X.to(device), y.to(device)
y_hat = net(X)
loss = lossFun(y_hat, y)
optimizer.zero_grad()
loss.sum().backward()
optimizer.step()
with torch.no_grad():
metric.add(loss * X.shape[0], sameNumber(y_hat, y), X.shape[0])
train_loss = metric[0] / metric[2]
train_acc = metric[1] / metric[2]
test_acc = testNet(net, testData)
writer.add_scalar('TrainLoss', train_loss, epoch)
writer.add_scalar('TrainAccuracy', train_acc, epoch)
writer.add_scalar('TestAccuracy', test_acc, epoch)
print(f'loss {train_loss:.3f}, train acc {train_acc:.3f}, 'f'test acc {test_acc:.3f}')
if __name__ == '__main__':
batch_size = 256
num_epochs = 100
lr = 0.01
device = torch.device('cuda' if torch.cuda.is_available else 'cpu')
trainDataIter, testDataIter = createBatchData(batch_size);
net = myNet()
'''
modelVis = hl.build_graph(net, torch.zeros([1 ,1, 28, 28]))
modelVis.theme = hl.graph.THEMES["blue"].copy()
modelVis.save("assets/test2",format='png')
'''
trainNet(net, trainDataIter, testDataIter, num_epochs=num_epochs, lr=lr, device=device);
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
深度学习作业_基于pytorch框架python实现手写数字识别完整源码+代码注释+实验报告.zip 使用MNIST手写数字体数据集进行训练和预测,实现测试集准确率达到98%及以上。本实验的目的: 掌握卷积神经网络基本原理,以LeNet为例 掌握主流框架的基本用法以及构建卷积神经网络的基本操作 了解如何使用GPU
资源推荐
资源详情
资源评论
收起资源包目录
深度学习作业_基于pytorch框架python实现手写数字识别完整源码+代码注释+实验报告.zip (7个子文件)
深度学习作业_基于pytorch框架python实现手写数字识别完整源码+代码注释+实验报告
main.py 5KB
实验报告.7z 207KB
assets
visualize
events.out.tfevents.1621082770.LAPTOP-2N3BREN3 14KB
events.out.tfevents.1621082747.LAPTOP-2N3BREN3 40B
test2.png 6KB
test1 3KB
test1.png 48KB
共 7 条
- 1
FL1623863125
- 粉丝: 8769
- 资源: 4507
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 电力系统优化调度,python实现benders分解算法
- C#上位机与台达PLC通信,modbus TCP协议 1.真实使用项目,该程序框架完整,适合在此基础上开发项目 2.使用VS
- Python医学数据分析,医学数据采集,采集网站,采集方法,便于探索医学数据
- MATLAB Simulink电动汽车转弯制动ABS模型,联合直接横摆力矩DYC 转向制动稳定性控制 软件使用:Matlab
- 西门子PLC1200博途V16程序画面例程,具体项目工艺为制药厂生物发酵系统,程序内有报警,模拟量标定处理,温度PID,称重仪表
- 大型语言模型中的损失函数及其应用场景解读
- Simulink永磁同步电机(PMSM)模型,一共有两个,分别是基本型永磁同步电机模型(B-PMSM)和磁饱和型永磁同步电机模型
- 西门子S7-1200PLC脉冲控制伺服程序案例 此程序是关于西门子1200PLC以PTO脉冲方式控制伺服电机,步进电机的功能块程
- OpenScenario场景仿真结构思维导图, OpenScenario是 自动驾驶仿真软件carla推出来的场景仿真标准,可配
- 永磁同步电机的控制算法仿真模型: 1. 永磁同步电机的MRAS无传感器矢量控制: 2. 永磁同步电机的SMO无传感器矢量控制(反
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页