【深度学习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)

相关文章
|
3天前
|
3天前
|
消息中间件 监控 网络协议
Python中的Socket魔法:如何利用socket模块构建强大的网络通信
本文介绍了Python的`socket`模块,讲解了其基本概念、语法和使用方法。通过简单的TCP服务器和客户端示例,展示了如何创建、绑定、监听、接受连接及发送/接收数据。进一步探讨了多用户聊天室的实现,并介绍了非阻塞IO和多路复用技术以提高并发处理能力。最后,讨论了`socket`模块在现代网络编程中的应用及其与其他通信方式的关系。
|
3天前
|
机器学习/深度学习 人工智能 监控
深入理解深度学习中的卷积神经网络(CNN):从原理到实践
【10月更文挑战第14天】深入理解深度学习中的卷积神经网络(CNN):从原理到实践
11 1
|
4天前
|
机器学习/深度学习 算法 数据挖掘
【深度学习】经典的深度学习模型-02 ImageNet夺冠之作: 神经网络AlexNet
【深度学习】经典的深度学习模型-02 ImageNet夺冠之作: 神经网络AlexNet
10 2
|
4天前
|
人工智能 自然语言处理 NoSQL
|
4天前
|
机器学习/深度学习 编解码 算法
【深度学习】经典的深度学习模型-01 开山之作:CNN卷积神经网络LeNet-5
【深度学习】经典的深度学习模型-01 开山之作:CNN卷积神经网络LeNet-5
9 0
|
5天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:构建安全防线的多维策略
本文旨在探讨网络安全与信息安全领域的关键要素,包括网络安全漏洞、加密技术及安全意识等。通过综合分析这些方面的知识,本文揭示了构建有效安全防线的策略和最佳实践,旨在为读者提供深入的理解和实用的指导。
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
深入理解深度学习中的卷积神经网络(CNN)
【10月更文挑战第10天】深入理解深度学习中的卷积神经网络(CNN)
47 0
|
9天前
|
机器学习/深度学习 自动驾驶 算法
深度学习在图像识别中的应用与发展
本文将深入探讨深度学习技术在图像识别领域的应用,通过案例分析展示其最新进展。我们将从基本原理出发,了解深度学习如何改变图像处理和识别的方式,并展望其未来可能的发展方向。
|
9天前
|
机器学习/深度学习 自动驾驶 安全
深度学习在图像识别中的应用与挑战
随着科技的不断进步,深度学习技术已经成为解决许多复杂问题的利器,尤其在图像识别领域。本文将探讨深度学习在图像识别中的应用及其所面临的挑战,并分析未来可能的发展方向。