使用Pytorch和手写数据集MNIST构建一个简单的神经网络

 在这个示例中,使用 PyTorch 构建了一个简单的神经网络,来进行手写数字识别。

'''
构建一个简单的神经网络可以分为以下几个步骤:

1. 导入 PyTorch 库和其他必要的库。
2. 准备数据集,包括训练集和测试集。
3. 定义神经网络的结构和参数。
4. 定义损失函数和优化器。
5. 训练神经网络。
6. 测试神经网络。
'''


################   1. 导入 PyTorch 库和其他必要的库。 ################
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
from torchvision.transforms import transforms

import os

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

path_current = os.path.dirname(__file__)
path_down = os.path.join(path_current,'./data')

################ 定义参数 ################
input_size = 784    # 因为手写体是 28*28,需要转换为一维数据输入到神经网络中
hidden_size = 128   # 128 可以随便写
num_classes = 10    # 类别数量
batch_size = 100    # 批次


################   2. 准备数据集,包括训练集和测试集。 ################
train_dataset = torchvision.datasets.MNIST(root=path_down , train=True,transform=transforms.ToTensor() ,download=True)
test_dataset = torchvision.datasets.MNIST(root=path_down , train=False,transform=transforms.ToTensor())
print(train_dataset.data[1],train_dataset.classes[1])

train_loader = torch.utils.data.DataLoader(dataset=train_dataset,batch_size=batch_size,shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset,batch_size=batch_size,shuffle=False)

################   3. 定义神经网络的结构和参数。 ################
class Net(nn.Module):
    def __init__(self,input_size, hidden_size,num_classes):
        super(Net,self).__init__()
        self.fc1 = nn.Linear(input_size,hidden_size)
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(hidden_size,64 )
        self.fc3 = nn.Linear(64, num_classes)

    def forward(self, x):
        out = self.fc1(x)
        out = self.relu(out)
        out = self.fc2(out)
        out = self.relu(out)
        out = self.fc3(out)

        return out 

# 实例化神经网络
net = Net(input_size, hidden_size, num_classes)

################   4. 定义损失函数和优化器。 ################   
criterion = nn.CrossEntropyLoss()                   # 交叉熵损失函数
optimizer = optim.Adam(net.parameters(), lr = 0.01)   # 优化器

################   5. 训练神经网络。 ################
num_epochs = 5
for epoch in range(num_epochs):
    for i,(images,labels) in enumerate(train_loader):
        images = images.reshape(-1,28*28)
        optimizer.zero_grad()
        outputs = net(images)
        loss = criterion(outputs,labels)
        loss.backward()
        optimizer.step()

        if (i+1)%100 == 0:
            print(f"Epoch: {(epoch + 1)}/{num_epochs} ,  Step: {(i+1)}/{len(train_loader)},  LOSS: {'% .4f' % loss.item()}")


################   6.测试神经网络。 ################
# 计算测试集准确率
def acc():
    with torch.no_grad():
        correct = 0
        total = 0
        for images , labels in test_loader:
            images = images.reshape(-1,28*28)
            outputs = net(images)
            _,predicted = torch.max(outputs.data, 1)  # 取列上最大值
            total +=labels.size(0)      # labels形状为(100,784),相当于取出批次100的总数
            correct += (predicted == labels ).sum().item()          # 计算预测的准确率。(predicted == labels ).sum(),张量比较求出真值数量,得到的为Tensor,再用item()取出值
            print(f"Accuracy of the network on the 10000 test images: {'% .4f' % (100*correct/total)}")


################# 定义预测函数 ################
def predict(n):
    # 加载预测数据,第n个数据
    input_img_data = test_dataset.data[n].to(torch.float32).reshape(-1,28*28)           # test_dataset.data[n]类型为uint8,需要将数据转换成Tensor的浮点类型
    
    # 进行前向传播
    output_1 = net(input_img_data)
 
    # 解释输出
    print('真实标签:', test_dataset.targets[n])         # test_dataset.targets[n]或test_dataset.test_labels[n] 取出对应的标签,也可以用.item()取出值
    _, predicted = torch.max(output_1.data, dim=1)      # 采用取出最大概率值所对应的索引,即得对应的标签(0-9)
    print('预测标签:', predicted.item())                # 取出预测值
    
if __name__ == "__main__":
    # acc()
    for i in range(10,15):  # 随机抽查
        predict(i) # 预测
        # 显示真实值对应的手写数字
        im_arr = test_dataset.data[i].to(torch.float32)
        myimgray = im_arr.numpy()
        plt.figure(figsize=(6,6))
        plt.imshow(myimgray,cmap=plt.cm.gray)
        plt.show()

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值