PyTorch上实现卷积神经网络CNN的方法

本篇文章主要介绍了pytorch上实现卷积神经网络cnn的方法,现在分享给大家,也给大家做个参考。一起过来看看吧

一、卷积神经网络

卷积神经网络(ConvolutionalNeuralNetwork,CNN)最初是为解决图像识别等问题设计的,CNN现在的应用已经不限于图像和视频,也可用于时间序列信号,比如音频信号和文本数据等。CNN作为一个深度学习架构被提出的最初诉求是降低对图像数据预处理的要求,避免复杂的特征工程。在卷积神经网络中,第一个卷积层会直接接受图像像素级的输入,每一层卷积(滤波器)都会提取数据中最有效的特征,这种方法可以提取到图像中最基础的特征,而后再进行组合和抽象形成更高阶的特征,因此CNN在理论上具有对图像缩放、平移和旋转的不变性。

卷积神经网络CNN的要点就是局部连接(LocalConnection)、权值共享(WeightsSharing)和池化层(Pooling)中的降采样(Down-Sampling)。其中,局部连接和权值共享降低了参数量,使训练复杂度大大下降并减轻了过拟合。同时权值共享还赋予了卷积网络对平移的容忍性,池化层降采样则进一步降低了输出参数量并赋予模型对轻度形变的容忍性,提高了模型的泛化能力。可以把卷积层卷积操作理解为用少量参数在图像的多个位置上提取相似特征的过程。

二、代码实现

