20.神经网络 - 搭建小实战和 Sequential 的使用

news/2024/9/15 4:35:53/ 标签: 神经网络, 人工智能, 深度学习

神经网络 - 搭建小实战和 Sequential 的使用

在 PyTorch 中,Sequential 是一个容器(container)类,用于构建神经网络模型。它允许你按顺序(sequential)添加不同的网络层,并将它们串联在一起,形成一个网络模型。这样做可以方便地定义简单的前向传播过程,适用于许多基本的网络结构。

Sequential 的优点之一是其简洁性和易读性,特别适用于简单的网络结构。然而,对于更复杂的模型,可能需要使用 PyTorch 的其他模型构建方式,如使用 nn.Module 基类自定义网络结构,以满足更灵活的需求。

网站地址 : Sequential — PyTorch 1.10 documentation

Example:

把卷积、非线性激活、卷积、非线性激活使用sequantial进行组合,一起放在构建的model中。

# Using Sequential to create a small model. When `model` is run,
# input will first be passed to `Conv2d(1,20,5)`. The output of
# `Conv2d(1,20,5)` will be used as the input to the first
# `ReLU`; the output of the first `ReLU` will become the input
# for `Conv2d(20,64,5)`. Finally, the output of
# `Conv2d(20,64,5)` will be used as input to the second `ReLU`
model = nn.Sequential(nn.Conv2d(1,20,5),nn.ReLU(),nn.Conv2d(20,64,5),nn.ReLU())# Using Sequential with OrderedDict. This is functionally the
# same as the above code
model = nn.Sequential(OrderedDict([('conv1', nn.Conv2d(1,20,5)),('relu1', nn.ReLU()),('conv2', nn.Conv2d(20,64,5)),('relu2', nn.ReLU())]))

好处:代码简洁易懂

1.对 CIFAR10 进行分类的简单神经网络

CIFAR 10:根据图片内容,识别其究竟属于哪一类(10代表有10个类别)

CIFAR-10 and CIFAR-100 datasets

[外链图片转存中…(img-WbXJRvP5-1724861831551)]

第一次卷积:首先加了几圈 padding(图像大小不变,还是32x32),然后卷积了32次

  • Conv2d — PyTorch 1.10 documentation
  • 输入尺寸是32x32,经过卷积后尺寸不变,如何设置参数? —— padding=2,stride=1
  • 计算公式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中Hout=32,Hin=32,dilation[0]=1,kernel_size[0]=5,将其带入到Hout的公式,计算过程如下:
32 =((32+2×padding[0]-1×(5-1)-1)/stride[0])+1,简化之后的式子为:
27+2×padding[0]=31×stride[0],stride[0]=2的话padding[0]要设置的很大,不合理,所以让stride[0]=1,可得padding[0]=2。

几个卷积核就是几通道的,一个卷积核作用于RGB三个通道后会把得到的三个矩阵的对应值相加,也就是说会合并,所以一个卷积核会产生一个通道

任何卷积核在设置padding的时候为保持输出尺寸不变都是卷积核大小的一半

通道变化时通过调整卷积核的个数(即输出通道)来实现的,在 nn.conv2d 的参数中有 out_channel 这个参数,就是对应输出通道

kernel 的内容是不一样的,可以理解为不同的特征抓取,因此一个核会产生一个channel

直接搭建,实现上图 CIFAR10 model 的代码
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linearclass Tudui(nn.Module):def __init__(self):super(Tudui, self).__init__()self.conv1 = Conv2d(in_channels=3, out_channels=32, kernel_size=5, padding=2)  #第一个卷积,输入3,输出32,卷积核5,令stride=1,根据公式计算出padding为2self.maxpool1 = MaxPool2d(kernel_size=2)   #池化self.conv2 = Conv2d(32,32,5,padding=2)  #维持尺寸不变,所以padding仍为2self.maxpool2 = MaxPool2d(2)self.conv3 = Conv2d(32,64,5,padding=2)self.maxpool3 = MaxPool2d(2)self.flatten = Flatten()  #展平为64x4x4=1024个数据# 经过两个线性层:第一个线性层(1024为in_features,64为out_features)、第二个线性层(64为in_features,10为out_features)self.linear1 = Linear(1024,64)self.linear2 = Linear(64,10)  #10为10个类别,若预测的是概率,则取最大概率对应的类别,为该图片网络预测到的类别def forward(self,x):   #x为inputx = self.conv1(x)x = self.maxpool1(x)x = self.conv2(x)x = self.maxpool2(x)x = self.conv3(x)x = self.maxpool3(x)x = self.flatten(x)x = self.linear1(x)x = self.linear2(x)return xtudui = Tudui()
print(tudui)

[外链图片转存中…(img-YRNV8yil-1724861831552)]

运行后可以看到网络结构:

[外链图片转存中…(img-iRZ4X2hO-1724861831552)]

实际过程中如何检查网络的正确性?

核心:一定尺寸的数据经过网络后,能够得到我们想要的输出

对网络结构进行检验的代码:

