【深度学习入门篇 ⑤ 】PyTorch网络模型创建

【🍊易编橙:一个帮助编程小伙伴少走弯路的终身成长社群🍊】

大家好,我是小森( ﹡ˆoˆ﹡ ) ! 易编橙·终身成长社群创始团队嘉宾,橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官、CSDN人工智能领域优质创作者 。 


今天我们学习PyTorch的网络模型创建,全面概括该怎么创建模型!

神经网络的创建步骤

  1. 定义模型类,需要继承nn.Module
  2. 定义各种层,包括卷积层、池化层、全连接层、激活函数等等
  3. 编写前向传播,规定信号是如何传输的

可以用 torchsummary 查看网络结构,如果没有的话,使用pip命令进行安装 

pip install torchsummary

 Module: 神经网络的模板

所有的神经网络模块都应该继承该模块

import torch.nn as nn
import torch.nn.functional as F
class Model(nn.Module):def _init__( self):super()._init_()self.conv1 = nn.Conv2d(1,20,5)self.conv2 = nn.Conv2d( 20,20,5)def forward( self, x):x = F.relu( self.conv1(x))return F.relu(self.conv2(x) )

神经网络中常见的各种层

常见的层包括:卷积层,池化层,全连接层,正则化层,激活层

导入层有两种方法:

一种是将其看作一个类,在torch.nn里面

另一种是将其看作一个函数,在torch.nn.functional里面可以调用

全连接层 

全连接层又称为线性层,所以函数名叫 Linear,执行的操作是𝑦=𝑥𝐴𝑇+𝑏

torch.nn.Linear(in_features, out_features, bias=True, device=None, dtype=None)
  • in_feature代表输入数
  • out_features代表输出数,即神经元数量
import torch
import torch.nn as nn
m = nn.Linear(2,3)
input = torch.randn(5,2)
output = m( input)
print(output.size() )

输出:

torch.Size([5, 3])

先搭建个只有一层的网络,用 torchsummry 查看网络结构

import torch  
import torch.nn as nn  
from torchsummary import summary  class NeuralNetwork(nn.Module):  def __init__(self):  super().__init__()  self.fc = nn.Linear(10, 1, bias=False) def forward(self, x):  x = self.fc(x)  return x  if __name__ == '__main__':  network = NeuralNetwork()  summary(network, (10,))  # 这里调用 torchsummary 来打印网络结构

 输出:

----------------------------------------------------------------Layer (type)               Output Shape         Param #
================================================================Linear-1                    [-1, 1]              10
================================================================
Total params: 10
Trainable params: 10
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.00
Params size (MB): 0.00
Estimated Total Size (MB): 0.00
----------------------------------------------------------------Process finished with exit code 0

我们再自定义输入到网络中:

if __name__ == '__main__':network = NeuralNetwork()network.to('cuda')input = torch.randn(10)input = input.to('cuda')print('input=', input)output = network(input)print('output=', output)result = output.detach().cpu().numpy()print('result=', result)
  •  detach()用于从计算图中分离出一个张量(Tensor),使其成为一个新的张量,这个新张量不再需要计算梯度(即不会参与反向传播)

打印结果:

input= tensor([ 0.5767, -1.2199,  0.4407,  0.6083, -0.1758,  0.2291, -0.8924,  1.1664,0.3445,  0.7242], device='cuda:0')
output= tensor([-0.0183], device='cuda:0', grad_fn=<SqueezeBackward4>)
result= [-0.01834533]

激活函数

常见的激活函数包括 sigmoidrelu,以及softmax,学会他们怎么用,就会用其他激活函数了

Sigmoid

sigmoid是早期的激活函数

 函数的示意图:

m = nn.Sigmoid()
input = torch.randn(5)
output = m(input)print(input)
print(output)
# 输出tensor([ 0.6759, -0.8753, -0.3187,  0.0088,  2.0625])
tensor([0.6628, 0.2942, 0.4210, 0.5022, 0.8872])
ReLU

