手写数字识别的卷积神经网络实现-pytorch

卷积神经网络的实现参考课程【CNN卷积神经网络

数据集下载

卷积神经网络经常被应用于手写数字的数据集mnist的识别,若数据集下载出现异常,可以到【MNIST数据集】进行数据集下载。

train_data = torchvision.datasets.MNIST(
        root='./mnist',         #保存或者提取位置
        train=True,             #如果为True则为训练集,如果为False则为测试集
        transform=torchvision.transforms.ToTensor(),    #将图片转化成取值[0,1]的Tensor用于网络处理
        download=False           #是否下载数据集
    )

训练数据获取

def dataLoader():
    # 获取Mnist手写数字数据集
    train_data = torchvision.datasets.MNIST(
        root='./mnist',         #保存或者提取位置
        train=True,             #如果为True则为训练集,如果为False则为测试集
        transform=torchvision.transforms.ToTensor(),    #将图片转化成取值[0,1]的Tensor用于网络处理
        download=False           #是否下载数据集
    )
    # plt.imshow(train_data.train_data[0].numpy(),cmap='gray')
    # plt.title('%i'%train_data.train_labels[0])
    # plt.show()
    loader = Data.DataLoader(
        dataset=train_data,
        batch_size=50,      #最小训练批量
        shuffle=True,       #是否对数据进行随机打乱
        num_workers=2,      #多线程来读数据
    )

    return loader

测试数据获取

def dataTest():
    #获取测试数据
    test_data = torchvision.datasets.MNIST(root='./mnist/', train=False)
    #测试前2000个数据
    test_x = torch.unsqueeze(test_data.test_data, dim=1).type(torch.FloatTensor)[:2000]/255.   to (2000, 1, 28, 28), value in range(0,1)
    test_y = test_data.test_labels[:2000]
    return test_x,test_y

网络搭建

#搭建网络
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Sequential(         # input shape (1, 28, 28)
            nn.Conv2d(
                in_channels=1,              # input height
                out_channels=16,            # n_filters
                kernel_size=5,              # filter size
                stride=1,                   # filter movement/step
                padding=2,                  # if want same width and length of this image after Conv2d, padding=(kernel_size-1)/2 if stride=1
            ),                              # output shape (16, 28, 28)
            nn.ReLU(),                      # activation
            nn.MaxPool2d(kernel_size=2),    # choose max value in 2x2 area, output shape (16, 14, 14)
        )
        self.conv2 = nn.Sequential(         # input shape (16, 14, 14)
            nn.Conv2d(16, 32, 5, 1, 2),     # output shape (32, 14, 14)
            nn.ReLU(),                      # activation
            nn.MaxPool2d(2),                # output shape (32, 7, 7)
        )
        self.out = nn.Linear(32 * 7 * 7, 10)   # fully connected layer, output 10 classes

    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = x.view(x.size(0), -1)           # flatten the output of conv2 to (batch_size, 32 * 7 * 7)
        output = self.out(x)
        return output, x    # return x for visualization

在这里插入图片描述

训练过程

if __name__=="__main__":
    #模拟数据
    loader=dataLoader()
    test_x,test_y=dataTest()
    net=Net()
    print(net)
    #定义优化器
    optimizer = torch.optim.Adam(net.parameters(), lr=0.001)
    #定义误差函数
    loss_fun=nn.CrossEntropyLoss()

    plt.ion()
    #迭代训练
    for epoch in range(1):
        for step, (batch_x, batch_y) in enumerate(loader):
            #预测
            prediction=net(batch_x)[0]
            #计算误差
            loss=loss_fun(prediction,batch_y)
            #梯度降为0
            optimizer.zero_grad()
            #反向传递
            loss.backward()
            #优化梯度
            optimizer.step()

            if step % 50 == 0:
                test_output, last_layer = net(test_x)
                pred_y = torch.max(test_output, 1)[1].data.numpy()
                accuracy = float((pred_y == test_y.data.numpy()).astype(int).sum()) / float(test_y.size(0))
                print('Epoch: ', epoch, '| train loss: %.4f' % loss.data.numpy(), '| test accuracy: %.2f' % accuracy)
                

训练结果

在这里插入图片描述

====================================
今天到此为止,后续记录其他神经网络技术的学习过程。
以上学习笔记,如有侵犯,请立即联系并删除!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个使用PyTorch实现手写数字识别卷积神经网络,其中包括多个卷积层和全连接层。 ``` import torch import torch.nn as nn import torch.optim as optim from torch.autograd import Variable from torchvision import datasets, transforms # 定义卷积神经网络模型 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 6, 5) # 输入通道数为1,输出通道数为6,卷积核大小为5*5 self.conv2 = nn.Conv2d(6, 16, 5) # 输入通道数为6,输出通道数为16,卷积核大小为5*5 self.fc1 = nn.Linear(16 * 4 * 4, 120) # 全连接层,输入大小为16*4*4,输出大小为120 self.fc2 = nn.Linear(120, 84) # 全连接层,输入大小为120,输出大小为84 self.fc3 = nn.Linear(84, 10) # 全连接层,输入大小为84,输出大小为10 def forward(self, x): x = nn.functional.relu(self.conv1(x)) # 卷积层1,使用relu激活函数 x = nn.functional.max_pool2d(x, 2) # 最大池化层,池化核大小为2*2 x = nn.functional.relu(self.conv2(x)) # 卷积层2,使用relu激活函数 x = nn.functional.max_pool2d(x, 2) # 最大池化层,池化核大小为2*2 x = x.view(-1, 16 * 4 * 4) # 展开成一维向量 x = nn.functional.relu(self.fc1(x)) # 全连接层1,使用relu激活函数 x = nn.functional.relu(self.fc2(x)) # 全连接层2,使用relu激活函数 x = self.fc3(x) # 输出层,不使用激活函数 return x # 加载数据 train_loader = torch.utils.data.DataLoader(datasets.MNIST('../data', train=True, download=True, transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ])), batch_size=64, shuffle=True) test_loader = torch.utils.data.DataLoader(datasets.MNIST('../data', train=False, transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ])), batch_size=64, shuffle=True) # 定义模型和优化器 model = Net() optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5) # 训练模型 def train(epoch): model.train() for batch_idx, (data, target) in enumerate(train_loader): data, target = Variable(data), Variable(target) optimizer.zero_grad() output = model(data) loss = nn.functional.cross_entropy(output, target) loss.backward() optimizer.step() if batch_idx % 100 == 0: print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format( epoch, batch_idx * len(data), len(train_loader.dataset), 100. * batch_idx / len(train_loader), loss.data.item())) # 测试模型 def test(): model.eval() test_loss = 0 correct = 0 for data, target in test_loader: data, target = Variable(data, volatile=True), Variable(target) output = model(data) test_loss += nn.functional.cross_entropy(output, target, size_average=False).data.item() pred = output.data.max(1, keepdim=True)[1] correct += pred.eq(target.data.view_as(pred)).cpu().sum() test_loss /= len(test_loader.dataset) print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format( test_loss, correct, len(test_loader.dataset), 100. * correct / len(test_loader.dataset))) # 运行训练和测试 for epoch in range(1, 11): train(epoch) test() ``` 在这个模型中,我们使用了两个卷积层和三个全连接层。在每个卷积层中,我们使用了多个卷积核,以增加模型的表达能力。在训练阶段,我们使用随机梯度下降(SGD)优化器,以最小化交叉熵损失函数。在测试阶段,我们计算了模型在测试集上的准确率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南音小榭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值