PyTorch 基础学习(6)- 函数API

ops/2024/9/20 7:14:51/ 标签: pytorch, 学习, 人工智能

系列文章:
PyTorch 基础学习(1) - 快速入门
PyTorch 基础学习(2)- 张量 Tensors
PyTorch 基础学习(3) - 张量的数学操作
PyTorch 基础学习(4)- 张量的类型
PyTorch 基础学习(5)- 神经网络

介绍

PyTorch 的 torch.nn.functional 模块提供了丰富的函数,用于构建神经网络。这些函数提供了灵活性和控制能力,允许你直接实现层和操作。本指南探讨模块中的关键函数,涵盖卷积操作、池化、激活函数、归一化、线性变换、Dropout、距离计算和损失函数。

1. 卷积操作(Convolution)

相关函数

  • torch.nn.functional.conv1d - 一维卷积
  • torch.nn.functional.conv2d - 二维卷积
  • torch.nn.functional.conv3d - 三维卷积
  • torch.nn.functional.conv_transpose1d - 一维转置卷积
  • torch.nn.functional.conv_transpose2d - 二维转置卷积
  • torch.nn.functional.conv_transpose3d - 三维转置卷积

作用

卷积操作是深度学习中特别是在卷积神经网络(CNN)中用于特征提取的核心运算。通过卷积操作,模型可以识别图像或其他数据中的局部特征。

原理

卷积操作涉及一个滤波器(或核)在输入数据(例如图像)上滑动。滤波器与输入数据的局部区域进行逐元素相乘并求和,生成特征图。这个过程可以看作是信号处理中的卷积过程。

应用实例

用于图像分类、目标检测、图像分割等任务。

代码示例

import torch
import torch.nn as nn# 定义一个二维卷积层
conv_layer = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=3, stride=1, padding=1)# 输入数据:1个样本,1个通道,5x5大小
input_data = torch.tensor([[[[1, 2, 3, 0, 1],[0, 1, 2, 3, 0],[1, 0, 1, 2, 3],[2, 1, 0, 1, 2],[3, 2, 1, 0, 1]]]], dtype=torch.float32)# 进行卷积操作
output_data = conv_layer(input_data)
print("卷积输出:", output_data)

在这个示例中,我们定义了一个二维卷积层,使用3x3的核对输入数据进行卷积。卷积操作提取输入中的局部特征。

2. 池化(Pooling)

相关函数

  • torch.nn.functional.avg_pool1d - 一维平均池化
  • torch.nn.functional.avg_pool2d - 二维平均池化
  • torch.nn.functional.avg_pool3d - 三维平均池化
  • torch.nn.functional.max_pool1d - 一维最大池化
  • torch.nn.functional.max_pool2d - 二维最大池化
  • torch.nn.functional.max_pool3d - 三维最大池化
  • torch.nn.functional.adaptive_max_pool1d - 一维自适应最大池化
  • torch.nn.functional.adaptive_max_pool2d - 二维自适应最大池化
  • torch.nn.functional.adaptive_avg_pool1d - 一维自适应平均池化
  • torch.nn.functional.adaptive_avg_pool2d - 二维自适应平均池化

作用

池化用于减小特征图的尺寸,从而减少计算量并控制过拟合。常见的池化操作包括最大池化和平均池化。

原理

池化操作通过对输入数据的某一区域(通常是一个固定大小的窗口)进行采样(最大值或平均值),从而生成较小的输出。

应用实例

在CNN中用于降维和特征增强。

代码示例

import torch.nn.functional as F# 定义最大池化层
max_pool_layer = nn.MaxPool2d(kernel_size=2, stride=2)# 使用最大池化
pooled_output = max_pool_layer(output_data)
print("最大池化输出:", pooled_output)

在这个示例中,我们应用了一个2x2的最大池化操作,以减少特征图的尺寸。池化有助于缩小输入数据的尺寸,减少计算需求。

3. 激活函数(Activation Function)

相关函数

  • torch.nn.functional.relu - ReLU 激活函数
  • torch.nn.functional.leaky_relu - Leaky ReLU 激活函数
  • torch.nn.functional.softmax - Softmax 激活函数
  • torch.nn.functional.sigmoid - Sigmoid 激活函数
  • torch.nn.functional.tanh - Tanh 激活函数

作用

激活函数引入非线性特性,使神经网络可以逼近复杂的非线性映射。

原理

激活函数对每个节点的输入加权和进行非线性变换,常见的激活函数有ReLU、Sigmoid、Tanh等。

应用实例

