本篇文章是博主在人工智能等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在Pytorch:
Pytorch(1)---《pytorch实现 --- 手写数字识别》
pytorch实现 --- 手写数字识别
目录
1.项目介绍
2.实现方法
3.程序代码
4.运行结果
1.项目介绍
使用pytorch实现手写数字识别,十分简单的小项目,环境搭建好,一跑就通。
2.实现方法
2.1方式1
安装库:
pip install numpy torch torchvision matplotlib
运行:
python test.py
首次运行会下载MNIST数据集,请保持网络畅通
2.2方式2
如果使用pycharm,已经安装好了pytorch环境,那么直接在pytorch环境中运行下面这份代码就好。
3.程序代码
"""手写数字识别项目时间:2023.11.6环境:pytorch作者:Rainbook
"""import torch
from torch.utils.data import DataLoader
from torchvision import transforms
from torchvision.datasets import MNIST
import matplotlib.pyplot as pltclass Net(torch.nn.Module): # 定义一个Net类,神经网络的主体def __init__(self): # 全连接层,四个super().__init__()self.fc1 = torch.nn.Linear(28*28, 64) # 输入层输入28*28,输出64self.fc2 = torch.nn.Linear(64, 64) # 中间层,输入64,输出64self.fc3 = torch.nn.Linear(64, 64)self.fc4 = torch.nn.Linear(64, 10) # 中间层(隐藏层)的最后一层,输出10个特征值def forward(self, x): # 前向传播过程# self.fc1(x)全连接线性计算,再套上一个激活函数torch.nn.functional.relu()x = torch.nn.functional.relu(self.fc1(x))x = torch.nn.functional.relu(self.fc2(x))x = torch.nn.functional.relu(self.fc3(x))# 最后一层进行softmax归一化,log_softmax是为了提高计算稳定性,在softmax后面套上了一个对数运算x = torch.nn.functional.log_softmax(self.fc4(x), dim=1)return xdef get_data_loader(is_train):to_tensor = transforms.Compose([transforms.ToTensor()]) # 定义数据转换类型tensor,多维数组(张量)"""下载MNIST数据集,"":当前位置is_train:判断是训练集还是测试集;batch_size:一个批次包含15张图片;shuffle:数据随机打乱的"""data_set = MNIST("", is_train, transform=to_tensor, download=True)return DataLoader(data_set, batch_size=15, shuffle=True) # 数据加载器def evaluate(test_data, net): # 用来评估神经网络n_correct = 0n_total = 0with torch.no_grad():for (x, y) in test_data:outputs = net.forward(x.view(-1, 28*28)) # 计算神经网络的预测值for i, output in enumerate(outputs): # 对每个批次的预测值进行比较,累加正确预测的数量if torch.argmax(output) == y[i]:n_correct += 1n_total += 1return n_correct / n_total # 返回正确率def main():# 导入训练集和测试集train_data = get_data_loader(is_train=True)test_data = get_data_loader(is_train=False)net = Net() # 初始化神经网络# 打印初始网络的正确率,应当是10%附近。手写数字有十种结果,随机猜的正确率就是1/10print("initial accuracy:", evaluate(test_data, net))"""训练神经网络pytorch的固定写法"""optimizer = torch.optim.Adam(net.parameters(), lr=0.001)for epoch in range(5): # 需要在一个数据集上反复训练神经网络,epoch网络轮次,提高数据集的利用率for (x, y) in train_data:net.zero_grad() # 初始化output = net.forward(x.view(-1, 28*28)) # 正向传播# 计算差值,nll_loss对数损失函数,为了匹配log_softmax的log运算loss = torch.nn.functional.nll_loss(output, y)loss.backward() # 反向误差传播optimizer.step() # 优化网络参数print("epoch", epoch, "accuracy:", evaluate(test_data, net)) # 打印当前网络的正确率"""测试神经网络训练完成后,随机抽取3张图片进行测试"""for (n, (x, _)) in enumerate(test_data):if n > 3:breakpredict = torch.argmax(net.forward(x[0].view(-1, 28*28))) # 测试结果plt.figure(n) # 画出图像plt.imshow(x[0].view(28, 28)) # 像素大小28*28plt.title("prediction: " + str(int(predict))) # figure的标题plt.show()if __name__ == "__main__":main()
4.运行结果
4.1正确率
4.2测试结果
参考资料来源:B站
文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者关注VX公众号:Rain21321,联系作者。