Python CNN卷积神经网络实例讲解,CNN实战,CNN代码实例,超实用

news2024/10/7 20:29:47

一、CNN简介

1. 神经网络基础

输入层(Input layer),众多神经元(Neuron)接受大量非线形输入讯息。输入的讯息称为输入向量。
输出层(Output layer),讯息在神经元链接中传输、分析、权衡,形成输出结果。输出的讯息称为输出向量。
隐藏层(Hidden layer),简称“隐层”,是输入层和输出层之间众多神经元和链接组成的各个层面。如果有多个隐藏层,则意味着多个激活函数。

2. 卷积一下哦

卷积神经网络(Convolutional Neural Network,CNN)针对全连接网络的局限做出了修正,加入了卷积层(Convolution层)和池化层(Pooling层)。通常情况下,卷积神经网络由若干个卷积层(Convolutional Layer)、激活层(Activation Layer)、池化层(Pooling Layer)及全连接层(Fully Connected Layer)组成。

下面看怎么卷积的

1.如图,可以看到:

(1)两个神经元,即depth=2,意味着有两个滤波器。
(2)数据窗口每次移动两个步长取3*3的局部数据,即stride=2。
(3)边缘填充,zero-padding=1,主要为了防止遗漏边缘的像素信息。
    然后分别以两个滤波器filter为轴滑动数组进行卷积计算,得到两组不同的结果。

2.如果初看上图,可能不一定能立马理解啥意思,但结合上文的内容后,理解这个动图已经不是很困难的事情:

(1)左边是输入(7*7*3中,7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道)
(2)中间部分是两个不同的滤波器Filter w0、Filter w1
(3)最右边则是两个不同的输出
(4)随着左边数据窗口的平移滑动,滤波器Filter w0 / Filter w1对不同的局部数据进行卷积计算。

局部感知:左边数据在变化,每次滤波器都是针对某一局部的数据窗口进行卷积,这就是所谓的CNN中的局部感知机制。打个比方,滤波器就像一双眼睛,人类视角有限,一眼望去,只能看到这世界的局部。如果一眼就看到全世界,你会累死,而且一下子接受全世界所有信息,你大脑接收不过来。当然,即便是看局部,针对局部里的信息人类双眼也是有偏重、偏好的。比如看美女,对脸、胸、腿是重点关注,所以这3个输入的权重相对较大。
参数共享:数据窗口滑动,导致输入在变化,但中间滤波器Filter w0的权重(即每个神经元连接数据窗口的权重)是固定不变的,这个权重不变即所谓的CNN中的参数(权重)共享机制。

3卷积计算:

图中最左边的三个输入矩阵就是我们的相当于输入d=3时有三个通道图,每个通道图都有一个属于自己通道的卷积核,我们可以看到输出(output)的只有两个特征图意味着我们设置的输出的d=2,有几个输出通道就有几层卷积核(比如图中就有FilterW0和FilterW1),这意味着我们的卷积核数量就是输入d的个数乘以输出d的个数(图中就是2*3=6个),其中每一层通道图的计算与上文中提到的一层计算相同,再把每一个通道输出的输出再加起来就是绿色的输出数字啦!
举例:

绿色输出的第一个特征图的第一个值:

1通道x[ : :0] 1*1+1*0 = 1 (0像素点省略)

2通道x[ : :1] 1*0+1*(-1)+2*0 = -1

3通道x[ : :2] 2*0 = 0 

b = 1

输出:1+(-1)+ 0 + 1(这个是b)= 1 

绿色输出的第二个特征图的第一个值:

1通道x[ : :0] 1*0+1*0 = 0 (0像素点省略)

2通道x[ : :1] 1*0+1*(-1)+2*0 = -1

3通道x[ : :2] 2*0 = 0 

b = 0

输出:0+(-1)+ 0 + 1(这个是b)= 0

二、CNN实例代码:

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

模型训练超参数设置,构建训练数据:如果你没有源数据,那么DOWNLOAD_MNIST=True

#Hyper prameters
EPOCH = 2
BATCH_SIZE = 50
LR = 0.001
DOWNLOAD_MNIST = True

train_data = torchvision.datasets.MNIST(
    root ='./mnist',
    train = True,
    download = DOWNLOAD_MNIST
)

数据下载后是不可以直接看的,查看第一张图片数据:

print(train_data.data.size())
print(train_data.targets.size())
print(train_data.data[0])