广泛应用于各种神经网络中。

代码示例

# ReLU激活函数
relu = nn.ReLU()# 应用ReLU激活函数
activated_output = relu(output_data)
print("激活函数输出:", activated_output)

激活函数如 ReLU 能够有效引入非线性,使神经网络具备学习复杂映射的能力。

4. 归一化(Normalization)

相关函数

  • torch.nn.functional.batch_norm - 批量归一化

作用

归一化用于加速模型收敛、提高模型的稳定性和性能。

原理

归一化通过调整输入数据或特征的分布来降低内部协变量偏移。常见的方法有批量归一化(Batch Normalization)和层归一化(Layer Normalization)。

应用实例

在深度学习网络的不同层中,尤其是在深度网络中提高训练速度和稳定性。

代码示例

# 批量归一化层
batch_norm = nn.BatchNorm2d(num_features=1)# 应用批量归一化
normalized_output = batch_norm(output_data)
print("归一化输出:", normalized_output)

归一化通过调整激活值的分布,能够显著提升深度学习模型的训练效率和稳定性。

5. 线性变换(Linear Transformation)

相关函数

  • torch.nn.functional.linear - 线性变换

作用

线性变换用于将输入数据映射到新的特征空间,是神经网络的基础运算之一。

原理

线性变换通过矩阵乘法实现,将输入特征进行线性组合。

应用实例

广泛用于神经网络的全连接层中。

代码示例

# 定义一个线性层
linear_layer = nn.Linear(in_features=3, out_features=2)# 输入数据:1个样本,3个特征
input_vector = torch.tensor([[0.5, 1.5, -0.5]], dtype=torch.float32)# 进行线性变换
linear_output = linear_layer(input_vector)
print("线性变换输出:", linear_output)

线性变换是神经网络中的基础运算,负责特征的线性组合和映射。

6. Dropout

相关函数

  • torch.nn.functional.dropout - Dropout 正则化

作用

Dropout用于防止神经网络的过拟合,通过随机丢弃神经元来提高模型的泛化能力。

原理

在训练过程中,Dropout层以一定概率(如0.5)随机将一些神经元的输出置零,减少模型对特定神经元的依赖。

应用实例

在深度神经网络的训练过程中提高模型的泛化能力。

代码示例

# Dropout层
dropout = nn.Dropout(p=0.5)# 应用Dropout
dropped_output = dropout(activated_output)
print("Dropout输出:", dropped_output)

Dropout通过随机丢弃神经元输出来降低模型复杂度,提高其在未知数据上的表现能力。

7. 距离计算(Distance Calculation)

相关函数

  • torch.nn.functional.pairwise_distance - 成对距离计算

作用

距离计算用于度量数据点之间的相似性或差异性,是许多机器学习算法的基础。

原理

常见的距离度量包括欧氏距离、余弦相似度、曼哈顿距离等。

应用实例

用于聚类、最近邻算法、推荐系统等。

代码示例

import torch.nn.functional as F# 输入两个向量
vector1 = torch.tensor([1.0, 2.0, 3.0])
vector2 = torch.tensor([4.0, 5.0, 6.0])# 计算欧氏距离
euclidean_distance = torch.dist(vector1, vector2)
print(f"欧氏距离: {euclidean_distance}")# 计算余弦相似度
cosine_similarity = F.cosine_similarity(vector1.unsqueeze(0), vector2.unsqueeze(0))
print(f"余弦相似度: {cosine_similarity}")

距离计算在机器学习中被广泛用于评估样本间的相似性,进而影响模型预测和推荐系统等应用。

8. 损失函数(Loss Function)

相关函数

  • torch.nn.functional.nll_loss - 负对数似然损失
  • torch.nn.functional.kl_div - KL 散度损失
  • torch.nn.functional.cross_entropy - 交叉熵损失
  • torch.nn.functional.binary_cross_entropy - 二进制交叉熵损失
  • torch.nn.functional.smooth_l1_loss - 平滑L1损失

作用

损失函数用于评估模型预测结果与真实结果的差异,是训练模型时优化目标的度量。

原理

损失函数计算预测值与真实值之间的差异,并通过反向传播算法最小化损失以更新模型参数。常见的损失函数有均方误差(MSE)、交叉熵损失(Cross-Entropy Loss)等。

应用实例

用于监督学习模型的训练过程中。

代码示例

