深度学习与 PyTorch 基础

笔记

1 深度学习简介

1.1 深度学习概念

  • 深度学习是机器学习的一类算法, 以人工神经网络为结构, 可以实现自动提取特征

  • 深度学习核心思想是人工神经网络为结构, 自动提取特征

1.2 深度学习特点

  • 自动提取特征

  • 解释性差

  • 大量数据和高性能计算能力

  • 非线性转换(引入非线性因素)

1.3 深度学习模型

  • ANN 人工神经网络 感知机

  • CNN 卷积神经网络 图像/视频

  • RNN 循环神经网络 NLP

  • transformer RNN衍生出来的

  • 自编学习器

  • ...

1.4 深度学习应用场景

  • 自然语言处理NLP

    • 生成式AI AIGC 大模型

    • 机器翻译

    • 语音识别

    • ...

  • 计算机视觉CV

    • 图像识别

    • 面部解锁

    • 视频合成

    • ...

  • 推荐系统

    • 电影

    • 音乐

    • 文章

    • 视频

    • 商品

2 PyTorch框架简介

  • pytorch是深度学习的框架, python的第三方包, 数据是以张量类型存在

  • pytorch特点

    • 数据类型是张量类型

    • 自动微分模块, 自动求导/梯度

    • 可以在GPU/TPU/NPU上运行, 加速运行

    • 兼容各种平台 系统/硬件(显卡)

  • pytorch目前更新到2.5版本

3 张量创建

3.1 什么是张量

  • 张量是矩阵, 可以是多维

    • 0维->标量

    • 1维->[1 2 3 4 5]

    • 2维->[[1 2 3],[4 5 6]]

    • 3维...

  • 张量是通过类创建出来的对象, 提供各种方法和属性

3.2 基本创建方式

  • torch.tensor(data=): 指定数据

  • torch.Tensor(data=, size=): 指定数据或形状

  • torch.IntTensor(data=)/FloatTensor(): 指定数据

    import torch
    import numpy as np
    ​
    ​
    # torch.tensor(data=, dtype=,): 根据指定数据或指定元素类型创建张量
    # data: 数据
    # dtype: 元素类型
    def dm01():list1 = [[1., 2, 3], [4, 5, 6]]  # 创建的张量为float32int1 = 10# array默认类型是float64, 所以创建的张量为float64n1 = np.array([[1., 2., 3.], [4., 5., 6.]])t1 = torch.tensor(data=list1)t2 = torch.tensor(data=int1)t3 = torch.tensor(data=n1)print('t1的值->', t1)print('t1类型->', type(t1))print('t1元素类型->', t1.dtype)print('t2的值->', t2)print('t2类型->', type(t2))print('t3的值->', t3)print('t3类型->', type(t3))
    ​
    ​
    # torch.Tensor(data=, size=): 根据指定数据或指定形状创建张量
    # data: 数据
    # size: 形状, 接收元组 (0轴, 1轴, ...) -> 元组有多少个元素就是多少维张量, 对应维度上值就是数据个数
    def dm02():# 指定数据t1 = torch.Tensor(data=[[1.1, 1.2, 1.3], [2.2, 2.3, 2.4]])print('t1的值->', t1)print('t1类型->', type(t1))# 指定形状t2 = torch.Tensor(size=(2, 3))print('t2的值->', t2)print('t2类型->', type(t2))
    ​
    ​
    # torch.IntTensor(data=)/LongTensor()/FloatTensor()/DoubleTensor(): 创建指定类型的张量
    # data: 数据
    def dm03():# 如果元素类型不是指定类型, 会自动转换t1 = torch.IntTensor([[1.1, 2, 3.7], [4, 5, 6]])t2 = torch.FloatTensor([[1.1, 2, 3.7], [4, 5, 6]])print('t1的值->', t1)print('t1类型->', type(t1))print('t1元素类型->', t1.dtype)print('t2的值->', t2)print('t2类型->', type(t2))print('t2元素类型->', t2.dtype)
    ​
    ​
    if __name__ == '__main__':dm01()# dm02()# dm03()

