【深度学习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天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习的魔法:如何用神经网络解锁数据的奥秘
在人工智能的璀璨星空中,深度学习犹如一颗最亮的星,它以其强大的数据处理能力,改变了我们对世界的认知方式。本文将深入浅出地介绍深度学习的核心概念、工作原理及其在不同领域的应用实例,让读者能够理解并欣赏到深度学习技术背后的奇妙和强大之处。
11 3
|
2天前
|
机器学习/深度学习 人工智能 算法
深度学习的奥秘:探索神经网络的魔法
在本文中,我们将一起踏上一场奇妙的旅程,探索深度学习背后的科学奥秘。通过简单易懂的语言和有趣的比喻,我们将解锁神经网络的强大力量,并了解它们如何改变我们的世界。无论你是科技爱好者还是对人工智能充满好奇的朋友,这篇文章都将为你打开一扇通往未来的大门。
|
6天前
|
机器学习/深度学习 算法 开发者
深度学习的魔法:用神经网络识别手写数字
【9月更文挑战第2天】在这篇技术文章中,我们将一起探索深度学习的奥秘,并尝试使用神经网络来识别手写数字。通过简单的代码示例,我们将了解如何构建和训练一个深度学习模型,以及如何使用它来进行手写数字的识别。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和实践技巧。
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的艺术:探索神经网络的奥秘
【9月更文挑战第2天】 在人工智能的宏伟画卷中,深度学习以其独特的魅力和强大的能力占据了中心舞台。本文将深入浅出地探讨深度学习的核心——神经网络,揭示其如何模拟人脑处理信息的方式,以及它在图像识别、自然语言处理等领域的应用。我们将从基础概念出发,逐步深入到网络结构的设计思想,最后探讨深度学习面临的挑战与未来发展方向。通过本文,读者将获得对深度学习基本原理的理解,并激发进一步探索这一领域的好奇心。
|
8天前
|
存储 传感器 物联网
|
8天前
|
监控 安全 网络协议
|
8天前
|
安全 开发者 数据安全/隐私保护
Xamarin 的安全性考虑与最佳实践:从数据加密到网络防护,全面解析构建安全移动应用的六大核心技术要点与实战代码示例
【8月更文挑战第31天】Xamarin 的安全性考虑与最佳实践对于构建安全可靠的跨平台移动应用至关重要。本文探讨了 Xamarin 开发中的关键安全因素,如数据加密、网络通信安全、权限管理等,并提供了 AES 加密算法的代码示例。
21 0
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN)入门
【8月更文挑战第31天】在人工智能的浪潮中,深度学习以其强大的数据处理能力成为时代的宠儿。本文将引导你走进深度学习的核心组件之一——卷积神经网络(CNN),并带你一探其背后的奥秘。通过简明的语言和直观的代码示例,我们将一起构建一个简易的CNN模型,理解它在图像处理领域的应用,并探索如何利用Python和TensorFlow实现它。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇通往深度学习世界的大门。
|
6天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
深度学习在图像识别中的应用与挑战
【9月更文挑战第2天】本文将探讨深度学习技术如何在图像识别领域大放异彩,并分析其面临的主要挑战。我们将通过一个实际的代码示例,展示如何利用深度学习模型进行图像分类任务,从而让读者对深度学习在图像识别中的应用有一个直观的理解。
43 22
|
1天前
|
机器学习/深度学习 自然语言处理 自动驾驶
深度学习的奥秘:从基本原理到实际应用
在这篇文章中,我们将探索深度学习的神秘世界。首先,我们将介绍深度学习的基本概念和原理,然后深入探讨其在不同领域的应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和思考方式。让我们一起揭开深度学习的面纱,探索其无限可能!