结果:60000张图片数据,维度都是28*28,单通道

画一个图片显示出来

# 画一个图片显示出来
plt.imshow(train_data.data[0].numpy(),cmap='gray')
plt.title('%i'%train_data.targets[0])
plt.show()

结果:

训练和测试数据准备,数据导入:

#训练和测试数据准备
train_loader=Data.DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True)


test_data=torchvision.datasets.MNIST(
    root='./mnist',
    train=False,
)

#这里只取前3千个数据吧,差不多已经够用了,然后将其归一化。
with torch.no_grad():
    test_x=Variable(torch.unsqueeze(test_data.data, dim=1)).type(torch.FloatTensor)[:3000]/255   
    test_y=test_data.targets[:3000]

注意:这里的归一化在此模型中区别不大

构建CNN模型:

'''开始建立CNN网络'''
class CNN(nn.Module):
    def __init__(self):
        super(CNN,self).__init__()
        '''
        一般来说,卷积网络包括以下内容:
        1.卷积层
        2.神经网络
        3.池化层
        '''
        self.conv1=nn.Sequential(
            nn.Conv2d(              #--> (1,28,28)
                in_channels=1,      #传入的图片是几层的,灰色为1层,RGB为三层
                out_channels=16,    #输出的图片是几层
                kernel_size=5,      #代表扫描的区域点为5*5
                stride=1,           #就是每隔多少步跳一下
                padding=2,          #边框补全,其计算公式=(kernel_size-1)/2=(5-1)/2=2
            ),    # 2d代表二维卷积           --> (16,28,28)
            nn.ReLU(),              #非线性激活层
            nn.MaxPool2d(kernel_size=2),    #设定这里的扫描区域为2*2,且取出该2*2中的最大值          --> (16,14,14)
        )

        self.conv2=nn.Sequential(
            nn.Conv2d(              #       --> (16,14,14)
                in_channels=16,     #这里的输入是上层的输出为16层
                out_channels=32,    #在这里我们需要将其输出为32层
                kernel_size=5,      #代表扫描的区域点为5*5
                stride=1,           #就是每隔多少步跳一下
                padding=2,          #边框补全,其计算公式=(kernel_size-1)/2=(5-1)/2=
            ),                      #   --> (32,14,14)
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2),    #设定这里的扫描区域为2*2,且取出该2*2中的最大值     --> (32,7,7),这里是三维数据
        )

        self.out=nn.Linear(32*7*7,10)       #注意一下这里的数据是二维的数据

    def forward(self,x):
        x=self.conv1(x)
        x=self.conv2(x)     #(batch,32,7,7)
        #然后接下来进行一下扩展展平的操作,将三维数据转为二维的数据
        x=x.view(x.size(0),-1)    #(batch ,32 * 7 * 7)
        output=self.out(x)
        return output

把模型实例化打印一下:

cnn=CNN()
print(cnn)

结果:

 开始训练:

# 添加优化方法
optimizer=torch.optim.Adam(cnn.parameters(),lr=LR)
# 指定损失函数使用交叉信息熵
loss_fn=nn.CrossEntropyLoss()


'''
开始训练我们的模型哦
'''
step=0
for epoch in range(EPOCH):
    #加载训练数据
    for step,data in enumerate(train_loader):
        x,y=data
        #分别得到训练数据的x和y的取值
        b_x=Variable(x)
        b_y=Variable(y)

        output=cnn(b_x)         #调用模型预测
        loss=loss_fn(output,b_y)#计算损失值
        optimizer.zero_grad()   #每一次循环之前,将梯度清零
        loss.backward()         #反向传播
        optimizer.step()        #梯度下降

        #每执行50次,输出一下当前epoch、loss、accuracy
        if (step%50==0):
            #计算一下模型预测正确率
            test_output=cnn(test_x)
            y_pred=torch.max(test_output,1)[1].data.squeeze()
            accuracy=sum(y_pred==test_y).item()/test_y.size(0)

            print('now epoch :  ', epoch, '   |  loss : %.4f ' % loss.item(), '     |   accuracy :   ' , accuracy)

'''
打印十个测试集的结果
'''
test_output=cnn(test_x[:10])
y_pred=torch.max(test_output,1)[1].data.squeeze()       #选取最大可能的数值所在的位置
print(y_pred.tolist(),'predecton Result')
print(test_y[:10].tolist(),'Real Result')