3.3 线性和随机张量

  • 线性张量

    • torch.arange()

    • torch.linspace()

  • 随机张量

    • torch.rand()/randn()

    • torch.randint()

    • torch.initial_seed()

    • torch.manual_seed()

    import torch
    ​
    ​
    # torch.arange(start=, end=, step=): 创建指定步长的线性张量  左闭右开
    # start: 起始值
    # end: 结束值
    # step: 步长, 默认1
    # torch.linspace(start=, end=, steps=): 创建指定元素个数的线性张量  左闭右闭
    # start: 起始值
    # end: 结束值
    # steps: 元素个数
    # step=(end-start)/(steps-1)  value_i=start+step*i
    def dm01():t1 = torch.arange(start=0, end=10, step=2)print('t1的值是->', t1)print('t1类型是->', type(t1))t2 = torch.linspace(start=0, end=9, steps=9)print('t2的值是->', t2)print('t2类型是->', type(t2))
    ​
    ​
    # torch.rand(size=)/randn(size=): 创建指定形状的随机浮点类型张量
    # torch.randint(low=, high=, size=): 创建指定形状指定范围随机整数类型张量  左闭右开
    # low: 最小值
    # high: 最大值
    # size: 形状, 元组
    ​
    # torch.initial_seed(): 查看随机种子数
    # torch.manual_seed(seed=): 设置随机种子数
    def dm02():# (5, 4): 5行4列t1 = torch.rand(size=(5, 4))print('t1的值是->', t1)print('t1类型->', type(t1))print('t1元素类型->', t1.dtype)print('t1随机种子数->', torch.initial_seed())# 设置随机种子数torch.manual_seed(seed=66)t2 = torch.randint(low=0, high=10, size=(2, 3))print('t2的值是->', t2)print('t2类型->', type(t2))print('t2元素类型->', t2.dtype)print('t2随机种子数->', torch.initial_seed())
    ​
    ​
    ​
    if __name__ == '__main__':# dm01()dm02()

3.4 0/1/指定值张量

  • torch.ones/zeros/full(size=[, fill_value=])

  • torch.ones_like/zeros_like/full_like(input=tensor[, fill_value=])

    import torch
    ​
    ​
    # torch.ones(size=): 根据形状创建全1张量
    # torch.ones_like(input=): 根据指定张量的形状创建全1张量
    def dm01():t1 = torch.ones(size=(2, 3))print('t1的值是->', t1)print('t1的形状是->', t1.shape)print('t1的元素类型是->', t1.dtype)# 形状: (5, )t2 = torch.tensor(data=[1, 2, 3, 4, 5])t3 = torch.ones_like(input=t2)print('t2的形状是->', t2.shape)print('t3的值是->', t3)print('t3的形状是->', t3.shape)
    ​
    ​
    # torch.zeros(size=): 根据形状创建全0张量
    # torch.zeros_like(input=): 根据指定张量的形状创建全0张量
    def dm02():t1 = torch.zeros(size=(2, 3))print('t1的值是->', t1)print('t1的形状是->', t1.shape)print('t1的元素类型是->', t1.dtype)# 形状: (5, )t2 = torch.tensor(data=[1, 2, 3, 4, 5])t3 = torch.zeros_like(input=t2)print('t2的形状是->', t2.shape)print('t3的值是->', t3)print('t3的形状是->', t3.shape)
    ​
    ​
    # torch.full(size=, fill_value=): 根据形状和指定值创建指定值的张量
    # torch.full_like(input=, fill_value=): 根据指定张量形状和指定值创建指定值的张量
    def dm03():t1 = torch.full(size=(2, 3, 4), fill_value=10)t2 = torch.tensor(data=[[1, 2], [3, 4]])t3 = torch.full_like(input=t2, fill_value=100)print('t1的值是->', t1)print('t1的形状是->', t1.shape)print('t3的值是->', t3)print('t3的形状是->', t3.shape)
    ​
    ​
    if __name__ == '__main__':# dm01()# dm02()dm03()

3.5 指定元素类型张量

  • tensor.type(dtype=)

  • tensor.half()/float()/double()/short()/int()/long()

    import torch
    ​
    ​
    # torch.tensor(data=, dtype=):
    # dtype: 指定元素类型, 浮点类型默认是float32
    ​
    # tensor.type(dtype=): 修改张量元素类型
    # torch.float32
    # torch.FloatTensor
    # torch.cuda.FloatTensor
    def dm01():t1 = torch.tensor(data=[[1., 2., 3.], [4., 5., 6.]], dtype=torch.float16)print('t1的元素类型->', t1.dtype)# 转换成float32t2 = t1.type(dtype=torch.FloatTensor)t3 = t1.type(dtype=torch.int64)print('t2的元素类型->', t2.dtype)print('t3的元素类型->', t3.dtype)
    ​
    ​
    # tensor.half()/float()/double()/short()/int()/long()
    def dm02():t1 = torch.tensor(data=[1, 2])print('t1的元素类型->', t1.dtype)# t2 = t1.half()t2 = t1.int()print(t2)print('t2的元素类型->', t2.dtype)
    ​
    ​
    if __name__ == '__main__':# dm01()dm02()

