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

相关文章
|
1天前
|
机器学习/深度学习 人工智能 自然语言处理
一文搞懂深度学习:神经网络基础部分
一文搞懂深度学习:神经网络基础部分
8 0
|
1天前
|
机器学习/深度学习
深度学习网络训练,Loss出现Nan的解决办法
深度学习网络训练,Loss出现Nan的解决办法
8 0
|
1天前
|
机器学习/深度学习 编解码 自然语言处理
深度学习500问——Chapter07:生成对抗网络(GAN)(3)
深度学习500问——Chapter07:生成对抗网络(GAN)(3)
6 0
|
1天前
|
机器学习/深度学习 JavaScript Linux
深度学习500问——Chapter07:生成对抗网络(GAN)(2)
深度学习500问——Chapter07:生成对抗网络(GAN)(2)
9 0
|
1天前
|
机器学习/深度学习 JavaScript 算法
深度学习500问——Chapter07:生成对抗网络(GAN)(1)
深度学习500问——Chapter07:生成对抗网络(GAN)(1)
10 3
|
1天前
|
机器学习/深度学习 算法 Scala
深度学习500问——Chapter06: 循环神经网络(RNN)(4)
深度学习500问——Chapter06: 循环神经网络(RNN)(4)
14 1
|
1天前
|
机器学习/深度学习 自然语言处理 语音技术
深度学习500问——Chapter06: 循环神经网络(RNN)(3)
深度学习500问——Chapter06: 循环神经网络(RNN)(3)
17 3
|
1天前
|
机器学习/深度学习 算法 搜索推荐
深度学习500问——Chapter06: 循环神经网络(RNN)(2)
深度学习500问——Chapter06: 循环神经网络(RNN)(2)
13 3
|
1天前
|
SQL 安全 网络安全
构建安全防线:云计算环境中的网络安全策略与实践
【5月更文挑战第14天】 随着企业逐渐将关键业务流程迁移到云端,云计算服务的安全性成为不容忽视的重要议题。本文深入探讨了在动态且复杂的云环境中实施有效的网络安全措施的策略和技术。通过分析当前云计算模型中的安全挑战,我们提出了一系列创新的安全框架和防御机制,旨在保护数据完整性、确保业务连续性并抵御不断演变的网络威胁。文中不仅涵盖了理论分析和案例研究,还对未来云计算安全技术的发展趋势进行了预测。
|
1天前
|
机器学习/深度学习 存储 自然语言处理
深度学习500问——Chapter06: 循环神经网络(RNN)(1)
深度学习500问——Chapter06: 循环神经网络(RNN)(1)
9 1

热门文章

最新文章