当前位置:   article > 正文

基于pytorch实现手写数字识别_pytorch 识别图片中的数字

pytorch 识别图片中的数字

1,先安装pytorch,在pytorch环境中安装库:

1)进入所安装的pytorch环境,我的是pytorch

所以激活它:

conda activate pytorch

2)使用pip安装numpy,torch,torchvision,matplotlib库 

pip install numpy torch torchvision matplotlib

回车安装4个库

2,再将test.py文件用vscode打开,pycharm也行(主要我不怎么会用),这里用vscode展示。

 注意右下角环境要选好。

这里我已经测试了两次,最高在0.96左右。

献上源码:

  1. import torch
  2. from torch.utils.data import DataLoader
  3. from torchvision import transforms
  4. from torchvision.datasets import MNIST
  5. import matplotlib.pyplot as plt
  6. class Net(torch.nn.Module):#定义一个NET类,它就是神经网络的主体
  7. def __init__(self):
  8. super().__init__() #四个全连接层
  9. self.fc1 = torch.nn.Linear(28*28, 64)#输入为28*28的像素尺寸图像
  10. self.fc2 = torch.nn.Linear(64, 64)
  11. self.fc3 = torch.nn.Linear(64, 64)#中间三层放了64个节点
  12. self.fc4 = torch.nn.Linear(64, 10)#输出为10个数字类别
  13. def forward(self, x):#forward函数定义了前向传播过程,参数x是图像输入
  14. x = torch.nn.functional.relu(self.fc1(x))#每层连接中我们先做全连接线性计算
  15. x = torch.nn.functional.relu(self.fc2(x))#再套上一个激活函数torch.nn.functional.relu
  16. x = torch.nn.functional.relu(self.fc3(x))
  17. x = torch.nn.functional.log_softmax(self.fc4(x), dim=1)#输出层通过sodtmax归一化,这里的log_softmax是为了提高计算的稳定性。
  18. return x#在softmax之外又套上了torch.nn.functional.log_softmax对数运算
  19. def get_data_loader(is_train):#导入数据
  20. to_tensor = transforms.Compose([transforms.ToTensor()])#定义一个tensor,是一个多维数组,中文叫张量
  21. data_set = MNIST("", is_train, transform=to_tensor, download=True)#下载MNIST数据集,""是下载目录,空表示当前目录,is_train用来决定是导入训练集还是测试集
  22. return DataLoader(data_set, batch_size=15, shuffle=True)#batch_size=15表示一个批次含15张图片,shuffle=True表示数据是随机打乱的,最后返回数据加载器
  23. def evaluate(test_data, net):#用来评估神经网络的正确率,
  24. n_correct = 0
  25. n_total = 0
  26. with torch.no_grad():
  27. for (x, y) in test_data:
  28. outputs = net.forward(x.view(-1, 28*28))#计算神经网络预测值
  29. for i, output in enumerate(outputs):#对批次结果进行比较,累加正确预测的数量
  30. if torch.argmax(output) == y[i]:#argmax函数计算数据中最大值的序号也就是预测的手写数字结果
  31. n_correct += 1
  32. n_total += 1
  33. return n_correct / n_total#返回正确率
  34. def main():
  35. train_data = get_data_loader(is_train=True)#导入训练集
  36. test_data = get_data_loader(is_train=False)#导入测试集
  37. net = Net()#初始化神经网络
  38. print("initial accuracy:", evaluate(test_data, net))#打印初始网络的正确率
  39. optimizer = torch.optim.Adam(net.parameters(), lr=0.001)#一下几行代码训练神经网络,都是pytorch的固定写法
  40. for epoch in range(2):#epoch反复训练,提高数据集的利用率,每一个轮次就是一个epoch
  41. for (x, y) in train_data:
  42. net.zero_grad()#初始化
  43. output = net.forward(x.view(-1, 28*28))#正向传播
  44. loss = torch.nn.functional.nll_loss(output, y)#计算差值,nll_loss是对数损失函数,是为了匹配前面的log_softmax中的对数运算
  45. loss.backward()#反向误差传播
  46. optimizer.step()#优化网络参数
  47. print("epoch", epoch, "accuracy:", evaluate(test_data, net))#每个轮次后打印当前网络的正确率
  48. for (n, (x, _)) in enumerate(test_data):#训练完成后随机抽取3张图像显示网络预测结果
  49. if n > 3:
  50. break
  51. predict = torch.argmax(net.forward(x[0].view(-1, 28*28)))
  52. plt.figure(n)
  53. plt.imshow(x[0].view(28, 28))
  54. plt.title("prediction: " + str(int(predict)))
  55. plt.show()
  56. if __name__ == "__main__":
  57. main()

 1,讲解

1)使用MNIST数据集:手写数字图片7万张(训练6万张,测试1万张)。

2)什么是神经网络?

通过softmax归一化得到了看起来像概率的数值(概率分布),但它还不是真的概率,

调整a,b的值,如梯度下降算法,ADAM算法将神经网络问题转为最优化问题,重复过程几万次。

神经网络的本质是一个数学函数,训练的过程就是调整函数中的参数。

观察公式是线性的,但不是每个都是线性的,所以再套上一个非线性函数(也叫激活函数),f()

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/369105
推荐阅读
相关标签
  

闽ICP备14008679号