4 张量类型转换

4.1 张量转换为NumPy数组

import torch
import numpy as np
​
​
# 张量转换成numpy数组
# tensor.numpy(): 共享内存, 修改一个另外一个也跟着变, 可以通过copy()函数不共享内存
def dm01():t1 = torch.tensor([[1, 2, 3], [4, 5, 6]])print('t1->', t1)# 转换成numpy数组# n1 = t1.numpy()n1 = t1.numpy().copy()print('n1->', n1)print('n1的类型->', type(n1))# 修改n1的第一个值# [0][0]->第一行第一列的元素n1[0][0] = 100print('n1修改后->', n1)print('t1->', t1)

4.2 NumPy数组转换为张量

# numpy数组转换成张量
# torch.from_numpy(ndarray): 共享内存, 对ndarray数组进行copy()
# torch.tensor(data=ndarray): 不共享内存
def dm02():n1 = np.array([[1, 2, 3], [4, 5, 6]])# 转换成张量# 共享内存t1 = torch.from_numpy(n1)# 不共享内存# t1 = torch.from_numpy(n1.copy())# t1 = torch.tensor(data=n1)print('t1->', t1)print('t1类型->', type(t1))# 修改张量元素t1[0][0] = 8888print('t1修改后->', t1)print('n1->', n1)

4.3 提取标量张量的数值

import torch
​
​
# tensor.item(): 提取单个元素张量的数值, 张量可以是标量张量/一维张量/二维张量...只要是单个元素即可
def dm01():# 数值转换成张量# 标量t1 = torch.tensor(data=10)# 一维# t1 = torch.tensor(data=[10])# 二维# t1 = torch.tensor(data=[[10]])print('t1->', t1)print('t1形状->', t1.shape)# 单个元素张量转换成数值, 提取数值print('t1.item()->', t1.item())
​
​
if __name__ == '__main__':dm01()

5 张量数值计算

5.1 基本运算

  • + - * / -

  • tensor/torch.add() sub() mul() div() neg()

  • tensor/torch.add_() sub_() mul_() div_() neg_()

    import torch
    ​
    ​
    # 运算: 张量和数值之间运算, 张量和张量之间运算
    # + - * / -
    # add(other=) sub() mul() div() neg()  不修改原张量
    # add_() sub_() mul_() div_() neg_()  修改原张量
    ​
    def dm01():# 创建张量t1 = torch.tensor(data=[1, 2, 3, 4])# 张量和数值运算t2 = t1 + 10print('t2->', t2)# 张量之间运算, 对应位置的元素进行计算t3 = t1 + t2print('t3->', t3)
    ​# add() 不修改原张量t1.add(other=100)t4 = torch.add(input=t1, other=100)print('t4->', t4)
    ​# neg_() 修改原张量, 负号t5 = t1.neg_()print('t1->', t1)print('t5->', t5)
    ​
    ​
    if __name__ == '__main__':dm01()

5.2 点乘运算

  • 对应位置的元素进行乘法计算, 一般要求张量形状相同

    import torch
    ​
    ​
    # 点乘: 又称为阿达玛积, 张量元素级乘法, 对应位置的元素进行点乘, 一般要求两个张量形状相同  *  mul()
    def dm01():# t1 = torch.tensor(data=[[1, 2], [3, 4]])# (2, )t1 = torch.tensor(data=[1, 2])# (2, 2)t2 = torch.tensor(data=[[5, 6], [7, 8]])t3 = t1 * t2print('t3->', t3)t4 = torch.mul(input=t1, other=t2)print('t4->', t4)
    ​
    ​
    if __name__ == '__main__':dm01()

5.3 矩阵乘法运算

  • 第一个矩阵的行数据和第二个矩阵的列数据相乘

    import torch
    ​
    ​
    # 矩阵乘法: (n, m) * (m, p) = (n, p)  第一个矩阵的行和第二个矩阵的列相乘  @  torch.matmul(input=, ohter=)
    def dm01():# (2, 2)t1 = torch.tensor(data=[[1, 2],[3, 4]])# (2, 3)t2 = torch.tensor(data=[[5, 6, 7],[8, 9, 10]])
    ​# @t3 = t1 @ t2print('t3->', t3)# torch.matmul(): 不同形状, 只要后边维度符合矩阵乘法规则即可t4 = torch.matmul(input=t1, other=t2)print('t4->', t4)
    ​
    ​
    if __name__ == '__main__':dm01()

