本篇文章主要介绍了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%。

相关推荐:

php 卷积神经网络,PyTorch上实现卷积神经网络CNN的方法相关推荐

  1. [pytorch][stepbystep]在pytorch上实现卷积神经网路(CNN)的裁剪(purning)

    利用VGG-16对Dogs-vs-Cats数据集进行训练,裁剪VGG-16可以获得3x的运算加速和4x的模型减小 简介 puring神经网络是一个古老的idea,具体可以追溯到1990年(与Yann ...

  2. 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络 (二)

    在从图(Graph)到图卷积(Graph Convolution): 漫谈图神经网络 (一)中,我们简单介绍了基于循环图神经网络的两种重要模型,在本篇中,我们将着大量笔墨介绍图卷积神经网络中的卷积操作 ...

  3. Pytorch 实现全连接神经网络/卷积神经网络训练MNIST数据集,并将训练好的模型在制作自己的手写图片数据集上测试

    使用教程 代码下载地址:点我下载 模型在训练过程中会自动显示训练进度,如果您的pytorch是CPU版本的,代码会自动选择CPU训练,如果有cuda,则会选择GPU训练. 项目目录说明: CNN文件夹 ...

  4. PyTorch框架:(5)使用PyTorch框架构建卷积神经网络

    基于pytorch构建一个非常简单的卷积神经网络,以Mnist数据集为例演示基本的流程 1.导工具包 2.读取数据 (把该写的超参数全部写出来) PS:当前输入图像的大小,注意这里使用卷积网络处理Mn ...

  5. PyTorch之LeNet-5:利用PyTorch实现最经典的LeNet-5卷积神经网络对手写数字图片识别CNN

    PyTorch之LeNet-5:利用PyTorch实现最经典的LeNet-5卷积神经网络对手写数字图片识别CNN 目录 训练过程 代码设计 训练过程 代码设计 #PyTorch:利用PyTorch实现 ...

  6. atm取款机的简单程序代码_LeNet:一个简单的卷积神经网络PyTorch实现

    前两篇文章分别介绍了卷积层和池化层,卷积和池化是卷积神经网络必备的两大基础.本文我们将介绍一个早期用来识别手写数字图像的卷积神经网络:LeNet[1].LeNet名字来源于论文的第一作者Yann Le ...

  7. (pytorch-深度学习系列)使用Pytorch实现小型卷积神经网络网络

    卷积层 卷积神经网络中每层卷积层(Convolutional layer)由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法最佳化得到的.卷积运算的目的是提取输入的不同特征,第一层卷积层可能只 ...

  8. 【Pytorch】基于卷积神经网络实现的面部表情识别

    作者:何翔 学院:计算机学院 学号:04191315 班级:软件1903 转载请标注本文链接: https://blog.csdn.net/HXBest/article/details/1219812 ...

  9. PyTorch实现基于卷积神经网络的面部表情识别

    基于卷积神经网络的面部表情识别(Pytorch实现)----台大李宏毅机器学习作业3(HW3) 一.项目说明 给定数据集train.csv,要求使用卷积神经网络CNN,根据每个样本的面部图片判断出其表 ...

  10. pytorch实现:卷积神经网络识别FashionMNIST

    pytorch实现:卷积神经网络识别FashionMNIST 一.卷积神经网络 1.1 导入需要的包 1.2 图像数据准备 1.3 卷积神经网络搭建 1.4 卷积神经网络训练与预测 二.空洞卷积神经网 ...

最新文章

  1. git push origin与git push -u origin master的区别
  2. 吴恩达机器学习笔记7-数据绘制
  3. webclient post java_java – Spring WebFlux,如何调试我的WebClient POST交换?
  4. java 根据星期计算日期_Java 根据指定日期计算所在周的周一和周日
  5. C# 计算一点绕另一点旋转一定角度后新点的坐标
  6. CodeForces - 1521B Nastia and a Good Array
  7. ext2文件系统学习(一)
  8. jerasure 2.0译文
  9. Vue3.0后台管理框架
  10. ShowWindow的nCmdShow参数列表
  11. Python获取逐浪小说内容
  12. 《Python基础教程(第3版)》笔记:第8章异常
  13. 2020年手机性能榜大洗牌:小米10 Pro勇夺第一!
  14. (附源码)ssm校园交流网站 毕业设计 261624
  15. error LNK2019:和error LNK2001:
  16. php 多图片/文件上传
  17. 小白用ESP8266NodeMcu机智云SOC方案开发经验分享
  18. 软考-架构师-第五章-系统性能评价 第二节 性能计算(读书笔记)
  19. 腾讯云IoT边缘服务,助力6000亩沙漠变良田
  20. 正则_验证文本框输入的姓名是否规范(包含生僻字,不包含中文符号与其他字符)...

热门文章

  1. 异常排查_Python-日志模块.NoSectionError: No section: '*' 错误?
  2. Python基础教程(第2版•修订版)代码清单2-3 勘误
  3. 批量杀死MySQL连接
  4. 孩子们的游戏(圆圈中最后剩下的数)(Python)
  5. linux显卡测试radeon,15款热门显卡对比:Radeon RX 6800系列在Linux 1440p环境下表现出色...
  6. php获取字段中的第几个数字_php提取字符串中的数字
  7. mapper的更多细节,日志配置、核心文件的配置等
  8. 捕鱼达人python游戏项目,少儿编程体验课程项目,源码免费分享,内置详细注释,可更改游戏参数;关注获取更多资源
  9. BZOJ35453551[ONTAK2010]Peaks——kruskal重构树+主席树+dfs序+树上倍增
  10. 记一次KAFKA TroubleShooting