基于pytorch的CNN算法的实现
2.1.2卷积层:
卷积层的运算方式:
一种对图像的二次转化,使用filter,并提取feature(特征)。

图片1 计算机图片

图片2 像素型图片
计算机图像,所展示的图像为图片1所示但是机器所真正看到只是各个像素点位置的值,平常图像为RGB格式即为三通道,每个通道R(Red),G(Green),B(Blue),并且每个通道上的像素点都有对应的值0-255(可理解为权值),三通道混合后可展现彩色。由于本课题采用图像为灰度图如图片2:1X28X28(单通道28X28像素的灰度图)值为0-1。

图片3卷积核
计算机利用卷积运算:利用图片3:kernal size = 5X5进行运算每个从图片2中抽出5X5的像素进行运算,运算完后再向右一列,一行完后再进行下一行.

图片4 卷积运算


过程即对应相乘:
卷积每一步都会执行这样的以kernal size = 5,stride=1运算最后再一次得到1X23X23,相比以前28X28少了5行5列的信息。
那么其中会用到补0为了尽可能的保留图片信息,padding = 2在图片最外圈补2行2列0值,那么卷积运算在每一行就多运算了5次,则输出的图像又变为1X28X28的图像。
2.1.3激活层:
神经网络的数学基础是处处可微的,所以选取的激活函数要能保证数据输入与输出也是可微的,运算特征是不断进行循环计算,所以在每代循环过程中,每个神经元的值也是在不断变化的。 对于图像,我们主要采用了卷积的方式来处理,也就是对每个像素点赋予一个权值,这个操作显然就是线性的。
但是对于我们样本来说,不一定是线性可分的,为了解决这个问题,我们可以进行线性变化,或者我们引入非线性因素,解决线性模型所不能解决的问题。
所以在课题中使用ReLU激活函数,构建稀疏矩阵,也就是稀疏性,这个特性可以去除数据中的冗余,最大可能保留数据的特征,也就是大多数为0的稀疏矩阵来表示。其实这个特性主要是对于Relu,它就是取的max(0,x),因为神经网络是不断反复计算,实际上变成了它在尝试不断试探如何用一个大多数为0的矩阵来尝试表达数据特征,结果因为稀疏特性的存在,反而这种方法变得运算得又快效果又好了。目前大部分的卷积神经网络中,基本上都是采用了ReLU 函数。
2.1.4池化层:
其实也是采样层,提取关键特征,并用来降低特征的维度且保留有效信息,一定程度上避免过拟合,还可以减少参数过多导致运算量过大等问题。
池化操作一般有两种,一种是Avy Pooling,一种是max Pooling。
即从中取出2X2的方格后进行平均化再给予下一层,那么图像就会进行压缩为原来的1/4。
即从中取出2X2的方格后取其中最大值再给予下一层,那么图像就会进行压缩为原来的1/4。
2.1.5优化器:
最基础是反向传递:

前向传递的过程比较容易理解,进行,即可得出最终结果。
反向传递其实是链式法则:X,Y,Z为输入量中间层为P结果层为F
则:(反向传递的基础过程)





利用上述方法最后加入(最小二乘法)可以概括为反向传递基本方法。
利用损失函数(Target与prediction之间的差值)
利用这些加上Learning Rate(α值)和Loss值的不断减小 可以慢慢拟合曲线等等。
采用的方法Adam算法:
Adam算法就是Momentum+RMSProp的结合,添加了惯性量。也就是在反向传递的过程中添加了部分动量使得寻找下降速度中可以找到最快的路径。
神经网路的架构
数据集:MNIST手写数字数据
第一层的CNN神经网络:
nn.Conv2d(
in_channels = 1,
out_channels = 16
kernel_size = 5,
stride =1,
padding =2,
),
nn.ReLU(),
nn.MaxPool2d(2),
线性分类器:
self.out = nn.Linear(3277,10)
优化器(Adam):
optimizer = torch.optim.Adam(cnn.parameters(), lr=LR)
loss = nn.CrossEntropyLoss()
back = loss(output,b_y)
测试数据:
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’)