6 张量运算函数

  • mean()

  • sum()

  • min()/max()

  • dim: 按不同维度计算

  • exp(): 指数

  • sqrt(): 平方根

  • pow(): 幂次方

  • log()/log2()/log10(): 对数

    import torch
    ​
    ​
    def dm01():# 创建张量t1 = torch.tensor(data=[[1., 2, 3, 4],[5, 6, 7, 8]])
    ​# dim=0 按列# dim=1 按行# 平均值print('所有值平均值->', t1.mean())print('按列平均值->', t1.mean(dim=0))print('按行平均值->', t1.mean(dim=1))# 求和print('所有值求和->', t1.sum())print('按列求和->', t1.sum(dim=0))print('按行求和->', t1.sum(dim=1))# sqrt: 开方 平方根print('所有值开方->', t1.sqrt())# pow: 幂次方  x^n# exponent:几次方print('幂次方->',torch.pow(input=t1, exponent=2))# exp: 指数 e^x  张量的元素值就是xprint('指数->', torch.exp(input=t1))# log: 对数  log(x)->以e为底  log2()  log10()print('以e为底对数->', torch.log(input=t1))print('以2为底对数->', t1.log2())print('以10为底对数->', t1.log10())
    ​
    ​
    if __name__ == '__main__':dm01()

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

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

相关文章

【Unity】XLua访问C#文件

