前言

本文介绍卷积神经网络的上半部分。

其实,学习还是需要老师的,因为我自己写文章的时候,就会想当然,比如下面的滑动窗口,我就会想当然的认为所有人都能理解,而实际上,我们在学习的过程中之所以卡顿的点多,就是因为学习资源中想当然的地方太多了。

概念

卷积神经网络,简称CNN, 即Convolutional Neural Network的缩写。

滤波器/卷积核(Filter/Kernels)

卷积核是一个小矩阵(通常是3x3、5x5等),它在输入图像上滑动(即移动),并与图像的局部区域进行矩阵乘法(点积)操作。结果是一个单值,这个值代表了该局部区域的某种特征。

点积就是内积,就是np.dot函数,内积是个值,就是两个矩阵对应项相乘,在相加

例如。a=[2,3] 和 b=[4,5],它们的点积是a⋅b=(2×4)+(3×5)=8+15=23

点积的意义是a⋅b=∥a∥∥b∥cosθ,意思是说,点积等于a向量的模乘以b向量的模乘以ab的夹角θ的cos的值

向量的模就是向量的长度,v=[3,4],因为勾股定理,c²=a²+b²,所以∥v∥=c=根号下a²+b²=根号下9+16=根号下25=5

例。rgb图,是3通道,卷积核会在3个通道上都进行卷积操作,最后形成一个特征图。

卷积核的尺寸

如果尺寸是 5×5,那么滑动窗口的大小也是 5×5。

特征图(Feature Map)

当一个卷积核(或滤波器)滑动在输入图像上时,它会在每一个位置计算卷积核与输入图像区域的点积,结果是一个标量。通过滑动整个图像,得到一组标量值,这些值构成了一个新的二维矩阵,这个矩阵就是特征图。

在CNN中,使用越多的卷积核,意味着提取的特征图越多,因此卷积核越大就可以得到的越丰富的特征。

更多的卷积核意味着更多的计算和内存消耗。因此,在选择卷积核数量时,也要考虑硬件资源的限制。

最大池化层(Max Pooling Layer)

是卷积神经网络(CNN)中常用的下采样(或降采样)技术。它用于减小特征图的尺寸,从而减少计算量,并有助于控制模型的复杂度(防止过拟合)。

最大池化操作使用一个固定大小的窗口(通常是2x2或3x3),在特征图上滑动。

在窗口覆盖的区域内,最大池化层会选择该区域的最大值作为输出。

步幅决定了池化窗口在特征图上滑动的步长。步幅为2意味着窗口每次移动2个像素。

每次池化操作生成的特征图尺寸会比输入特征图小。池化操作会减少特征图的宽度和高度,但保持深度(通道数)不变。

例,4x4 的输入特征图如下

1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

使用 2x2 的最大池化窗口和步幅为 2,池化过程如下:

池化窗口覆盖 1 2 5 6,最大值为 6

池化窗口覆盖 3 4 7 8,最大值为 8

池化窗口覆盖 9 10 13 14,最大值为 14

池化窗口覆盖 11 12 15 16,最大值为 16

得到的输出特征图为:

6 8
14 16

结合代码理解

结合下面的代码理解上面的概念。