ReLU激活函数常放在全连接层、以及卷积层后面

m = nn.ReLU()    # 或m = F.ReLU()
input = torch.randn(5)
output = m(input)print(input)
print(output)# 输出
tensor([-2.8164,  0.8885, -0.9526,  0.3723, -0.2637])
tensor([0.0000, 0.8885, 0.0000, 0.3723, 0.0000])
Softmax

softmax是在分类当中经常用到的激活函数,用来放在全连接网络的最后一层

 

m = nn.Softmax(dim=1)
input = torch.randn(4,3)
output = m(input)print(input)
print(output)# 输出
tensor([[ 0.1096,  0.7095,  0.5996],[-0.6431, -0.0555,  0.5332],[-0.2367, -0.1851,  0.4029],[-1.0242,  1.9747,  2.0828]])
tensor([[0.2245, 0.4090, 0.3665],[0.1655, 0.2979, 0.5366],[0.2532, 0.2667, 0.4801],[0.0230, 0.4621, 0.5149]])

随机失活Dropout

当 FC层过多,容易对其中某条路径产生依赖,从而使得某些参数未能训练起来

为了防止上述问题,在 FC层之间通常还会加入随机失活功能,也就是Dropout

dropout的作用是随机失活的,通常加载FC层之间

m = nn.Dropout(p=0.5)
input = torch.randn(6,6)
output = m(input)print(input)
print(output)

输出:

tensor([[-2.1174,  0.1180, -1.2979,  0.3600, -1.0417, -1.3583],[-0.2945,  1.0038, -0.9205,  2.5044, -1.2789,  0.4402],[-0.4641,  1.3378,  0.1766,  0.1972,  1.6867, -1.7123],[-1.1137,  1.1291, -0.1404,  0.6881,  0.3442,  0.7479],[ 2.4966, -2.5837,  2.0277, -1.0195,  0.2140, -0.1453],[-0.9259,  1.2443, -0.2939,  0.0304, -0.1057, -0.7959]])
tensor([[-4.2347,  0.0000, -0.0000,  0.0000, -0.0000, -2.7165],[-0.5890,  2.0076, -0.0000,  0.0000, -2.5579,  0.0000],[-0.0000,  0.0000,  0.3533,  0.3945,  3.3733, -3.4246],[-0.0000,  2.2581, -0.0000,  1.3763,  0.0000,  0.0000],[ 0.0000, -0.0000,  4.0554, -0.0000,  0.0000, -0.0000],[-0.0000,  2.4887, -0.5878,  0.0608, -0.0000, -0.0000]])

至此,一个全连接网络就可以构建了。

案例1:全连接网络处理一维信息

搭建以下的网络结构

组合全连接层,dropout层,激活函数,我们就可以构建出一个完整的全连接网络结构,代码如下

import torch
import torch.nn as nn
from torchsummary import summaryclass NeuralNetwork(nn.Module):def __init__(self):super().__init__()self.relu = nn.ReLU()self.softmax = nn.Softmax(dim=1)self.dropout = nn.Dropout(p=0.5)self.fc_1 = nn.Linear(1000, 100)self.fc_2 = nn.Linear(100, 50)self.fc_3 = nn.Linear(50, 10)def forward(self,x):x = x.view(-1, 1000)  # 将输入的维度变成1000x = self.dropout(self.relu(self.fc_1(x)))x = self.dropout(self.relu(self.fc_2(x)))x = self.softmax(self.fc_3(x))return xif __name__ == '__main__':network = NeuralNetwork()network.to('cuda')input = torch.randn(10, 1000)input = input.to('cuda')output = network(input)result = output.detach().cpu().numpy()print('result=', result)summary(network, (1000,))

输出:

result= [[0.08132502 0.0739548  0.09398187 0.10661174 0.12098686 0.115986820.09127808 0.11483455 0.10602687 0.0950134 ][0.09192658 0.08138597 0.07189317 0.12415235 0.11198585 0.116253770.11482875 0.09960157 0.11294526 0.07502676][0.09182167 0.05779037 0.14180492 0.09080649 0.11460604 0.096480750.10017563 0.08380282 0.10664819 0.11606318][0.07540213 0.09515596 0.11200604 0.11029708 0.14663948 0.087270780.06854413 0.07956128 0.10746382 0.1176593 ][0.07536343 0.091349   0.1040979  0.08714981 0.11877389 0.144979750.08420233 0.08688229 0.11904272 0.08815894][0.08312867 0.05986795 0.12148032 0.10792468 0.10400964 0.12383830.11305461 0.08796311 0.11383145 0.08490121][0.07948367 0.09183787 0.08272586 0.11967309 0.12150185 0.108538620.09249827 0.10322765 0.102726   0.09778718][0.09022301 0.09465341 0.08689808 0.08957365 0.14267558 0.10252120.08516254 0.08472932 0.12696771 0.09659547][0.08116906 0.12094414 0.09831021 0.12145476 0.12512349 0.109310410.09090355 0.08238174 0.07898384 0.0914188 ][0.10484971 0.08653011 0.09862521 0.1086348  0.09272213 0.09912340.08527588 0.10124511 0.10974825 0.11324544]]
----------------------------------------------------------------Layer (type)               Output Shape         Param #
================================================================Linear-1                  [-1, 100]         100,100ReLU-2                  [-1, 100]               0Dropout-3                  [-1, 100]               0Linear-4                   [-1, 50]           5,050ReLU-5                   [-1, 50]               0Dropout-6                   [-1, 50]               0Linear-7                   [-1, 10]             510Softmax-8                   [-1, 10]               0
================================================================
Total params: 105,660
Trainable params: 105,660
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.00
Params size (MB): 0.40
Estimated Total Size (MB): 0.41
----------------------------------------------------------------

案例2:全连接网络处理二维图像

搭建以下的网络结构

使用全连接网络处理二维图像信息,当二维特征(Feature Map)转为一维特征时,需要从高维压缩成一维

这时候可以用 tensor.view(),或者用nn.Flatten(start_dim=1)

import torch
import torch.nn as nn
from torchsummary import summaryclass NeuralNetwork(nn.Module):def __init__(self):super().__init__()self.relu = nn.ReLU()self.softmax = nn.Softmax(dim=1)self.dropout = nn.Dropout(p=0.5)self.fc_1 = nn.Linear(3*256*256, 100)self.fc_2 = nn.Linear(100, 10)self.fc_3 = nn.Linear(10,5)def forward(self,x):x = x.view(-1, 3*256*256)x = self.dropout(self.relu(self.fc_1(x)))x = self.dropout(self.relu(self.fc_2(x)))x = self.softmax(self.fc_3(x))return xif __name__ == '__main__':network = NeuralNetwork()network.to('cuda')input = torch.randn((4,3,256,256))   # 4个样本,每个样本3通道,256*256像素input = input.to('cuda')output = network(input)result = output.detach().cpu().numpy()print('result=', result)summary(network, (3, 256, 256))

输出:

result= [[0.17621297 0.14625552 0.19215888 0.2527377  0.23263492][0.16786984 0.16124012 0.1907313  0.2352923  0.24486642][0.17400946 0.16431957 0.18192714 0.23585317 0.2438907 ][0.1535219  0.18567167 0.18704179 0.16786435 0.30590025]]
----------------------------------------------------------------Layer (type)               Output Shape         Param #
================================================================Linear-1                  [-1, 100]      19,660,900ReLU-2                  [-1, 100]               0Dropout-3                  [-1, 100]               0Linear-4                   [-1, 10]           1,010ReLU-5                   [-1, 10]               0Dropout-6                   [-1, 10]               0Linear-7                    [-1, 5]              55Softmax-8                    [-1, 5]               0
================================================================
Total params: 19,661,965
Trainable params: 19,661,965
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.75
Forward/backward pass size (MB): 0.00
Params size (MB): 75.00
Estimated Total Size (MB): 75.76
----------------------------------------------------------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/44947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OSPF.综合实验