# 定义交叉熵损失函数
criterion = nn.CrossEntropyLoss()# 模拟预测输出(2个样本,3个类别)
predictions = torch.tensor([[2.0, 1.0, 0.1], [0.5, 2.0, 0.3]], requires_grad=True)# 真实标签
labels = torch.tensor([0, 1])# 计算损失
loss = criterion(predictions, labels)
print(f"损失: {loss}")

损失函数如交叉熵用于评估预测结果的准确性,并通过优化过程最小化误差,从而改进模型性能。

应用实例:卷积神经网络

以下是结合所有模块的完整代码示例,展示如何在一个简单的网络模型中使用这些函数:

import torch
import torch.nn as nn
import torch.nn.functional as F# 定义一个简单的卷积神经网络
class SimpleCNN(nn.Module):def __init__(self):super(SimpleCNN, self).__init__()# 使用 Conv2d 函数创建二维卷积层self.conv1 = nn.Conv2d(in_channels=1, out_channels=4, kernel_size=3, padding=1)# 使用 MaxPool2d 函数创建二维最大池化层self.pool = nn.MaxPool2d(kernel_size=2, stride=2)# 使用 Linear 函数创建线性层(全连接层)self.fc1 = nn.Linear(4 * 2 * 2, 3)  # 假设输入大小为 4x4 经池化后def forward(self, x):# 使用 conv1 对输入进行卷积操作x = self.conv1(x)print("卷积后输出:\n", x)  # 输出卷积后的结果# 使用 ReLU 激活函数x = F.relu(x)print("激活后输出:\n", x)  # 输出激活后的结果# 使用最大池化操作减小特征图尺寸x = self.pool(x)print("池化后输出:\n", x)  # 输出池化后的结果# 使用 view 函数将特征图展平为一维向量以输入线性层x = x.view(-1, 4 * 2 * 2)# 使用线性变换输出最终结果x = self.fc1(x)return x# 初始化网络和输入数据
net = SimpleCNN()
input_data = torch.tensor([[[[1, 2, 3, 0],[0, 1, 2, 3],[1, 0, 1, 2],[2, 1, 0, 1]]]], dtype=torch.float32)# 前向传播计算网络输出
output = net(input_data)
print("网络输出:\n", output)# 定义损失函数和目标
# 使用 CrossEntropyLoss 函数计算交叉熵损失
criterion = nn.CrossEntropyLoss()
target = torch.tensor([1])  # 假设目标类为1# 计算损失
loss = criterion(output, target)
print("损失:", loss)

输出结果:

卷积后输出:tensor([[[[ 0.6530,  0.9850, -0.2557,  0.5875],[ 0.4467, -0.3687,  1.0748,  0.0390],[ 0.3640, -0.1853, -0.3687,  0.3418],[ 0.2925, -0.1090,  0.1611,  0.1915]],[[ 0.3807,  0.3066,  0.4869, -1.0378],[ 0.1513,  1.2855,  0.2178, -1.0162],[-0.1017,  0.5534,  1.2855, -0.2453],[ 0.5349, -0.3403,  0.2825,  0.1798]],[[-0.5078, -0.6591, -0.3985,  0.1080],[ 0.1660, -0.6600, -0.9805, -0.4279],[ 0.0491, -0.2865, -0.6600,  0.0026],[-0.0439,  0.3187,  0.3057, -0.0634]],[[-0.3912, -0.6672, -0.8205, -1.3337],[-0.0908, -0.7384, -2.0509, -2.0917],[ 0.0548, -0.8600, -0.7384, -2.1425],[-1.0021, -0.6551, -0.2339, -1.2335]]]],grad_fn=<ConvolutionBackward0>)
激活后输出:tensor([[[[0.6530, 0.9850, 0.0000, 0.5875],[0.4467, 0.0000, 1.0748, 0.0390],[0.3640, 0.0000, 0.0000, 0.3418],[0.2925, 0.0000, 0.1611, 0.1915]],[[0.3807, 0.3066, 0.4869, 0.0000],[0.1513, 1.2855, 0.2178, 0.0000],[0.0000, 0.5534, 1.2855, 0.0000],[0.5349, 0.0000, 0.2825, 0.1798]],[[0.0000, 0.0000, 0.0000, 0.1080],[0.1660, 0.0000, 0.0000, 0.0000],[0.0491, 0.0000, 0.0000, 0.0026],[0.0000, 0.3187, 0.3057, 0.0000]],[[0.0000, 0.0000, 0.0000, 0.0000],[0.0000, 0.0000, 0.0000, 0.0000],[0.0548, 0.0000, 0.0000, 0.0000],[0.0000, 0.0000, 0.0000, 0.0000]]]], grad_fn=<ReluBackward0>)
池化后输出:tensor([[[[0.9850, 1.0748],[0.3640, 0.3418]],[[1.2855, 0.4869],[0.5534, 1.2855]],[[0.1660, 0.1080],[0.3187, 0.3057]],[[0.0000, 0.0000],[0.0548, 0.0000]]]], grad_fn=<MaxPool2DWithIndicesBackward0>)
网络输出:tensor([[-0.5723, -0.1544, -0.2558]], grad_fn=<AddmmBackward0>)
损失: tensor(0.9408, grad_fn=<NllLossBackward0>)