import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np
# device config
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# hyper parameters
batch_size = 4
learning_rate = 0.001
num_epochs = 0 # dataset has PILImage images of range [0, 1].# We transform them to Tensors of normalized range [-1, 1]
# transforms.ToTensor():将PIL图像或numpy数组转换为PyTorch张量,并将值范围从[0,1]变为[0,255]。
# transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)):对图像进行归一化处理,将图像的像素值调整到[-1,1]范围。
transform = transforms.Compose(
[transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) train_dataset = torchvision.datasets.CIFAR10(
root='./data', train=True, download=True, transform=transform) test_dataset = torchvision.datasets.CIFAR10(
root='./data', train=False, download=True, transform=transform) train_loader = torch.utils. data.DataLoader(
dataset=train_dataset, batch_size=batch_size, shuffle=True) test_loader = torch.utils.data.DataLoader(
dataset=test_dataset, batch_size=batch_size, shuffle=False) print('每份100个,被分成多了份', len(train_loader)) def imshow(img):
img = img / 2 + 0.5 # unnormalize
npimg = img.numpy()
plt.imshow(np.transpose(npimg, (1, 2, 0)))
plt.show() # get some random training images
dataiter = iter(train_loader)
images, labels = dataiter.__next__()
# show images
imshow(torchvision.utils.make_grid(images)) # nn.Conv2d 是 PyTorch 用于定义二维卷积层的类
# 三个参数分别为 in_channels、out_channels 和 kernel_size
# in_channels (输入通道数):
# 值=3 这是输入图像的通道数。对于彩色图像,通常有3个通道(对应于RGB),因此这里的值为3。如果输入的是灰度图像,通常只有1个通道。
# 对于彩色图像(RGB),输入图像有3个通道。卷积核对每个通道独立进行操作,然后将这些结果相加,得到输出特征图。
# 输出特征图的数量由卷积核的数量决定。如果你有多个卷积核,它们会捕捉输入图像中的不同特征,每个卷积核生成一个特征图
# out_channels (输出通道数):
# 值=6 这是卷积层输出的通道数,也称为卷积核的数量。这个参数决定了卷积操作后生成多少个不同的特征图。在本例中,卷积层会生成6个特征图,也就是说会有6个不同的卷积核应用于输入图像。
# kernel_size (卷积核大小):
# 值=5 这是卷积核的尺寸,表示卷积核的宽度和高度。这里使用的是 5x5 的卷积核。这意味着每个卷积核会查看输入图像的 5x5 像素区域,并通过滑动窗口方式在整个图像上进行卷积操作。
# conv1:第一个卷积层,将输入的3通道图像(RGB)通过一个5x5的卷积核,生成6个输出通道。这里,卷积层使用 6 个卷积核,每个卷积核会生成一个特征图。因此,该卷积层的输出是 6 个特征图,特征图的深度(通道数)为 6。
conv1 = nn.Conv2d(3, 6, 5)
# pool:最大池化层,将特征图的尺寸缩小一半。
# 第一个参数 (2): 池化窗口的大小。这表示池化操作将应用于一个 2x2 的窗口上。池化窗口决定了在特征图上进行池化操作的区域大小。
# 第二个参数 (2): 池化的步幅(stride)。步幅决定了池化窗口在特征图上滑动的步长。步幅为 2 意味着池化窗口每次移动 2 个像素。
pool = nn.MaxPool2d(2, 2)
# conv2:第二个卷积层,将6个通道的输入特征图通过一个5x5的卷积核,生成16个输出通道。
conv2 = nn.Conv2d(6, 16, 5)
print(images.shape) x = conv1(images)
# print(x.shape)
x = pool(x)
# print(x.shape)
x = conv2(x)
# print(x.shape)
x = pool(x) # print(x.shape)

传送门:

零基础学习人工智能—Python—Pytorch学习—全集


注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!



若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

https://www.cnblogs.com/kiba/p/18375380

零基础学习人工智能—Python—Pytorch学习(八)的更多相关文章

  1. 如何零基础开始自学Python编程

    转载——原作者:赛门喵 链接:https://www.zhihu.com/question/29138020/answer/141170242 0. 明确目标 我是真正零基础开始学Python的,从一 ...

  2. 零基础快速掌握Python系统管理视频课程【猎豹网校】

    点击了解更多Python课程>>> 零基础快速掌握Python系统管理视频课程[猎豹网校] 课程目录 01.第01章 Python简介.mp4 02.第02章 IPython基础.m ...

  3. 零基础的人该怎么学习JAVA

    对于JAVA有所兴趣但又是零基础的人,该如何学习JAVA呢?对于想要学习开发技术的学子来说找到一个合适自己的培训机构是非常难的事情,在选择的过程中总是  因为这样或那样的问题让你犹豫不决,阻碍你前进的 ...

  4. 零基础学完Python的7大就业方向,哪个赚钱多?

    “ 我想学 Python,但是学完 Python 后都能干啥 ?” “ 现在学 Python,哪个方向最简单?哪个方向最吃香 ?” “ …… ” 相信不少 Python 的初学者,都会遇到上面的这些问 ...

  5. 零基础怎么学Python编程,新手常犯哪些错误?

    Python是人工智能时代最佳的编程语言,入门简单.功能强大,深获初学者的喜爱. 很多零基础学习Python开发的人都会忽视一些小细节,进而导致整个程序出现错误.下面就给大家介绍一下Python开发者 ...

  6. 零基础如何入门Python

    编程零基础如何学习Python 如果你是零基础,注意是零基础,想入门编程的话,我推荐你学Python.虽然国内基本上是以C语言作为入门教学,但在麻省理工等国外大学都是以Python作为编程入门教学的. ...

  7. 零基础如何学Python爬虫技术?

    在作者学习的众多编程技能中,爬虫技能无疑是最让作者着迷的.与自己闭关造轮子不同,爬虫的感觉是与别人博弈,一个在不停的构建 反爬虫 规则,一个在不停的破译规则. 如何入门爬虫?零基础如何学爬虫技术?那前 ...

  8. 零基础自学人工智能,看这些资料就够了(300G资料免费送)

    为什么有今天这篇? 首先,标题不要太相信,哈哈哈. 本公众号之前已经就人工智能学习的路径.学习方法.经典学习视频等做过完整说明.但是鉴于每个人的基础不同,可能需要额外的学习资料进行辅助.特此,向大家免 ...

  9. 零基础自学用Python 3开发网络爬虫

    原文出处: Jecvay Notes (@Jecvay) 由于本学期好多神都选了Cisco网络课, 而我这等弱渣没选, 去蹭了一节发现讲的内容虽然我不懂但是还是无爱. 我想既然都本科就出来工作还是按照 ...

  10. 零基础如何使用python处理字符串?

    摘要:Python的普遍使用场景是自动化测试.爬取网页数据.科学分析之类,这其中都涉及到了对数据的处理,而数据的表现形式很多,今天我们来讲讲字符串的操作.   字符串是作为任意一门编程语言的基础,在P ...

随机推荐

  1. Linux 错误码

    背景 Linux的错误码包含在/usr/include/asm-generic/errno-base.h和/usr/include/asm-generic/errno.h 这两个文件内. 可用于查询. ...

  2. 记一次Redis实施故障

    服务在测试环境运行没问题,部署到生产环境,连redis时报下面的错误: [2022-11-04 00:00:09][org.springframework.scheduling.support.Tas ...

  3. redis出现错误提示MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for......

    某天,redis出现了这样一个错误提示: MISCONF Redis is configured to save RDB snapshots, but is currently not able to ...

  4. SQL Server大量插入 Java

    在Java中向数据库执行大量插入操作,通常需要考虑性能和效率.对于大量数据的插入,有几种方法可以提高性能,比如使用批处理(Batch Insert).JDBC的批处理API.或者使用SQL Serve ...

  5. 「Pygors跨平台GUI」2:安装MinGW-w64、MSYS2还是WSL2

    「Pygors系列」一句话导读: MinGW-w64只有编译器,MSYS2带着更新环境,WSL2实用性比较高 历史与渊源   Windows平台 Linux平台 二进制兼容 WSL2:运行Linux程 ...

  6. 使用uWSGI+nginx部署Django项目(Ubuntu)

    对于uwsgi+nginx的部署方式,它的访问关系大概是: 1 the web client <-> the web server <-> the socket <-&g ...

  7. JavaScript小面试~href和src的区别

    href:中文名称叫超文本引用 src:中文叫资源 先要知道它们两个的区别,我们首先要看哪些元素在使用这些属性. href:a,link src:img,style,input,script,ifra ...

  8. Vue 根据鼠标悬停目标元素上方显示、隐藏指定元素交互实现

    Vue 根据鼠标悬停目标元素上方显示.隐藏指定元素交互实现 By:授客 QQ:1033553122 开发环境 win10 element-ui  "2.13.1" vue  &qu ...

  9. Aug. 2024 杭二训练游记

    \(\text{前言}\) 我在 \(\text{Aug. 6th}\) 到 \(\text{Aug. 25th}\) 在杭州某知名中学集训,但是我亲爱的母亲却在一开始告诉我是 \(\text{Aug ...

  10. golang 实现的零依赖、高性能、并发 mysqldump 工具。

    mysqldump golang 中实现的零依赖.高性能.并发 mysqldump 工具. 项目地址: https://github.com/dengjiawen8955/mysqldump/blob ...