1、首先将各个网段基于172.16.0.0 16 进行划分 1.1、划分为4个大区域 172.16.0.0 18 172.16.64.0 18 172.16.128.0 18 172.16.192.0 18 四个网段 划分R4 划分area2 划分area3 划分area1 2、进行IP配置 如图使用配置指令进行配置 ip address x.x.x.x /x 并且将缺省路由…

Sortable.js板块拖拽示例

图例 代码在图片后面 点赞❤️关注&#x1f64f;收藏⭐️ 页面加载后显示 拖拽效果 源代码 由于js库使用外链&#xff0c;所以会加载一会儿 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name&qu…

C语言 ——— 实用调试技巧(Visual Studio)

目录 Debug 和 Release 的区别 F10 --- 逐过程调试 & F11 --- 逐语句调试 F9 --- 新建/切换断点 & F5 --- 开始调试 shift F5 & ctrl F5 Debug 和 Release 的区别 Debug&#xff1a;通常为调试版本&#xff0c;它包含调试信息&#xff0c;并且不作任何优化…

一 GD32 MCU 开发环境搭建

GD32 系列为通用型 MCU &#xff0c;所以开发环境也可以使用通用型的 IDE &#xff0c;目前使用较多的是 KEIL、 IAR 、 GCC 和 Embedded Builder &#xff0c;客户可以根据个人喜好来选择相应的开发环境。 目录 1、使用 Keil 开发 GD32 目前市面通用的MDK for ARM版本有Kei…

企业网三层架构

企业网三层架构&#xff1a;是一种层次化模型设计&#xff0c;旨在将复杂的网络设计分成三个层次&#xff0c;每个层次都着重于某些特定的功能&#xff0c;以提高效率和稳定性。 企业网三层架构层次&#xff1a; 接入层&#xff1a;使终端设备接入到网络中来&#xff0c;提供…

Android12 MultiMedia框架之GenericSource extractor

前面两节学习到了各种Source的创建和extractor service的启动&#xff0c;本节将以本地播放为例记录下GenericSource是如何创建一个extractor的。extractor是在PrepareAsync()方法中被创建出来的&#xff0c;为了不过多赘述&#xff0c;我们直接从GenericSource的onPrepareAsyn…

13_Shell系统函数

13_Shell系统函数和自定义函数 一、系统函数 basename 获取文件名 #!/bin/bash#basename 相对路径文件名 basename ./1.sh#basename 绝对路径文件名 basename /tmp/1.sh#basename 去除文件后缀名 basename /tmp/1.sh .shdirname 获取文件所在目录名 #!/bin/bash#dirname 相对路…

Redis持久化RDB,AOF

目 录 CONFIG动态修改配置 慢查询 持久化 在上一篇主要对redis的了解入门&#xff0c;安装&#xff0c;以及基础配置&#xff0c;多实例的实现&#xff1a;redis的安装看我上一篇&#xff1a; Redis安装部署与使用,多实例 redis是挡在MySQL前面的&#xff0c;运行在内存…

产品经理-研发流程-敏捷开发-迭代-需求评审及产品规划(15)

敏捷开发是以用户的需求进化为核心&#xff0c;采用迭代、循序渐进的方法进行软件开发。 通俗来说&#xff0c;敏捷开发是一个软件开发流程&#xff0c;是一个采用了迭代方法的开发流程 简单来说&#xff0c;迭代就是把一个大产品拆分出一些最小的实现单位。完成不同的迭代就最…