import torch
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets,transforms
import torch.nn as nn
from torch.autograd import Variable
import torch.utils.data as Data
import torchvision
import matplotlib.pyplot as plt
import os#Hyper parameters
EPOCH = 1 #traning data n times to save
BATCH_SIZE = 50
LR = 0.001
DOWNLOAD_MNIST = Falsetrain_data = torchvision.datasets.MNIST(root='./mnist/',train=True,                                     # this is training datatransform=torchvision.transforms.ToTensor(),    # Converts a PIL.Image or numpy.ndarray to                                            # torch.FloatTensor of shape (C x H x W) and normalize in the range [0.0, 1.0]download=DOWNLOAD_MNIST,
)train_loader = Data.DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True)test_data = torchvision.datasets.MNIST(root='./mnist/', train=False)test_x = torch.unsqueeze(test_data.test_data, dim=1).type(torch.FloatTensor)[:2000]/255.   # shape from (2000, 28, 28) to (2000, 1, 28, 28), value 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,28nn.Conv2d(in_channels = 1,out_channels = 16,#16,28,28kernel_size = 5,stride =1,padding =2,#16,14,14#if stride =1 ,padding = (kernel_size-1)/2=()),nn.ReLU(),nn.MaxPool2d(2),)self.conv2 = nn.Sequential(         # input shape (16, 14, 14)nn.Conv2d(16, 32, 5, 1, 2),     # output shape (32, 14, 14)nn.ReLU(),                      # activationnn.MaxPool2d(2),                # output shape (32, 7, 7))self.out = nn.Linear(32*7*7,10)   # fully connected layer, output 10 classes if use two layer CNN#self.out = nn.Linear(16*14*14,10)   # fully connected layer, output 10 classes if use one layer CNNdef forward(self,x):x = self.conv1(x)# x = self.conv2(x)x = x.view(x.size(0),-1)output = self.out(x)return output,xcnn = CNN()
# print(cnn)
optimizer = torch.optim.Adam(cnn.parameters(), lr=LR)   # optimize all cnn parameters
loss = nn.CrossEntropyLoss()                      # the target label is not one-hotted
# training and testing
for epoch in range(EPOCH):for step, (b_x, b_y) in enumerate(train_loader):   # gives batch data, normalize x when iterate train_loaderoutput = cnn(b_x)[0]               # cnn outputback = loss(output, b_y)  # cross entropy lossoptimizer.zero_grad()           # clear gradients for this training stepback.backward()                 # backpropagation, compute gradientsoptimizer.step()                # apply gradientsif step % 50 == 0:test_output, last_layer = cnn(test_x)pred_y = torch.max(test_output, 1)[1].data.squeeze().numpy()accuracy = float((pred_y == test_y.data.numpy()).astype(int).sum()) / float(test_y.size(0))print('Epoch: ', epoch, '| train loss: %.4f' % back.data.numpy(), '| test accuracy: %.2f' % 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')#show the train data no.1 image
# print(train_data.train_data.size())  #60000,28,28
# print(train_data.train_labels.size())
# plt.imshow(train_data.train_data[0].numpy(), cmap = 'gray')
# plt.title('%i' %train_data.train_labels[0])
# plt.show()

