【深度学习04】 快速构建一个神经网络

简介: 在数据集(dataloader)中读取每一份data,每一个data都包含imgs(图片,tensor格式),targets(标签)

⭐本文内容:卷积,池化,非线性激活,线性组合,以及快速搭建一个简单的神经网络


基本骨架


import torch
import torch.nn as nn
class RecoModel(nn.Module):
  def __init__(self):
    super(RecoModel,self).__init__()  #将子模块指定为默认属性
  def forward(self,input):  #定义一个向前传播的函数
    output = input+1
    return output


1️⃣forward()定义了每次执行的 计算步骤。 在所有的Module中都需要重写这个函数


2️⃣RecoModel()(input)的 input 必须是tensor格式


Model = RecoModel()
x = torch.tensor(1.0)
output = Model(x)  #相当于RecoModel()()
print(output)


卷积层


torch.nn.Conv2d()函数


  • 示例:self.conv1 = Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)
  • 作用:对图像进行2D卷积
  • 参数:

。🌈in_channels:输入的颜色通道数,彩色为3

。🚀out_channels:卷积产生的输出通道数

。kernel_size:卷积核的大小

。stride:卷积核移动的步长

。paddingz:是否填充,边缘处小于卷积核则用0填充


卷积的概念conv_arithmetic/README.md at master · vdumoulin/conv_arithmetic (github.com)

out_channels=2时,2个卷积核在图像上滑动,最后得到2个通道


定义模型


class Model(nn.Module):
  def __init__(self):
    super(Model,self).__init__()
    self.conv1 = Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)
  def forward(self,x):
    x = self.conv1(x)
    return x


定义一层卷积层(2D卷积),输出通道数为6


加载数据集


dataset = torchvision.datasets.CIFAR10("/content/gdrive/MyDrive/Learn-       pytorch/dataset",train=False,transform=torchvision.transforms.ToTensor())
dataloader = DataLoader(dataset,batch_size=64)


torchvision.datasets.CIFAR10()函数


  • 示例:dataset = torchvision.datasets.CIFAR10("/content/gdrive/MyDrive/Learn- pytorch/dataset",train=False,transform=torchvision.transforms.ToTensor())


  • 作用:下载数据集


  • 参数:


。CIFAR10:官方数据集的名字

。train=False:是否下载训练集。否,则下载测试集

。🍔transform=torchvision.transforms.ToTensor():转换为Tensor数据类型


图片卷积


for data in dataloader:
  imgs,targets = data
  out = Model()(imgs)
  print(imgs.shape)
  print(out.shape)
  writer.add_images("input",imgs,step)
  out = torch.reshape(out,(-1,3,30,30))
  writer.add_images("output",out,step)
  step=step+1


【First cycle output】 :torch.Size([64, 3, 32, 32]) torch.Size([64, 6, 30, 30])


🔥在数据集(dataloader)中读取每一份data,每一个data都包含imgs(图片,tensor格式),targets(标签)


⚡卷积前后的图像对比:


585aef39cb83d88810a91051dee6c2d5.png


227a65f9ebb9e848d22d01085e46f5e5.png


池化层


池化核每移动一个步长,然后取池化核所覆盖的图片,其范围内的最大值


在卷积层步长默认为1,在池化层步长为step=kernel_size=3


from torch.nn import MaxPool2d 
class Pool_test(nn.Module):
  def __init__(self):
    super(Pool_test,self).__init__()
    self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=False)
  def forward(self,input):
    output = self.maxpool1(input)
    return output
test=Pool_test()


MaxPool2d()函数


  • 示例:self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=False)
  • 作用:池化,相当于给图片打马赛克
  • 参数:

。kernel_size:池化核窗口大小

。ceil_mode:如果等于True,计算输出信号大小的时候,会使用向上取整,代替默认的向下取整的操作


池化核的移动

 

202205161024721.png

202205161024407.png


202205161024176.png


池化的作用


模糊、马赛克


17c77bb3bbb6ffe467949ed1cbc36a7a.png


57a9a7c0d9910d5683418efd17638dfa.png


非线性激活


使得神经网络可以任意逼近任何非线性函数


如果没有非线性层,无论神经网络有多少层,输出都是输入的线性组合


使用一个sigmoid1()函数的效果对比:


10b07d8075d3e11bc26c64f6b70599a0.png

642c0c140b3cefc48158c8ab4484ee7a.png


搭建一个神经网络


afb3393d9a1947c43b29a17c97377d63.png


self.model1 = Sequential(
            Conv2d(3,32,5,1,2),
            MaxPool2d(2),
            Conv2d(32,32,5,1,2),
            MaxPool2d(2),
            Conv2d(32,64,5,1,2),
            MaxPool2d(2),
            Flatten(),
            Linear(1024,64),
            Linear(64,10),
            )


  • 卷积1