机器学习筑基篇,Jupyter Notebook 精简指南

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 0x00 Jupyter Notebook 简明指南 描述&#xff1a;前面我们已经在机器学习工作站&#xff08;Ubuntu 24.04 Desktop Geforce RTX 4070Ti SUPER&#xff09;中安装 Anaconda 工具包&#xff0c;其…

老物件线上3D回忆展拓宽了艺术作品的展示空间和时间-深圳华锐视点

在数字技术的浪潮下&#xff0c;3D线上画展为艺术家们开启了一个全新的展示与销售平台。这一创新形式不仅拓宽了艺术作品的展示空间&#xff0c;还为广大观众带来了前所未有的观赏体验。 3D线上画展制作以其独特的互动性&#xff0c;让艺术不再是单一的视觉享受。在这里&#x…

数据处理-Matplotlib 绘图展示

文章目录 1. Matplotlib 简介2. 安装3. Matplotlib Pyplot4. 绘制图表1. 折线图2. 散点图3. 柱状图4. 饼图5. 直方图 5. 中文显示 1. Matplotlib 简介 Matplotlib 是 Python 的绘图库&#xff0c;它能让使用者很轻松地将数据图形化&#xff0c;并且提供多样化的输出格式。 Ma…

zdppy+onlyoffice实现重命名文件的功能

参考文档&#xff1a;https://api.onlyoffice.com/zh/editors/rename 步骤图&#xff1a; 实现步骤&#xff1a; 用户在 文档编辑器中为文档指定一个新名称。 文档编辑器 将文档的新名称通知给 文档管理器。 文档管理器 将文档的新名称发送到 文档存储服务&#xff0c;在这里…

synchronized关键字详解

文章目录 synchronized使用示例实现原理锁的升级synchronized与可见性synchronized与原子性synchronized与有序性 synchronized synchronized是Java提供的关键字译为同步&#xff0c;是Java中用于实现线程同步的一种机制。它可以确保在同一时间只有一个线程能够执行某段代码&a…

【Python系列】数字的bool值

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

MVC之 IHttpModule管道模型《二》

》》》注意&#xff1a;在http请求的处理过程中&#xff0c;只能调用一个HttpHandler&#xff0c;但可以调用多个HttpModule。 HTTP Modules ASP.NET请求处理过程是基于管道模型的&#xff0c;这个管道模型是由多个HttpModule和HttpHandler组成&#xff0c;当请求到达HttpMod…

UART编程

Q:为什么使用串口前要先在电脑上安装CH340驱动&#xff1f; 中断的作用&#xff1f; 环形buffer的作用&#xff1f; static和valitate的作用 三种编程方式简介 也可以通过DMA方式减小CPU资源的消耗 直接把数据在SRAM内存和UART模块进行传输 &#xff0c;流程&#xff1a; …

玩家自行定制内存将古老的386 PC内存升级到64MB容量

比尔盖茨曾说&#xff1a;“无论对谁来说&#xff0c;640K内存都足够了。” 如果你是一个还停留在 30 针 SIMM 时代的老式电脑爱好者&#xff0c;那么你的内存升级选择是相当有限的。不过&#xff0c;YouTube 上的一个频道已经展示了如何将古老的 386 系统内存升级到令人"…

Linux内核编译安装 - Deepin,Debian系

为什么要自己编译内核 优点 定制化&#xff1a;你可以根据自己的硬件和需求配置内核&#xff0c;去掉不必要的模块&#xff0c;优化性能。性能优化&#xff1a;移除不需要的驱动程序和特性&#xff0c;减小内核体积&#xff0c;提高系统性能。最新特性和修复&#xff1a;获取…

【Leetcode】最小数字游戏

你有一个下标从 0 开始、长度为 偶数 的整数数组 nums &#xff0c;同时还有一个空数组 arr 。Alice 和 Bob 决定玩一个游戏&#xff0c;游戏中每一轮 Alice 和 Bob 都会各自执行一次操作。游戏规则如下&#xff1a; 每一轮&#xff0c;Alice 先从 nums 中移除一个 最小 元素&…