结果:

 卷积层维度变化:

(1)输入1*28*28,即1通道,28*28维;

(2)卷积层-01:16*28*28,即16个卷积核,卷积核维度5*5,步长1,边缘填充2,维度计算公式B = (A + 2*P - K) / S + 1,即(28+2*2-5)/1 +1 = 28

(3)池化层:池化层为2*2,所以输出为16*14*14

(4)卷积层-02:32*14*14,即32卷积核,其它同卷积层-01

(5)池化层:池化层为2*2,所以输出为32*7*7;

(6)fc层:由于输出为1*10,即10个类别的概率,那么首先对最后的池化层进行压缩为二维(1,32*7*7),然后全连接层维度(32*7*7,10),最后(1,32*7*7)*(32*7*7,10)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/45524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.Linux传统性能检测工具——vmstat

命令&#xff1a;vmstat <duration> 参数duration&#xff1a;统计间隔如果不加参数则输出自启动以来的统计结果&#xff08;注意&#xff1a;输出的第一行总是为该结果&#xff08;除memory counter相关数据以外&#xff09;&#xff09; 输出示例&#xff1a; 虽然vmst…

nVisual部署之nginx配置说明

Nginx 是一个高性能的HTTP和反向代理web服务器&#xff0c;因此nvisual在部署前端包时便采用了它作为服务器&#xff0c;版本使用1.14.1以上。在默认的配置下&#xff0c;还需要向nginx各模块添加配置才能达到生产需要。 接下来&#xff0c;从http模块开始&#xff0c;再到ser…

英文Paper写作需要了解哪些信息?

写Paper最重要的一点就是要仔细理解&#xff0c;Paper的题目告诉了哪些信息。 The most important thing about writing paper is to carefully understand what information the paper title tells you. 你应当精度每一个单词&#xff0c;从中找到尽可能多的指导。然后需要考虑…

历届图灵奖得主盘点

图灵奖&#xff0c;全称A.M.图灵奖&#xff08;ACM A.M Turing Award&#xff09;&#xff0c;是由美国计算机协会于1966年设立的计算机奖项&#xff0c;名称取自艾伦麦席森图灵&#xff0c;旨在奖励对计算机事业作出重要贡献的个人 。图灵奖对获奖条件要求极高&#xff0c;评奖…

STC 51单片机43——看门狗

看门狗测试&#xff0c;通过修改delay函数的延时长度&#xff0c;可以看到看门狗是否复位系统。 #include <reg52.h> sfr WDT_CONTR 0xE1; //声明WDT_CONTR void delay(void){ unsigned char i,j,k; for(i0;i<255;i) for(j0;j<2…

测试大老都是怎么理解cookiesession的?

为什么要学习cookie和session呢&#xff1f;若是没有掌握cookie和session的会话机制&#xff0c;就不了解客户端与服务器之间的交互通信原理&#xff0c;也就定位不了产生bug的原因。 cookie与session他们是如何理解的呢&#xff1f; 1、cookie与session区别&#xff1f; co…

笔试强训48天——day21

文章目录一. 单选1. 设一个有序的单链表中有n个结点&#xff0c;现要求插入一个新结点后使得单链表仍然保持有序&#xff0c;则该操作的时间复杂度&#xff08;&#xff09;2. 在一个单链表中&#xff0c;若删除 P 所指结点的后续结点&#xff0c;则执行?3. 设一个链表最常用的…

Thread的使用、线程的几个重要操作和状态【JavaEE初阶】

一、Thread类的常见构造方法 Thread()&#xff1a; 默认无参构造方法&#xff0c;如 &#xff1a;Thread t1 new Thread()&#xff1b; Thread(Runnable target)&#xff1a; 使用 Runnable 创建一个任务&#xff0c;再把 任务 放到线程里面&#xff0c; 如 Thread t2 new Th…

Kamiya丨Kamiya艾美捷小鼠血红蛋白ELISA说明书

Kamiya艾美捷小鼠血红蛋白ELISA预期用途&#xff1a; 小鼠血红蛋白ELISA是一种高灵敏度的双位点酶联免疫分析&#xff08;ELISA&#xff09;小鼠生物样品中血红蛋白的测定。仅供研究使用。 引言 血红蛋白&#xff08;HM&#xff09;是红细胞中的含铁氧转运蛋白。它吸收肺部的…

[附源码]计算机毕业设计springboot行程规划app

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Vue.js 加入高德地图的实现方法