创建NPC.cs: public class NPC { public string name; public int age; public void Say() { Debug.Log("Say:我是未被修改的"); } public static void Say() { Debug.Log("Static Say:我是未被修改的"); } public void Say2(int a) { Debug.Lo…

【第十六届蓝桥杯省赛】比赛心得与经验分享(PythonA 组)

文章目录 一、我的成绩二、我的备赛经历三、如何备赛(个人观点)1. 基础语法2. 数据结构3. 算法4. 数学 四、做题技巧与注意事项五、我的题解试题A 偏蓝 🏆100%试题B IPV6 🏆0%试题C 2025图形 🏆100%试题D 最大数字 &am…

基于Springboot+Mysql的校园博客系统(含LW+PPT+源码+系统演示视频+安装说明)

系统功能 管理员功能:首页、个人中心、博主管理、文章分类管理、文章信息管理、举报投诉管理、系统管理;博主功能:首页、个人中心、文章信息管理、举报投诉管理、我的收藏管理;前台首页功能:首页、文章信息、系统公告…

第三次作业(密码学)

#include <stdio.h> #include <stdlib.h> // 计算最大公约数 int gcd(int a, int b) { while (b ! 0) { int temp b; b a % b; a temp; } return a; } // 计算模幂运算 int mod_pow(int base, int exponent, int modulus) { …

3.0/Q1,Charls最新文章解读

文章题目&#xff1a;Association between outdoor artificial light at night and metabolic diseases in middle-aged to older adults-the CHARLS survey DOI&#xff1a;10.3389/fpubh.2025.1515597 中文标题&#xff1a;夜间户外人工光与中老年人代谢性疾病的关联-CHARLS调…

MATLAB 中zerophase函数——零相位响应

零相位响应&#xff08;Zero-Phase Response&#xff09;是指滤波器的幅度函数&#xff0c;但相位为零。滤波器的相位响应为零&#xff0c;意味着不同频率的信号通过滤波器后&#xff0c;其相位不发生任何变化&#xff0c;即信号的波形在时间轴上没有偏移。 零相位响应指的是当…

马克思最基本的哲学思想--改造世界以实现人的自由全面发展--deepseek

马克思的哲学思想可以概括为“改造世界以实现人的自由全面发展”&#xff0c;这句话看似简单&#xff0c;却包含了其哲学的核心逻辑。我们可以从三个层面展开分析&#xff1a; 1. “改造世界”——实践是哲学的终极使命 马克思在《关于费尔巴哈的提纲》中写道&#xff1a; “哲…

JAVA学习-练习试用Java实现“一个简单的文本摘要系统 :基于关键词提取或句子摘要”

问题&#xff1a; java语言编辑&#xff0c;实现一个简单的文本摘要系统 &#xff1a;基于关键词提取或句子摘要。 解答思路&#xff1a; 实现一个简单的文本摘要系统&#xff0c;我们可以采用基于关键词提取的方法。以下是一个简单的Java实现&#xff0c;使用TF-IDF&#xff0…

案例解析:基于量子计算的分子对接-QDOCK(Quantum Docking)

分子对接&#xff08;Moleculardocking&#xff09;在药物发现中具有重要意义&#xff0c;但对接的计算速度和准确率始终难以平衡&#xff0c;其巨大解搜索空间对传统计算机来说异常艰巨。 本文通过引入网格点匹配&#xff08;GPM, Grind point matching&#xff09;和特征原子…

【Mytais系列】Datasource模块:数据源连接

MyBatis 的 DataSource 模块是框架与数据库交互的核心基础设施&#xff0c;负责管理数据库连接的创建、分配、释放及池化&#xff0c;直接影响 SQL 执行效率和资源利用率。以下是其核心内容、功能及在 SQL 执行中的作用详解&#xff1a; 一、DataSource 模块的核心组件 组件 功…

React 组件prop添加类型

给函数的props做注解 import { useState } from reacttype Props { className:string,title?:string } // 自定义一个Button组件 function Button(props:Props){// 解构出classname\const {className} propsreturn <button className{className}>点击我</button&g…

MCP多智能体消息传递机制(Message Passing Between Agents)

目录 &#x1f680; MCP多智能体消息传递机制&#xff08;Message Passing Between Agents&#xff09; &#x1f31f; 为什么要引入消息传递机制&#xff1f; &#x1f3d7;️ 核心设计&#xff1a;Agent间消息传递模型 &#x1f6e0;️ 1. 定义标准消息格式 &#x1f6e…

高中数学联赛模拟试题精选学数学系列第4套几何题

△ A B C \triangle ABC △ABC 的外心为点 O O O, 外接圆为 Γ \Gamma Γ. 射线 A O AO AO, B O BO BO, C O CO CO 分别交 Γ \Gamma Γ 于点 D D D, E E E, F F F. X X X 是 △ A B C \triangle ABC △ABC 内部的一点. 射线 A X AX AX, B X BX BX, C X CX CX 分…

如何实现Prometheus告警规则动态配置

在大部分的项目中都有自定义告警规则的需求&#xff0c;目前市面上都是基于Prometheus实现的监控告警。但是Prometheus本身并不支持修改告警规则自动生效&#xff0c;我们可以通过下面这些步骤实现告警规则动态配置。 1. 启动Promethues并指定参数--web.enable-lifecycle noh…

私人医生通过AI分析基因数据,是否有权提前告知癌症风险?

首席数据官高鹏律师团队编著 在精准医疗的浪潮中&#xff0c;私人医生借助AI技术解析基因数据、预判癌症风险&#xff0c;已成为高端医疗服务的“隐形标配”。然而&#xff0c;这一技术的光环之下&#xff0c;潜藏着法律与伦理的复杂博弈——医生是否有权基于AI的基因分析提前…

TFT(薄膜晶体管)和LCD(液晶显示器)区别

TFT&#xff08;薄膜晶体管&#xff09;和LCD&#xff08;液晶显示器&#xff09;是显示技术中常见的术语&#xff0c;二者既有联系又有区别。以下是它们的核心区别和关系&#xff1a; 1. 基本概念 LCD&#xff08;液晶显示器&#xff09; LCD是一种利用液晶材料特性控制光线通…

Go小技巧易错点100例(二十八)

本期分享&#xff1a; 1. runtime.Caller(1)获取调用者信息 2. for循环 select{}语法 正文&#xff1a; runtime.Caller(1)获取调用者信息 在 Go 语言中&#xff0c;runtime.Caller(1) 是 runtime 包提供的一个函数&#xff0c;用于获取当前 goroutine 的调用堆栈中的特定…

ipvsadm,是一个什么工具?

1. ipvsadm 是什么&#xff1f; ipvsadm&#xff08;IP Virtual Server Administration&#xff09;是 Linux 内核中 IPVS&#xff08;IP Virtual Server&#xff09; 模块的管理工具&#xff0c;用于配置和监控内核级的负载均衡规则。它是 Kubernetes 中 kube-proxy 在 IPVS …

用手机相册教我数组概念——照片分类术[特殊字符][特殊字符]

目录 前言一、现实场景1.1 手机相册的照片管理1.2 照片分类的需求 二、技术映射2.1 数组与照片分类的对应关系2.2 数组索引与照片标签的类比 三、知识点呈现3.1 数组的基本概念3.2 数组在编程中的重要性3.3 数组的定义与初始化3.4 数组的常见操作&#xff08;增删改查&#xff…

Java面试资源获取

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 **1. GitHub开源项目****2. 技术博客与社区*…