基于pytorch的CNN算法的实现相关推荐

  1. 基于PyTorch搭建CNN实现视频动作分类任务代码详解

    数据及具体讲解来源: 基于PyTorch搭建CNN实现视频动作分类任务 import torch import torch.nn as nn import torchvision.transforms ...

  2. Kaggle猫狗大战——基于Pytorch的CNN网络分类:数据获取、预处理、载入(1)

    Kaggle猫狗大战--基于Pytorch的CNN网络分类:数据获取.预处理.载入(1) 第一次写CSDN博客,之前一直是靠着CSDN学学代码,这次不得不亲自上场了,就想着将学习的过程都记录下来.新人 ...

  3. dds是c语言吗,基于单片机的DDS算法的实现

    [摘要]通常DDS信号发生器设计主要分为两类,一类是采用FPGA设计,另一类采用单片机+DDS专用芯片实现.本文针对频率及要求较低的应用,提出一种更为简单的解决方案,即通过单片机编程完成DDS算法,从 ...

  4. 基于pytorch开发CNN提取全连接层作为特征

    场景:利用CNN网络的全连接层作为图像的特征. 代码: import sys import os import math import random import heapq import time ...

  5. 【DSP数字信号处理学习笔记】—— 详细推导DFT的快速实现算法:FFT 基于库利-图基算法的实现

    引言:尽管离散傅里叶变换(DFT)让频谱分析技术在计算机上的实现成为可能,但是受限于DFT算法庞大的计算量 O(N2)O(N^2)O(N2),使得DFT在一开始并没有被广泛使用,直到快速傅里叶变换算法 ...

  6. 基于内容的推荐算法的实现代码实例

    本次实例需要三个数据文件 分别为节目及其所属标签类型的01矩阵:用户--节目评分矩阵:用户收视了的节目--标签01矩阵. 可以直接下载下来使用https://download.csdn.net/dow ...

  7. python分词词典_基于python的分词算法的实现(3) – 建立字典 | 学步园

    单词词典里面基本只要保存词的词性的频率,另外考虑到一次性把词典读入内存的消耗太大,必须把词典分块,当有需求的时候才将特定 的块装载进内存中.在这样的需求下,设计采用如下结构的词典: +-------- ...

  8. 基于PyTorch搭建CNN实现视频动作分类任务 有数据有代码 可直接运行

    目录 介绍 任务描述 数据集 运行环境 模型概述

  9. 基于SM3的HMAC算法的实现

    文章目录 一.SM3算法描述 二.HMAC算法描述 算法的C++实现 总结 一.SM3算法描述 算法的输入长度为L比特,1<=L<=2^64-1,输出哈希值长度为256比特.(具体参考现代 ...

  10. 基于pytorch使用实现CNN 如何使用pytorch构建CNN卷积神经网络

    基于pytorch使用实现CNN 如何使用pytorch构建CNN卷积神经网络 所用工具 文件结构: 数据: 代码: 结果: 改进思路 拓展 本文是一个基于pytorch使用CNN在生物信息学上进行位 ...

最新文章

  1. OpenCV数据结构与基本绘图(Mat 类、Point类、Scalar类等)
  2. Java 8系列(一): 日期/时间- JSR310( Date and Time API)
  3. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 能支撑10万以上客户端的数据同步下载问题...
  4. Objective-C中的hasPrefix
  5. 【数据分析R语言系列】R和RStudio的下载和安装, R在 Ubuntu 和CentOS 系统下的安装
  6. 如何成为一个出色的敏捷开发者?
  7. ozf oracle,ORACLE EBS 简称大全
  8. java.util.stream_java.util.stream.Stream 接口中的常用方法
  9. qt的项目中单个文件加载样式表
  10. java中遍历实体类,获取属性名和属性值
  11. MOS9.0 bootstrap 离线Bulid
  12. Android 增量更新实例(Smart App Updates)
  13. [转载] python猜字谜游戏_Python Hangman猜字游戏
  14. uni-app项目(一)
  15. 软考中级哪一门比较好过?我建议你考这个。
  16. 2017年深度学习语义分割导读
  17. linux-raid (二) faulty 和 multipath
  18. 关于联通IPTV盒子和光猫之间接无线路由器
  19. 最佳实践(2):iOS开发篇
  20. 茂名天源石化宣传“世界急救日”活动 普及急救知识

热门文章

  1. python背景怎么自定义铃声_【Python成长之路】如何用2行代码将抖音视频设置成我的手机铃声...
  2. 关于chrome上的网银安全控件开发技术(chrome 调用本地dll)
  3. 用麦咖啡(mcafee)打造自己的安全服务器
  4. Bootstrap 按钮(实例 )
  5. php adodb类库下载,PHP中 ADOdb 类库介绍(二)
  6. VS无法启动程序调试监视器未能启动
  7. java 下载excel到本地_java已知下载链接将Excel文件利用httpclient下载到本地
  8. linux acrobat,开源Linux Acrobat Javascript编辑器
  9. multisim中pwl_(Multisim电子电路仿真教程)第3章Multisim仿真元件库与虚拟仪器.ppt
  10. 微信抢红包插件xposed框架