# MNIST-pytorch **Repository Path**: kun1010/mnist-pytorch ## Basic Information - **Project Name**: MNIST-pytorch - **Description**: Pytorch 实现全连接神经网络/卷积神经网络训练MNIST数据集,并将训练好的模型在制作自己的手写图片数据集上测试 - **Primary Language**: Python - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 6 - **Created**: 2021-12-20 - **Last Updated**: 2021-12-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 使用教程 代码下载地址:[点我下载](https://gitee.com/martin64/mnist-pytorch)  **模型在训练过程中会自动显示训练进度,如果您的pytorch是CPU版本的,代码会自动选择CPU训练,如果有cuda,则会选择GPU训练。** **项目目录说明:** CNN文件夹是用来保存卷积神经网络模型代码,其中**model.py,my_dataset.py**是被自动调用的,都不需要运行 FC文件夹是用来保存全连接神经网络模型代码,其中**model.py,my_dataset.py**是被自动调用的,都不需要运行 dataset文件夹是保存MNIST官方数据集的文件夹,不需改动 images文件夹是用来保存REAEDME.md文件中引用的图片的,不需改动 my_mnist_dateset文件夹是用来保存自己手写数字图片与标签文件的,自己手写的图片请放在my_mnist_dateset/classify对应的文件夹中 **make_ours_dataset.py**文件是用来处理my_mnist_dateset文件夹下的图像并生成标签用的 **模型训练** 运行CNN文件下的train.py文件训练卷积神经网络模型,训练完成后会生成文件**cnn_trained_model.pth** 运行FC文件下的train.py文件训练全连接神经网络模型,训练完成后会生成文件**fc_trained_model.pth** **模型测试** 1. 在my_mnist_dateset/classify文件夹下的10个文件夹下放入对应的手写数字图片,图片长和宽随意,注意图片要是白底黑字的。 2. 运行make_ours_dataset.py,它会自动将白底黑字图片转换为黑底白字,并自动生成标签。 3. 如果要测试训练好的CNN模型,请运行CNN文件夹下的**trained_model_test.py** 4. 如果要测试训练好的FC模型,请运行FC文件下的**trained_model_test.py** **准确率参考:**
卷积神经网络模型的代码:
```python
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__();
self.conv1=torch.nn.Conv2d(1,10,kernel_size=5);
self.conv2=torch.nn.Conv2d(10,20,kernel_size=5);
self.pooling=torch.nn.MaxPool2d(2);
self.fc=torch.nn.Linear(320,10);
self.relu=torch.nn.ReLU();
def forward(self, x):
batch_size=x.size(0);
x=self.conv1(x);
x=self.pooling(x);
x=self.relu(x);
x = self.conv2(x);
x = self.pooling(x);
x = self.relu(x);
x=x.view(batch_size,-1);
x=self.fc(x);
return x;
```
### 训练模型和模型保存
只要运行**CNN/train.py**就可以训练卷积神经网络了,然后会在CNN文件下生成一个**cnn_trained_model.pth**,这样就保存好了训练好的模型。
# 制作自己的数据集
[python制作自己的数据集](https://blog.csdn.net/zhangjunp3/article/details/79627824?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162772919416780274116746%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162772919416780274116746&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-79627824.first_rank_v2_pc_rank_v29&utm_term=python%E5%88%B6%E4%BD%9C%E8%87%AA%E5%B7%B1%E7%9A%84%E6%95%B0%E6%8D%AE%E9%9B%86&spm=1018.2226.3001.4187)
my_mnist_dateset文件夹下有三个文件夹,classify、images、labels。
- classify文件夹下有10个文件夹,保存未处理的手写图片,比如1文件夹保存数字1的手写图片,依次类推。
- image文件夹保存从classify文件夹中读取的所有图片。
- labels文件夹保存标签。
整个目录树如图所示。

## 手写图片制作
打开画板,写一些数字,然后用图片编辑软件裁剪图片,使得数字大概在裁剪图片的中心,然后在my_mnist_dateset/classify文件夹下的10个文件夹下放入对应的手写数字图片。
我手写的10个数字如下:

## 图片批处理与标签生成
运行**make_ours_dataset.py**,这样就会把my_mnist_dateset/classify文件下的图片转换为黑底白字

同时,在labels文件夹下会自动生成labels.txt文件,里面保存了图片名称和对应的标签,如下图所示:

# 模型测试
在训练神模型那一节,我们训练了两个神经网络,FC和CNN,并保存了训练好的模型,也就是**fc_trained_model.pth**与**cnn_trained_model.pth**两个文件,这两个文件保留了我们训练好模型的参数。
接下来我们要加载这两个训练好的模型,测试自己的数据集。
## 载入自己的数据集
首先,和前面载入MNIST数据集一样,对于自己的数据集,也要先标准化。
**my_dataset.py**继承了Dataset,它能载入my_mnist_dateset文件夹下的E图片与标签,它是被**train.py**自动调用的,所以不用运行它。
代码如下:
```python
import torch
import os
from PIL import Image
from torch.utils.data import Dataset
class MyMnistDataset(Dataset):
def __init__(self, root, transform):
self.myMnistPath = root
self.imagesData = []
self.labelsData = []
self.labelsDict = {}
self.trans = transform
self.loadLabelsDate()
self.loadImageData()
# 读取标签txt文件,并生成字典
def loadLabelsDate(self):
labelsPath = os.path.join(self.myMnistPath, "labels", "labels.txt")
f = open(labelsPath)
lines = f.readlines()
for line in lines:
name = line.split(' ')[0]
label = line.split(' ')[1]
self.labelsDict[name] = int(label)
# 读取手写图片数据,并将图片数据和对应的标签组合在一起
def loadImageData(self):
imagesFolderPath = os.path.join(self.myMnistPath, 'images')
imageFiles = os.listdir(imagesFolderPath)
for imageName in imageFiles:
imagePath = os.path.join(imagesFolderPath, imageName)
image = Image.open(imagePath)
grayImage = image.convert("L")
imageTensor = self.trans(grayImage)
self.imagesData.append(imageTensor)
self.labelsData.append(self.labelsDict[imageName])
self.labelsData = torch.Tensor(self.labelsData)
# 重写魔法函数
def __getitem__(self, index):
return self.imagesData[index], self.labelsData[index]
# 重写魔法函数
def __len__(self):
return len(self.labelsData)
```
## 载入训练好的模型
1. 如果要测试训练好的CNN模型,请运行CNN文件夹下的**trained_model_test.py**
2. 如果要测试训练好的FC模型,请运行FC文件下的**trained_model_test.py**
# 相关课程学习
本项目是在B站上学习 刘二大人 的课程 《Pytorch深度学习实践》后完善做成的,相关课程链接如下:
[https://www.bilibili.com/video/BV1Y7411d7Ys?from=search&seid=5291537098843647660](https://www.bilibili.com/video/BV1Y7411d7Ys?from=search&seid=5291537098843647660)
两外,CSDN博主 错错莫 将课程中的例子用代码实现了出来,相关链接如下:
[https://blog.csdn.net/bit452/category_10569531.html](https://blog.csdn.net/bit452/category_10569531.html)