一、功能需求 1.根据输入内容进行模糊查询&#xff0c;选择地址后在地图上插上标记&#xff0c;并更新经纬度坐标显示 2.在地图点击后&#xff0c;根据回传的左边更新地址信息和坐标显示 二、准备 1.申请高德地图账号&#xff0c;创建应用 2.在应用管理中 获得key 和安全密…

如何获取Power VR GPU数据

什么是Power VR PowerVR 是Imagination公司生产的一种GPU系列。早期的苹果A系列芯片优秀的GPU性能大多是基于Power VR GPU实现的。从早期的游戏机实体建模到现在的移动终端设备图形计算中都能够见到它的身影&#xff0c;虽中间有多次动荡&#xff0c;至今依旧在汽车HMI系统中占…

面板模型进行熵值法分析

背景说明 熵值法&#xff08;熵权法&#xff09;是一种研究指标权重的研究方法&#xff0c;比如有5个指标&#xff0c;分别为指标1到指标5&#xff0c;并且有很多样本&#xff08;比如100个样本&#xff09;&#xff0c;即100行*5列数据&#xff0c;此时研究该5个指标的权重分…

可编程直流电源的特点都有哪些呢?

可编程直流电源是用数字或编码器输入&#xff0c;非电位器调节电压、电流的直流电源。无论是在研发&#xff0c;还是生产测试中&#xff0c;可编程直流电源的宽范围电压输出都适于测试和分析组件、电路、模块和完整器件的特性。那么可编程直流电源的特点都有哪些呢?下面安泰测…

【Java系列】一篇文章阐述常见问题及解决方法

返回主篇章         &#x1f447; 【Java】才疏学浅小石Java问道之路 Java常见问题及解决方法问题1问题2问题3问题4问题1 问题提出&#xff1a; 解决问题&#xff1a; 源文件名不存在或者写错当前路径错误后缀名隐藏问题 问题2 问题提出&#xff1a; 解决问题&a…

加码中文 AIGC,IDEA 推出“盖亚计划”

作者 | 伍杏玲 出品 | CSDN 近年来&#xff0c;AIGC 话题火爆 AI 技术人的朋友圈。由于深度学习模型不断完善、开源模式推动&#xff0c;AIGC 的迭代速度呈爆发式发展。据 Gartner 发布的 2022 年需要探索的重要战略技术趋势显示&#xff0c;生成式 AI 是其中引人注目的人工智…

uniapp开发小程序-工作笔记

开发背景 公司开始安排本人开发微信小程序&#xff0c;于是乎研究了一点关于uniapp的api和注意的点。仅仅是个人笔记…可能有错误&#xff0c;希望各位指出。 uniapp开发小程序 应用生命周期 onLaunch 初始化完成时 只触发一次 onShow 后台进入前台 显示页面的时候 onHide 前台…

全志V853 NPU 转换部署 YOLO V5 模型

NPU 转换部署 YOLO V5 模型 本文以 YOLO v5s 模型为例&#xff0c;详述 ONNX 模型在 V853 平台的转换与部署的流程。 模型的准备 YOLO v5 目前开源于 Github&#xff0c;链接【GitHub - ultralytics/yolov5: YOLOv5 &#x1f680; in PyTorch > ONNX > CoreML > TF…

【Android App】实战项目之虚拟现实(VR)的全景相册(附源码和演示视频 可用于学习和大作业)

需要源码请点赞关注收藏后评论区留言私信~~~ 不管是绘画还是摄影&#xff0c;都是把三维的物体投影到平面上&#xff0c;其实仍旧呈现二维的模拟画面。 随着科技的发展&#xff0c;传统的成像手段越来越凸显出局限性&#xff0c;缘由在于人们需要一种更逼真更接近现实的技术&am…

基于有偏距离权值(Weighted cubic O-MOMS with warping)三次O-MOMS插值理论的图像超分辨重构研究-附Matlab程序

⭕⭕ 目 录 ⭕⭕✳️ 一、图像超分辨率重构原理✳️ 二、三次O-MOMS插值重构理论与实验分析✳️ 2.1 三次O-MOMS(Cubic O-MOMS)插值理论与实验验证✳️ 2.2 有偏距离三次O-MOMS插值重构理论与实验验证✳️ 2.3 权重三次O-MOMS插值理论与实验验证✳️ 2.4 有偏距离权值三次O-MOM…