代码中的函数使用:

  • nn.Conv2d: 用于定义二维卷积层,设置输入通道数、输出通道数、卷积核大小和填充。
  • nn.MaxPool2d:用于定义二维最大池化层,设置池化窗口大小和步长。
  • nn.Linear: 用于定义线性层(全连接层),设置输入和输出的特征数。
  • F.relu: 应用 ReLU 激活函数,添加非线性能力。
  • x.view: 将张量展平成一维,适应全连接层输入。
  • nn.CrossEntropyLoss: 定义交叉熵损失函数,用于评估分类任务中模型输出与真实标签的差异。

该实例展示了如何组合使用 PyTorch 的基础组件构建一个简单的卷积神经网络,并对输入数据进行特征提取和分类。


http://www.ppmy.cn/ops/93725.html

相关文章

KillWxapkg-自动化反编译微信小程序工具(附安装包)

KillWxapkg是一款纯Golang实现&#xff0c;一个用于自动化反编译微信小程序、小程序安全评估工具工具&#xff0c;小程序安全利器&#xff0c; 可以自动解密&#xff0c;解包&#xff0c;可还原工程目录&#xff0c;支持Hook&#xff0c;小程序修改&#xff0c;支持微信开发者工…

k8s 单机 部署

k8s 单机 部署 香港服务器 centos7.6 2核4G 30M 搞个k8s单机部署搞了好几天 就是一直出错 遇到了好多次镜像的错误 真的是日了&#x1f415;了索性 搞个香港服务器&#xff0c;不折腾镜像源了Deploy Kubernetes On-Premises Using CentOS 7 — Part 1 https://medium.com/sar…

【单片机】51单片机入门教程(二):定时器的模式详解与中断应用实例

文章目录 51单片机定时器教程:模式详解与中断应用实例1. 介绍2. 51单片机定时器/计数器概述3. 定时器控制寄存器与中断入口4. 模式0:13位定时器/计数器5. 模式1:16位定时器/计数器6. 模式2:8位自动重装载定时器/计数器7. 模式3:分割两个独立的8位定时器/计数器8. 总结51单…

基于SpringBoot的企业资产管理系统

TOC springboot117基于SpringBoot的企业资产管理系统 系统概述 1.1 研究背景 智慧养老是面向居家老人、社区及养老机构的传感网系统与信息平台&#xff0c;并在此基础上提供实时、快捷、高效、低成本的&#xff0c;物联化、互联化、智能化的养老服务。 随着科技进步&#…

【qt】QMainWindow下实现一个记事本

之前我们学过QWidget&#xff0c;QMainWindow会在ui界面多一个菜单 先实现ui界面 1.添加文本编辑&#xff0c;实现可以写多行 2.将文本编辑放大&#xff0c;拖动即可 3.编辑菜单栏 4.然后我们要实现对应子列表的功能&#xff0c;但是在这里不能转到槽&#xff0c;所以我们…

关于自己部署AI大模型踩的坑(一)——硬件篇

最近一直在研究如何打算属于我自己的J.A.R.V.I.S.&#xff08;钢铁侠中的机器人管家&#xff09;。 上一篇写了我最近在部署自己的大模型&#xff0c;使用llama3.1&#xff0c; 和通义千问2。虽然最终结果也是成功了&#xff0c;过程却十分地坎坷。 所以这一篇文章一是总结其中…

uniapp版本更新除了plus.runtime.getProperty的解决办法

以下是展示图 带尺寸的图片: 首先把以下代码放到想要更新弹出的页面 //template部分<uni-popup ref"popup" background-color"#fff"><versionUp handleCloseVersion"closeVersion"></versionUp></uni-popup>//script…

Mysql——对数据基本操作(增删查改)——操纵语言(DML)

之前的创建数据库和创建表&#xff0c;类型、约束都是用的DDL【data definition language】 数据定义语言&#xff0c;用来维护存储数据的结构 代表指令: create, drop, alter 那么现在我们来学习数据操纵语言 DML【data manipulation language】 数据操纵语言&#xff0c;用来…