import torch import torch.nn as nn from torch.autograd import Variable import torch.utils.data as Data import torchvision import matplotlib.pyplot as plt  torch.manual_seed(1)  EPOCH = 1 BATCH_SIZE = 50 LR = 0.001 DOWNLOAD_MNIST = True  # 获取训练集dataset training_data = torchvision.datasets.MNIST(        root='./mnist/', # dataset存储路径        train=True, # True表示是train训练集,False表示test测试集        transform=torchvision.transforms.ToTensor(), # 将原数据规范化到(0,1)区间        download=DOWNLOAD_MNIST,        )  # 打印MNIST数据集的训练集及测试集的尺寸 print(training_data.train_data.size()) print(training_data.train_labels.size()) # torch.Size([60000, 28, 28]) # torch.Size([60000])  plt.imshow(training_data.train_data[0].numpy(), cmap='gray') plt.title('%i' % training_data.train_labels[0]) plt.show()  # 通过torchvision.datasets获取的dataset格式可直接可置于DataLoader train_loader = Data.DataLoader(dataset=training_data, batch_size=BATCH_SIZE,                 shuffle=True)  # 获取测试集dataset test_data = torchvision.datasets.MNIST(root='./mnist/', train=False) # 取前2000个测试集样本 test_x = Variable(torch.unsqueeze(test_data.test_data, dim=1),          volatile=True).type(torch.FloatTensor)[:2000]/255 # (2000, 28, 28) to (2000, 1, 28, 28), in range(0,1) test_y = test_data.test_labels[:2000]  class CNN(nn.Module):   def __init__(self):     super(CNN, self).__init__()     self.conv1 = nn.Sequential( # (1,28,28)            nn.Conv2d(in_channels=1, out_channels=16, kernel_size=5,                 stride=1, padding=2), # (16,28,28)     # 想要con2d卷积出来的图片尺寸没有变化, padding=(kernel_size-1)/2            nn.ReLU(),            nn.MaxPool2d(kernel_size=2) # (16,14,14)            )     self.conv2 = nn.Sequential( # (16,14,14)            nn.Conv2d(16, 32, 5, 1, 2), # (32,14,14)            nn.ReLU(),            nn.MaxPool2d(2) # (32,7,7)            )     self.out = nn.Linear(32*7*7, 10)    def forward(self, x):     x = self.conv1(x)     x = self.conv2(x)     x = x.view(x.size(0), -1) # 将(batch,32,7,7)展平为(batch,32*7*7)     output = self.out(x)     return output  cnn = CNN() print(cnn) ''''' CNN (  (conv1): Sequential (   (0): Conv2d(1, 16, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))   (1): ReLU ()   (2): MaxPool2d (size=(2, 2), stride=(2, 2), dilation=(1, 1))  )  (conv2): Sequential (   (0): Conv2d(16, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))   (1): ReLU ()   (2): MaxPool2d (size=(2, 2), stride=(2, 2), dilation=(1, 1))  )  (out): Linear (1568 -> 10) ) ''' optimizer = torch.optim.Adam(cnn.parameters(), lr=LR) loss_function = nn.CrossEntropyLoss()  for epoch in range(EPOCH):   for step, (x, y) in enumerate(train_loader):     b_x = Variable(x)     b_y = Variable(y)      output = cnn(b_x)     loss = loss_function(output, b_y)     optimizer.zero_grad()     loss.backward()     optimizer.step()      if step % 100 == 0:       test_output = cnn(test_x)       pred_y = torch.max(test_output, 1)[1].data.squeeze()       accuracy = sum(pred_y == test_y) / test_y.size(0)       print('Epoch:', epoch, '|Step:', step,          '|train loss:%.4f'%loss.data[0], '|test accuracy:%.4f'%accuracy)  test_output = cnn(test_x[:10]) pred_y = torch.max(test_output, 1)[1].data.numpy().squeeze() print(pred_y, 'prediction number') print(test_y[:10].numpy(), 'real number') ''''' Epoch: 0 |Step: 0 |train loss:2.3145 |test accuracy:0.1040 Epoch: 0 |Step: 100 |train loss:0.5857 |test accuracy:0.8865 Epoch: 0 |Step: 200 |train loss:0.0600 |test accuracy:0.9380 Epoch: 0 |Step: 300 |train loss:0.0996 |test accuracy:0.9345 Epoch: 0 |Step: 400 |train loss:0.0381 |test accuracy:0.9645 Epoch: 0 |Step: 500 |train loss:0.0266 |test accuracy:0.9620 Epoch: 0 |Step: 600 |train loss:0.0973 |test accuracy:0.9685 Epoch: 0 |Step: 700 |train loss:0.0421 |test accuracy:0.9725 Epoch: 0 |Step: 800 |train loss:0.0654 |test accuracy:0.9710 Epoch: 0 |Step: 900 |train loss:0.1333 |test accuracy:0.9740 Epoch: 0 |Step: 1000 |train loss:0.0289 |test accuracy:0.9720 Epoch: 0 |Step: 1100 |train loss:0.0429 |test accuracy:0.9770 [7 2 1 0 4 1 4 9 5 9] prediction number [7 2 1 0 4 1 4 9 5 9] real number '''

登录后复制

 三、分析解读

通过利用torchvision.datasets可以快速获取可以直接置于DataLoader中的dataset格式的数据,通过train参数控制是获取训练数据集还是测试数据集,也可以在获取的时候便直接转换成训练所需的数据格式。

卷积神经网络的搭建通过定义一个CNN类来实现,卷积层conv1,conv2及out层以类属性的形式定义,各层之间的衔接信息在forward中定义,定义的时候要留意各层的神经元数量。

CNN的网络结构如下:

CNN ( (conv1): Sequential (  (0): Conv2d(1, 16,kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))  (1): ReLU ()  (2): MaxPool2d (size=(2,2), stride=(2, 2), dilation=(1, 1)) ) (conv2): Sequential (  (0): Conv2d(16, 32,kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))  (1): ReLU ()  (2): MaxPool2d (size=(2,2), stride=(2, 2), dilation=(1, 1)) ) (out): Linear (1568 ->10))

登录后复制

经过实验可见,在EPOCH=1的训练结果中,测试集准确率可达到97.7%。

相关推荐:

详解PyTorch批训练及优化器比较