31caa703fa3d60e1ae6ed6a42ef7a87c.png


🍺输入一个3@32x32的图像,经过5 x 5的卷积核,输出一个32通道,32x32大小的图像:Conv2d(3,32,5,1,2)


3-通道数;32-图像尺寸;5-卷积核大小


pading计算?


202205161046638.png


Hin=32,padding[0]=?,dilation[0]默认为1,kernel_size[0]=5,stride[0]设置为1(我们设每一次卷积核移动1个像素点),Hout=32


则:padding[0]=2;stride=1


  • 池化1


ece768b1bd82a6b72611c39904a37023.png


MaxPool2d(2),池化核大小为2


  • 卷积2


0765c3860a5ac761dd1821ce803387de.png


输入一个32@32*32的图像,经过5 x 5的卷积核,输出一个32通道,32x32大小的图像:Conv2d(32,32,5,1,2)


  • 池化2


  • 卷积3


7ab5618c7d2c395952ceceeb4dd4073f.png


输入一个32@8x8的图像,经过5 x 5的卷积核,输出64@8x8的图像


  • 池化3


  • 展平层


31c06779bcbc1c34c9b6b8b17afe697a.png


将64@4x4的tensor类型的图像,转成64x4x4=1024的一维向量数组


  • 线性层1


对输入数据做线性变换:y=Ax+b


50e978645c8b3323393ad0d01e0602e3.png


Linear(1024,64),1024是输入向量组的长度,64是输出的长度


  • 线形层2


1636f9eecf107a8b6d4b9a71686cb26d.png



将64个输入继续线性组合,最终输出10(因为最后分类的图像一共有十个类别):Linear(64,10)

相关文章
|
21天前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
46 11
|
21天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
221 55
|
1月前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
160 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
18天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于yolov4深度学习网络的公共场所人流密度检测系统matlab仿真,带GUI界面
本项目使用 MATLAB 2022a 进行 YOLOv4 算法仿真,实现公共场所人流密度检测。通过卷积神经网络提取图像特征,将图像划分为多个网格进行目标检测和识别,最终计算人流密度。核心程序包括图像和视频读取、处理和显示功能。仿真结果展示了算法的有效性和准确性。
58 31
|
3天前
|
运维 监控 Cloud Native
构建深度可观测、可集成的网络智能运维平台
本文介绍了构建深度可观测、可集成的网络智能运维平台(简称NIS),旨在解决云上网络运维面临的复杂挑战。内容涵盖云网络运维的三大难题、打造云原生AIOps工具集的解决思路、可观测性对业务稳定的重要性,以及产品发布的亮点,包括流量分析NPM、网络架构巡检和自动化运维OpenAPI,助力客户实现自助运维与优化。
|
3天前
|
人工智能 大数据 网络性能优化
构建超大带宽、超高性能及稳定可观测的全球互联网络
本次课程聚焦构建超大带宽、超高性能及稳定可观测的全球互联网络。首先介绍全球互联网络的功能与应用场景,涵盖云企业网、转发路由器等产品。接着探讨AI时代下全球互联网络面临的挑战,如大规模带宽需求、超低时延、极致稳定性和全面可观测性,并分享相应的解决方案,包括升级转发路由器、基于时延的流量调度和增强网络稳定性。最后宣布降价措施,降低数据与算力连接成本,助力企业全球化发展。
|
14天前
|
数据采集 机器学习/深度学习 人工智能
基于AI的网络流量分析:构建智能化运维体系
基于AI的网络流量分析:构建智能化运维体系
88 13
|
25天前
|
机器学习/深度学习 算法 信息无障碍
基于GoogleNet深度学习网络的手语识别算法matlab仿真
本项目展示了基于GoogleNet的深度学习手语识别算法,使用Matlab2022a实现。通过卷积神经网络(CNN)识别手语手势,如"How are you"、"I am fine"、"I love you"等。核心在于Inception模块,通过多尺度处理和1x1卷积减少计算量,提高效率。项目附带完整代码及操作视频。
|
27天前
|
云安全 人工智能 安全
|
28天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于深度学习网络的宝石类型识别算法matlab仿真
本项目利用GoogLeNet深度学习网络进行宝石类型识别,实验包括收集多类宝石图像数据集并按7:1:2比例划分。使用Matlab2022a实现算法,提供含中文注释的完整代码及操作视频。GoogLeNet通过其独特的Inception模块,结合数据增强、学习率调整和正则化等优化手段,有效提升了宝石识别的准确性和效率。