使用Selenium爬取网络页面

在现代网络数据分析和自动化测试中&#xff0c;Selenium 是一个强大而流行的工具。它不仅可以帮助开发者自动化浏览器操作&#xff0c;还能用于爬取网络页面。本文将介绍如何使用 Selenium 爬取网络页面&#xff0c;包括基本设置、常用操作及一些实用的技巧。 一、什么是 Selen…

腾讯cdg提前批一面0726

介绍项目 黑马商城 为什么使用rabbitmq 用于异步更新订单 扣减余额后异步更新订单失败怎么办 分布式事务回滚 什么是接口幂等性&#xff0c;怎么实现 接口幂等性是指同一个接口在短时间点击多次都之后返回只执行一次的结果。 Token机制&#xff1a; 生成Token&#xff1a;在客户…

点赞功能开发

文章目录 1.点赞收藏功能设计1.示意图2.描述1.使用redis记录的数据2.数据库的设计3.功能设计1.新增点赞2.取消点赞3.查询当前题目被点赞的数量4.查询当前题目被当前用户是否点过赞5.我的点赞 2.代码生成器的使用1.找到代码生成器在磁盘的位置&#xff0c;直接复制到项目下2.导入…

微信小程序中实现自动滚动

使用scroll-view组件的scroll-into-view属性&#xff1a; <scroll-view class"container" scroll-y"{{true}}" scroll-into-view"recordBottomScroll"><view class"text_style" style"color: #252526;">{{te…

16 交换机命令行配置

交换机命令行配置 一、交换机命令行基本配置 &#xff08;一&#xff09;配置主机名 Switch>enable Switch#configure terminal Switch(config)#hostname S1&#xff08;二&#xff09;查看配置信息 Switch#show running-config Building configuration...Current confi…

SpringBoot配置

目录 yaml基本含义 yaml基本语法 yaml数据格式 实操 yaml:参数引用 小结 yaml基本含义 通过对比不同配置文件写法&#xff0c;就可以发现yaml配置文件&#xff0c;更加注重数据本身 原因 1 比properties配置文件&#xff0c;更加注重层级关系 2 和xml文件比起来&#xff…

【Unity-UGUI】UI重建

UGUI UI重建二三事(一) UGUI UI重建二三事(二) [UGUI源码二]Unity UI重建(Rebuild)源码分析 这一部分主要是通过以上几篇文章学习的&#xff0c;总结一下&#xff1a; UI重建主要分类两类&#xff0c;一类是布局重建(Layout Rebuild)&#xff0c;另一类是图形重建(Graphic Reb…

jar包扫描不到,idea如何通过Project Structure设置

目录 一、进入Project Structure二、添加你的项目进来三、手动添加依赖 很多时候jar包文件已经存在&#xff0c;但是无法使用&#xff0c;需要通过Project Structure设置 一、进入Project Structure 选择Modules->点击 二、添加你的项目进来 一直next&#xff0c;最后点…

git推送错误:Failed to connect to github.com port 443

今天在push代码到github的时候遇到了错误&#xff1a;fatal: unable to access https://github.com/ShangyiAlone/FacemaskDetection.git/: Failure when receiving data from the peer 网上搜了下教程&#xff0c;是开启梯子的时候代理服务器的问题&#xff0c;开启梯子的时候…

【Python SHA256 摘要算法】

SHA256 是一种广泛使用的密码散列函数&#xff0c;用于生成数据的唯一指纹&#xff0c;即散列值。它属于SHA-2家族&#xff0c;该家族还包括 SHA-384 和 SHA-512 算法。SHA256 算法在许多领域都有应用&#xff0c;例如&#xff1a; 数据完整性验证&#xff1a;用于验证数据在传…

使用 Flask、Celery 和 Python 实现每月定时任务

为了创建一个使用 Flask、Celery 和 Python 实现的每月定时任务&#xff0c;我们需要按照以下步骤进行&#xff1a; 1.安装必要的库 我们需要安装 Flask、Celery 和 Redis&#xff08;作为消息代理&#xff09;。我们可以使用 pip 来安装它们&#xff1a; bash复制代码 ​ p…

C++ | Leetcode C++题解之第331题验证二叉树的前序序列化

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isValidSerialization(string preorder) {int n preorder.length();int i 0;int slots 1;while (i < n) {if (slots 0) {return false;}if (preorder[i] ,) {i;} else if (preorder[i] #){slots--;i…