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

article/2025/9/26 2:59:20

一、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 = Truetrain_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*5stride=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*5stride=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、accuracyif (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://chatgpt.dhexx.cn/article/IlM6EELB.shtml

相关文章

CNN(卷积神经网络)详解

Why CNN 首先回答这样一个问题,为什么我们要学CNN,或者说CNN为什么在很多领域收获成功?还是先拿MNIST来当例子说。MNIST数据结构不清楚的话自行百度。。 我自己实验用两个hidden layer的DNN(全连接深度神经网络)在MNIST上也能取得不错的成绩…

CNN(Convolutional Neural Network)

CNN的基本结构 图中是一个图形识别的CNN模型。可以看出最左边的船的图像就是我们的输入层,计算机理解为输入若干个矩阵,这点和DNN基本相同。 接着是卷积层(Convolution Layer),这个是CNN特有的。卷积层的激活函数使用的是ReLU。我…

CNN(卷积神经网络)是什么?(转)

 作者:机器之心 链接:https://www.zhihu.com/question/52668301/answer/131573702 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 卷积神经网络,听起来…

CNN

卷积神经网络(Convolutional Neural Networks)是一种深度学习模型或类似于人工神经网络的多层感知器,常用来分析视觉图像。CNN在图像分类数据集上有非常突出的表现。 DNN与CNN 下图为DNN: 下图为CNN: 虽然两张图的结构…

CNN卷积神经网络(图解CNN)

文章目录 什么是卷积神经网络:1)网络结构2)局部感受野与权值共享3)卷积层、下采样层、全连接层卷积神经网络相比一般神经网络在图像理解中的优点:边缘检测卷积运算卷积层卷积后维度公式及运算示例 Padding填充Valid卷积…

CNN-卷积神经网络

一、基本的神经网络结构 神经网络其实就是按照一定规则连接起来的多个神经元,输入向量的维度和输入层(Input Layer)神经元个数相同,分类问题的类别个数决定输入层(Output Lazyer)的神经元个数。第N层的神经…

CNN是个啥?

阅读须知 本文主要意义是为了方便对CNN有个最直观的理解,知道这个玩意到底是干嘛的。文章本体是UP自己自学深度学习这块的时候做的笔记,内容均为网上收录。发在这里的原因是因为,也许有很多像UP一样不理解了就完全学不了的人存在&#xff0c…

(太长太全面了)CNN超详细介绍

原文链接:https://blog.csdn.net/jiaoyangwm/article/details/80011656 文章目录 1、卷积神经网络的概念2、 发展过程3、如何利用CNN实现图像识别的任务4、CNN的特征5、CNN的求解6、卷积神经网络注意事项7、CNN发展综合介绍8、LeNet-5结构分析9、AlexNet10、ZFNet10…

深度学习——卷积神经网络(CNN)简介

卷积神经网络简介 文章目录 卷积神经网络简介前言一.如何理解卷积1.1什么是卷积1.2 为什么要卷积 二.神经网络的结构三.卷积层四.池化层五.全连接层六.数据训练七.常见的卷积神经网络1. LeNet2 AlexNet3. VGG net4. ResNet 前言 卷积神经网络(Convolutional Neural…

CNN卷积神经网络 的学习记录一

1. 概述 卷积神经网络的特点:一方面它的神经元间的连接是非全连接的, 另一方面同一层中某些神经元之间的连接的权重是共享的(即相同的)。 上图左:图像有1000*1000个像素,有10^6个隐层神经元,进行…

CNN是什么意思?它与传统神经网络有什么不同?

CNN代表卷积神经网络(Convolutional Neural Network)。它是一种专门用于处理具有网格结构数据的神经网络模型,尤其在图像识别和计算机视觉任务中表现出色。CNN的设计灵感来自于生物视觉系统对视觉信息的处理方式。 与传统神经网络相比&#x…

Person

设计一个学校在册人员类(Person)。数据成员包括:身份证号(IdPerson),姓名(Name), 性别(Sex),生日(Birthday)和…

Using an in-memory repository. Keys will not be persisted to storage.问题

记录一个问题: 2020-04-13 15:26:18.3489|Microsoft.AspNetCore.DataProtection.Repositories.EphemeralXmlRepository|WARN|Using an in-memory repository. Keys will not be persisted to storage. 2020-04-13 15:26:18.3577|Microsoft.AspNetCore.DataProtectio…

Persistence

str.strip()#删除多余空格 通过指定第二个参数来决定BIF open()用哪种模式打开文件 默认r参数读取 可以用w参数写入 默认输入方式为标准输出,若要改为输出到文件,用file指定 用w模式打开时,若文件不存在,则创建一个新文件 注意…

persevere的用法_词汇精选:persist的用法和辨析 - 英语讨论网

一、详细释义: v. 坚持;固执 [I] 例句: We must persist in taking the road of self reliance. 我们必须坚持自力更生的道路。 例句: If you persist in disregarding my advice, I shall wash my hands of the whole business. …

tomcat启动时报:IOException while loading persisted sessions: java.io.EOFException的解决方案

错误代码如下:严重: IOException while loading persisted sessions: java.io.EOFException java.io.EOFExceptionat java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2325)at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectI…

@Deprecated

Deprecated是java内置注解,此注解可以用在方法,属性,类上,表示不推荐程序员使用,但是还可以使用

detached entity passed to persist:***

detached entity passed to persist 翻译:翻译传递到持久化的分离实体。 错误提示: detached entity passed to persist: com.lzh.blog.po.Tag; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: co…

Spring Boot进阶(26):Mybatis 中 resultType、resultMap详解及实战教学 | 超级详细,建议收藏

1. 前言🔥 今天,我要给大家讲一个我因前几天遇到的一个bug,由此为灵感而想跟大家分享这个东西,既专写一篇关于[ 如何正确使用resultType/resultMap ]的文章,具有很好的入门教学,希望能帮助更多小伙伴💯,不会因它们而犯低级错💥。 这将又会是干货满满的一期,全程无…

resultType(输出类型)

可输出的类型有四种:返回一般数据类型(单条)、JavaBean 类型(单条)、List类型(多条)、Map类型 ① 一般数据类型(单条) 比如要根据Id属性获得数据库中的某个字段值,示例: ② JavaBean 类型(单条) 比如根据某个字段获得数据库中的信息&#xff…