input = torch.ones((64,3,32,32))  #全是1,batch_size=64,3通道,32x32
output = tudui(input)
print(output.shape)

image-20240812013632526

运行结果:

torch.Size([64, 10])

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

若不知道flatten之后的维度是多少该怎么办?

这个1024是我们算出来的,若不会算,删除forward中self.flatten(x)后两行,运行代码

import torch
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linearclass Tudui(nn.Module):def __init__(self):super(Tudui, self).__init__()self.conv1 = Conv2d(in_channels=3, out_channels=32, kernel_size=5, padding=2)  #第一个卷积self.maxpool1 = MaxPool2d(kernel_size=2)   #池化self.conv2 = Conv2d(32,32,5,padding=2)  #维持尺寸不变,所以padding仍为2self.maxpool2 = MaxPool2d(2)self.conv3 = Conv2d(32,64,5,padding=2)self.maxpool3 = MaxPool2d(2)self.flatten = Flatten()  #展平为64x4x4=1024个数据# 经过两个线性层:第一个线性层(1024为in_features,64为out_features)、第二个线性层(64为in_features,10为out_features)self.linear1 = Linear(1024,64)self.linear2 = Linear(64,10)  #10为10个类别,若预测的是概率,则取最大概率对应的类别,为该图片网络预测到的类别def forward(self,x):   #x为inputx = self.conv1(x)x = self.maxpool1(x)x = self.conv2(x)x = self.maxpool2(x)x = self.conv3(x)x = self.maxpool3(x)x = self.flatten(x)return xtudui = Tudui()
print(tudui)input = torch.ones((64,3,32,32))  #全是1,batch_size=64(64张图片),3通道,32x32
output = tudui(input)
print(output.shape)  # torch.Size([64,1024])

看到输出的维度是(64,1024),64可以理解为64张图片,1024就是flatten之后的维度了

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用 Sequential 搭建,实现上图 CIFAR10 model 的代码

可以看到上面神经网络进行搭建时非常繁琐,在init中进行了多个操作以后,需要在forward中逐次进行调用,因此我们使用sequential方法,在init方法中直接定义一个model,然后在下面的forward方法中直接使用一次model即可。

在init方法中:
self.model1 = Sequential(Conv2d(...)MaxPool2d(...)Linear(...)
)
在forward方法中:x = self.model(x)
return x

作用:代码更加简洁

import torch
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequentialclass Xiazhi(nn.Module):def __init__(self):super(Xiazhi, self).__init__()self.model1 = Sequential(Conv2d(3, 32, 5, padding=2),MaxPool2d(2),Conv2d(32, 32, 5, padding=2),MaxPool2d(2),Conv2d(32, 64, 5, padding=2),MaxPool2d(2),Flatten(),Linear(1024, 64),Linear(64, 10))def forward(self, x):  # x为inputx = self.model1(x)return xinput = torch.ones((64, 3, 32, 32))  # 全是1,batch_size=64,3通道,32x32
output = xiazhi(input)
print(output.shape)

运行结果:

image-20240808162915963

2.引入 tensorboard 可视化模型结构

在上述代码后面加上以下代码:

from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter("logs_seq")
writer.add_graph(tudui,input)   # add_graph 计算图
writer.close()

运行后在 terminal 里输入:

tensorboard --logdir=logs_seq

打开网址,双击图片中的矩形,可以放大每个部分:

[外链图片转存中…(img-gZPZzalR-1724861831555)]

writer = SummaryWriter("logs_seq")
writer.add_graph(tudui,input)   # add_graph 计算图
writer.close()

运行后在 terminal 里输入:

tensorboard --logdir=logs_seq

打开网址,双击图片中的矩形,可以放大每个部分:

[外链图片转存中…(img-gZPZzalR-1724861831555)]


http://www.ppmy.cn/news/1518789.html

相关文章

手机FM LNA方案设计

一 概述 关于手机FM的使用,较为传统的则是在打开FM应用前先插入有线耳机才能使用FM应用。然而随着智能手机的进步以及有线耳机日益被无线蓝牙耳机所代替,内置FM LNA方案被应用的越来越多,无需插入有线耳机,复用例如GSM天线也能实…

JavaScript初级——键盘事件

1、 onkeydown —— 按键被按下 —— 如果一直按着某个键不松手,则事件会一直触发 —— 连续触发时,第一次和第二次之间会间隔稍微长一点,其他的会非常的快,这种设计是为了放置误操作的发生 2、 onkeyup —— 按键被松…

Substance 3D Stager for Mac/Win:高效三维场景设计利器

Substance 3D Stager是Adobe推出的一款专为Mac和Windows用户设计的三维场景设计和渲染软件,它以其高效、直观的特点,在数字艺术、游戏开发、影视特效等领域赢得了广泛的认可。 核心功能 直观的操作界面:Substance 3D Stager提供了优秀的视觉…

NTP时间服务器是什么?功能是什么?京准电钟