以上就是PyTorch上实现卷积神经网络CNN的方法的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2263079.html

(0)
上一篇 2025年2月27日 07:21:54
下一篇 2025年2月27日 07:22:23

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • php无刷新提交表单另一种方法

    通常对于无刷新提交表单,我们都是运用ajax实现的。前段时间了解到另一种无刷新提交表单的方法。现在整理出来分享给大家。 html页面: nbsp;HTML>        无刷新提交表单     ul{ list-style-type…

    编程技术 2025年4月4日
    100
  • 使用workerman实现在线聊天的方法及原理解析

    使用workerman实现在线聊天的方法及原理解析 随着互联网的发展和智能手机的普及,在线聊天已成为人们生活中不可或缺的一部分。无论是社交媒体上的即时消息还是企业内部的团队协作,都需要一种可靠且高效的在线聊天系统。workerman是一个基…

    2025年4月2日
    200
  • Workerman文档中的服务器集群实现方法

    Workerman是一个高性能的PHP Socket框架,可以使PHP更加高效地处理异步网络通信。在Workerman的文档中,有关于服务器集群实现方法的详细说明和代码示例。 为了实现服务器集群,首先需要明确服务器集群的概念。服务器集群是将…

    2025年4月2日
    100
  • Laravel监控错误的重要性及方法

    Laravel监控错误的重要性及方法 在开发Web应用程序过程中,错误是不可避免的。当用户遇到错误时,他们往往感到困惑和失望,这可能会影响他们对你的应用程序的印象。因此,在开发和部署Laravel应用程序时,监控错误并及时解决它们是至关重要…

    2025年4月2日
    100
  • 深入了解Laravel中的success方法

    当我们在使用Laravel框架开发应用程序时,经常会遇到需要在操作成功后显示提示信息的情况。在这种情况下,我们可以使用Laravel中的success方法来快速且方便地实现。本文将深入探讨Laravel中success方法的使用,包括其功能…

    2025年4月2日
    200
  • 掌握Laravel中input方法的最佳实践

    Laravel框架是当今最受欢迎的PHP开发框架之一,它为开发者提供了丰富的功能和便捷的方法来构建Web应用程序。其中,input方法是Laravel中非常常用的方法之一,用于获取用户输入的数据。在本文中,我们将探讨如何最好地使用input…

    2025年4月2日
    100
  • 离线启动vscode的方法

    vscode不能离线启动的原因: 由Electron(Electron 是GitHub 发布的跨平台桌面应用开发工具)核心引起的。 解决方法: 目前能有效解决这个问题的方法是启用回环适配器,当电脑没有插网线的时候,可以用环回适配器虚拟一个网…

    2025年4月2日 编程技术
    200
  • Vue应用中的身份验证方法

    在vue应用中,用户身份验证是非常重要的一步,它能帮助我们保护应用程序和用户的安全。身份验证可以确保只有经过认证的用户才能访问需要权限的页面或者功能。 在这篇文章中,我们将介绍在Vue应用中实现身份验证的几种方法。这些方法可以保证您的应用的…

    编程技术 2025年4月1日
    100
  • Vue 中的 createApp 方法是什么?

    随着前端开发的快速发展,越来越多的框架被用来构建复杂的web应用程序。vue.js是流行的前端框架之一,它提供了许多功能和工具来简化开发人员构建高质量的web应用程序。createapp()方法是vue.js中的一个核心方法之一,它提供了一…

    编程技术 2025年4月1日
    100
  • photoshop简单形状图转换相素拼帖

      一个将形状转为相素拼帖的方法原始图效果图: 方法打开一图形,将其像素化一下,大小决定了以后生成图的单元格子的大小   选区不太虚的区域,将虚的区域删除然后选择一个基本单元格,将单元格的右一个将形状转为相素拼帖的方法   原始图   效果…

    2025年4月1日 编程技术
    200

发表回复

登录后才能评论