NTP时间服务器是什么?功能是什么?京准电钟 NTP时间服务器是什么?功能是什么?京准电钟 时间同步技术必定将是整个大数据处理系统的重要支撑和保障。时间同步技术使数据产生与处理系统的所有节点具有全局的、统一的标准时间&#x…

让自家的智能语音助手实现todo任务的添加

我家的树莓派在成为了“智能语音助手”后,经过rasa学习训练,已经可以帮忙查日期/时间,查天气预报,进行一些简单的闲聊。但是,我希望它的功能还可以再强大些,比如说,可以帮我记录todo任务。为了实…

猫头虎分享:Python库 TensorFlow 的简介、安装、用法详解入门教程

猫头虎分享:Python库 TensorFlow 的简介、安装、用法详解入门教程 🐯 摘要 今天猫头虎带大家走进 人工智能 的核心领域,深入探讨 TensorFlow 这个强大的 Python库。从 TensorFlow 的基础简介到详细的安装和用法,这篇教程将带你从…

小白学深度学习:知识蒸馏研究综述

为了能够在低资源设备上运行深度学习模型,需要研发高效的小规模网络。知识蒸馏是获取高效小规模网络的一种新兴方法,其主要思想是将学习能力强的复杂教师模型中的“知识”迁移到简单的学生模型中。 知识蒸馏介绍 知识蒸馏是一种教师-学生(Teacher-Stud…

(C++ STL)vector类的简单模拟实现与源码展示

vector类的简单模拟实现 一、前言二、vector 的成员变量三、vector 部分函数实现size、capacityreserveresizeinsert 与注意事项erase构造、析构、赋值拷贝 四、vector 源代码 以下代码环境为 VS2022 C。 一、前言 vector类 本质上就是数据结构中的顺序表。(可参考&#xff1…

Python中的“for循环”:探索其无限潜力

引言 for循环是任何Python程序员工具箱中的必备技能之一。无论是在处理数据时需要遍历数组,还是在编写Web应用时循环处理请求,亦或是进行复杂的算法实现,for循环都能派上大用场。通过掌握for循环的不同用法,我们可以更高效地解决…

谷粒商城实战笔记-269~271-商城业务-订单服务-bug修改

文章目录 一,269-商城业务-订单服务-bug修改二,270-商城业务-订单服务-订单确认页渲染三,271-商城业务-订单服务-订单确认页库存查询四,272-商城业务-订单服务-订单确认页模拟运费效果 一,269-商城业务-订单服务-bug修…

深度学习100问18:什么是负采样

嘿,负采样就像是一个巧妙的“偷懒小妙招”,在自然语言处理的世界里大显身手呢! 一、定义及原理 想象一下,你在训练一个语言小魔法师,它的任务是搞清楚词和词之间的关系。就像在 Skip-gram 模型里,要猜出…

JAVA如何使用反射读取注解

在Java中,反射是一种强大的机制,它允许程序在运行时取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。使用反射读取注解是Java注解应用的重要部分。以下将详细介绍如何使用Java反射读取注解,并提供相应的代码例子和运…

浅谈【数据结构】图-图的概念

目录 1、图 1.1图的分类 1.2路径 1.3连通图 2、图的存储结构 2.1数组表示法 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错,说的就是你,不用再怀疑!!! 希望我的文章内容能对你有帮助&#xff0c…

华为手机数据丢失如何恢复?

在智能手机普及的今天,华为手机凭借其卓越的性能和用户体验赢得了众多用户的青睐。然而,在使用过程中,我们难免会遇到数据丢失或误删除的情况。面对这一困境,许多用户可能会感到束手无策。别担心,本文将为你提供一份全…

分享一个基于Python的广东热门旅游数据可视化分析系统flask毕设(源码、调试、LW、开题、PPT)

💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…

安装vue-cli2.0并创建项目

文章目录 1 安装node2 安装vue-cli3 创建基于webpack模板的项目4 项目结构 1 安装node 之前写的博客中介绍了如何安装:NodeJS的安装【windows】。安装完毕后,可以在命令行中输入node -v和npm -v,若出现版本号,则安装成功。 2 安…

Golang 读取文件

GoLang读取文件需要用到os类去打开文件,然后再用其他方式分析文件里的内容。打开文件比较简单,使用os.Open就可以了,记住用defer关闭就行。但是读取文件内容就头疼了,以文本文件为例子,就有各种方式 读取到byte数组 首…

我如何解决 java.lang.ClassNotFoundException:javax.xml.bind.DatatypeConverter

优质博文:IT-BLOG-CN 问题 我如何解决java.lang.ClassNotFoundException:javax.xml.bind.DatatypeConverter 2024-08-25T02:31:25.46202:00 ERROR 21868 --- [fintonic-oauth] [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet…

亚马逊云(AWS)技术深度解析及代码使用案例

亚马逊云(AWS)技术深度解析及代码使用案例 引言 亚马逊云(Amazon Web Services,简称AWS)作为全球云计算技术的首创者和领导者,以其强大的基础设施、丰富的服务种类以及卓越的安全性,持续引领着…

EmguCV学习笔记 VB.Net 第9章 视频操作

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…