深度学习基础1

一、张量

  • 张量其实就是数组,不过是在深度学习中是这样的叫法

1.张量的创建

(1)基本创建方式

  • torch.tensor():根据指定数据创建张量
import torch 
import numpy as np
"""创建张量标量"""
data = torch.tensor(10)
print(data) # 输出结果tensor(10)"""numpy数组"""
data = np.random.randn(2, 3)
data = torch.tensor(data)
print(data) # 输出结果tensor([[0.1345,0.1149,0.2435],#                 [0.8026,-0.6744,-1.0918]],dtype                                             = torch.float64)"""列表,下面代码使用默认元素类型"""
data = [[10.,20.,30.],[40.,50.,60.]]
data = torch.tensor(data)
print(data) # 输出结果tensor([[10.,20.,30.],#                [40.,50.,60.])
  • torch.Tensor():根据指定形状创建张量,也可以用来创建指定数据的张量
"""创建2行3列的张量"""
data = torch.Tensor(2, 3)
"""注意:如果传递列表,则创建包含指定元素的张量"""
data = torch.Tensor([10])data = torch.Tensor([10, 20]) # tensor([10., 20.])
  • torch.IntTensor()、torch.FloatTensor()、torch.DoubleTensor():创建指定类型的张量
"""创建2行3列"""
torch.IntTensor(2, 3)"""列表"""
torch.IntTensor([2,3]) # 输出 tensor([2.,3.])"""如果类型不符合,则会强制转换"""
torch.IntTensor([2.43,3.42]) # 输出 tensor([2.,3.])

(2)创建线性和随机张量

  • torch.arangetorch.linspace创建线性张量
data = torch.arange(0,10,2) # 输出结果 tensor([0,2,4,6,8])
data = torch.linspace(0,9,10) 
  • torch.random.init_seedtorch.random.manual_seed随机种子设置
  • torch.randn创建随机张量
data = torch.randn(2,3) # 创建2行3列张量"""查看随机数种子"""
print('随机数种子':torch.random.initial_seed())"""随机数种子设置"""
torch.random.manual_seed(100)
data = torch.randn(2,3)
print(data)
print('随机数种子:',torch.random.initial_seed())

(3)创建0-1张量

  • torch.onestorch.ones_like创建全1张量
  • torch.zerostorch.zeros_like创建全0张量
  • torch.fulltorch.full_like创建全为指定值张量
data = torch.randn(2,3)
torch.zeros(4,5) # 生成4行5列全为0的二维数组
torch.zeros_like(data) #  生成2行3列全为0的二维数组torch.ones(4,5)
torch.ones_like(data)torch.full([4,5],10) # 生成4行5列 全为10的二维数组
torch.full_like(data,20)

2.张量的类型转换

(1)张量元素的类型转换

  • data.type(torch.DoubleTensor):ShortTensor,IntTensor, LongTensor, FloatTensor
  • data.double():short, int, long, float
data = torch.randn(4, 5)
print(data)
print(data.dtype) # torch.float32
print(data.type(torch.IntTensor).dtype) # torch.int32
print(data.int().dtype) # torch.int32

(2)张量转换成Numpy数组

  • 使用Tensor.numpy函数可以将张量转换为ndarray数组,但是共享内存,可是使用copy函数避免共享
# 共享空间
import torch
import numpy as nptorch.random.manual_seed(2)
data_tensor = torch.randint(0, 10, [2, 3])
print(type(data_tensor))data_numpy = data_tensor.numpy()
print(type(data_numpy))data_numpy[0][0] = 100
print(data_numpy)
print(data_tensor)# 使用copy函数避免空间共享
import torch
import numpy as nptorch.manual_seed(2)
data_tensor = torch.randint(0, 10, [2, 3])
print(type(data_tensor))data_numpy = data_tensor.numpy().copy()
print(type(data_numpy))data_numpy[0][0] = 100
print(data_tensor)
print(data_numpy)

(3)Numpy数组转换为张量

  • 使用from_numpy可以将naddray数组转换为Tensor,默认共享内存,同样可以使用copy函数避免内存共享
  • 使用torch.tensor可以将ndarray数组转换为Tensor,默认不共享内存
# 内存共享
import torch
import numpy as npdata_numpy = np.array([1, 2, 3])
data_tensor = torch.from_numpy(data_numpy)
data_tensor[0] = 10
print(data_numpy)
print(data_tensor)
[10  2  3]
tensor([10,  2,  3], dtype=torch.int32)
# 避免内存共享
import torch
import numpy as npdata_numpy = np.array([1, 2, 3])
data_tensor = torch.from_numpy(data_numpy.copy())
data_tensor[0] = 10
print(data_numpy)
print(data_tensor)
[1 2 3]
tensor([10,  2,  3], dtype=torch.int32)
# 避免内存共享
import torch
import numpy as npdata_numpy = np.array([1, 2, 3])
data_tensor = torch.Tensor(data_numpy)
data_tensor[0] = 10
print(data_numpy)
print(data_tensor)
[1 2 3]
tensor([10.,  2.,  3.])

(4)标量张量和数字转换

  • 对于只有一个元素的张量,使用item()函数将该值从张量中提取出来
    • 注意:在后面的反向传播中,必须要加上item(),否则模型会报错
import torchdata = torch.tensor(30)
print(data) # tensor(30)
print(data.item()) # 30data1 = torch.tensor([30])
print(data1) # tensor([30])
print(data1.item()) # 30 (得到的不是[30],最终只能得到数值)

3.张量数值计算

(1)张量的基本运算

加减乘除取负号

  • add, sub, mul, div, neg

  • add_, sub_, mul_, div_, neg_(其中带下划线的版本会修改原数据)

import torchtorch.random.manual_seed(22)
data = torch.randint(0, 10, [2, 3])
print(data)print(data.add(10))
print(data) # 原数据并没有发生改变
tensor([[9, 6, 6],[4, 2, 2]])
tensor([[19, 16, 16],[14, 12, 12]])
tensor([[9, 6, 6],[4, 2, 2]])
import torchtorch.random.manual_seed(22)
data = torch.randint(0, 10, [2, 3])
print(data)print(data.add_(10))
print(data) # 原数据会发生改变
tensor([[9, 6, 6],[4, 2, 2]])
tensor([[19, 16, 16],[14, 12, 12]])
tensor([[19, 16, 16],[14, 12, 12]])

(2)点乘运算

  • 定义:是两个同维矩阵对应位置的元素相乘,使用mul和运算符*实现
import torchtorch.random.manual_seed(22)
data1 = torch.randint(0, 10, [2, 3])
print(data1)torch.random.manual_seed(23)
data2 = torch.randint(0, 10, [2, 3])
print(data2)# 点乘
print(torch.mul(data1, data2))print(data1 * data2)
输出结果:
tensor([[9, 6, 6],[4, 2, 2]])
tensor([[1, 6, 6],[7, 0, 2]])
tensor([[ 9, 36, 36],[28,  0,  4]])
tensor([[ 9, 36, 36],

(3)矩阵乘法

  • 矩阵乘法运算要求第一个矩阵shape:(n, m),第二个矩阵shape:(m ,p),两个矩阵点积运算shape为(n, p)
    • 运算符@用于进行两个矩阵的乘积运算
    • torch.matmul对进行乘积运算的两矩阵形状没有限定,对数输入的shape不同的张量,对应的最后几个维度必须符合矩阵运算规则
import torchtorch.random.manual_seed(22)
data1 = torch.randint(0, 10, [2, 4])
print(data1)torch.random.manual_seed(23)
data2 = torch.randint(0, 10, [4, 5])
print(data2)# 矩阵乘法
print(data1 @ data2)print(torch.matmul(data1, data2))
输出结果:
tensor([[9, 6, 6, 4],[2, 2, 2, 1]])
tensor([[1, 6, 6, 7, 0],[2, 7, 1, 4, 7],[5, 6, 3, 7, 8],[7, 5, 2, 9, 8]])
tensor([[ 79, 152,  86, 165, 122],[ 23,  43,  22,  45,  38]])
tensor([[ 79, 152,  86, 165, 122],[ 23,  43,  22,  45,  38]])

4.常见运算函数

  • 均值
  • 平方根
  • 指数计算
  • 对数计算
import torchdata = torch.randint(0, 10, [2, 3],dtype = torch.float64)
print(data)"""计算均值(注意:tensor必须为Float或者Double类型)"""
print(data.mean())
print(data.mean(dim = 0)) # 按列计算均值
print(data.mean(dim = 1)) # 按行进行计算"""计算总和"""
print(data.sum())
print(data.sum(dim = 0))
print(data.sum(dim = 1))"""计算平方"""
print(torch.pow(data, 2))"""计算平方根"""
print(data.sqrt())"""指数计算"""
print(data.exp())"""对数计算"""
print(data.log())
print(data.log2())
print(data.log10())

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

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

相关文章

力扣网编程274题:H指数之普通解法(中等)

一. 简介 本文记录力扣网上涉及数组,排序方面的编程题:H指数。 二. 力扣网编程274题:H指数(中等) 给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研…

iptables防火墙,多IP环境下, 指定某个目的IP地址通过某个本地IP访问,策略路由!

需求在CentOS 7.9中,若需从特定源IP(10.0.0.3)访问目标网段 1.1.1.0/24方法一:策略路由(支持网段)1. 创建自定义路由表# 添加名为custom_table的路由表(ID200) echo "200 custo…

数字孪生技术引领UI前端设计新趋势:数据可视化与交互设计的深度融合

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言:数字孪生驱动 UI 设计的范式革新在大数据与三维可视化技术爆发的今天&…

【机器学习笔记 Ⅱ】6 激活函数

激活函数是神经网络的核心组件,其作用远不止“引入非线性”。以下是系统化的解析:1. 核心作用 (1) 引入非线性没有激活函数:多层神经网络等价于单层线性变换(矩阵连乘仍是线性)。加入激活函数:每层通过非线…

AI无标记动捕如何结合VR大空间技术打造沉浸式游戏体验

随着数字科技的迅猛发展,VR大空间技术正逐步成为各行业探索沉浸式体验的重要方向。在VR游戏领域,市场对于高度沉浸式体验的需求日益增长,而传统VR游戏主要依赖手柄和基础体感进行交互,而在VR大空间中,用户可以通过全身…

Qt智能指针

在 Qt 框架中,智能指针用于自动管理对象的生命周期,防止内存泄漏。以下是 Qt 中主要的智能指针及其用法详解:1. QScopedPointer作用:独占所有权,超出作用域时自动释放对象(类似 std::unique_ptr&#xff09…

408第三季part2 - 计算机网络 - 信道利用率

理解t1是发送帧的传输时间t2是确认帧的传输时间中间是传播过程这整个过程就是发送周期任何题目会有以下几种情况题目这里数据帧和确认帧长度是一样的t1 t2然后把t1的传输数据算出来然后传播是0.2sd停止等待 k1确认帧忽略t2 0t1算好后,求数据帧的长度下面是速率&…

Android framework 开发者模式下,如何修改动画过度模式

Android framework 开发者模式下, 如何修改动画过度模式 开发者模式下,动画过度 模式1.0→0.5,按如下方式修改。 开发云 - 一站式云服务平台 .../core/java/com/android/server/wm/WindowManagerService.java | 8 ---- 1 file changed, …

win11安装paddlelabel并创建目标检测项目

创建虚拟环境 conda create -n paddlelabel python3.11.11 conda activate paddlelabel通过以下命令安装 pip install --upgrade paddlelabel输入命令pdlabel运行paddlelabel,发现报错: ModuleNotFoundError: Please install connexion using the flask …

关于Novatek B/G-R/G白平衡色温坐标系再探究

目录 一、准备知识 二、色温坐标系的构建 三、Novatek白平衡色温坐标系的再探究 2.1 直线白点框 2.2双曲线白点框 四、仿真代码 之前写的一篇博文关于联咏(Novatek )白平衡色温坐标系探究-CSDN博客感觉逻辑上有些混乱,这个周末我又好好思考了下,以…

基于路径质量的AI负载均衡异常路径检测与恢复策略

AI流量往往具有突发性、大象流(大规模数据流)占比高的特点,极易造成网络拥塞热点。一条质量不佳(如高延迟、高丢包、带宽受限)的路径,不仅自身无法有效传输数据,如果ECMP继续向其分发流量&#…

ubuntu22.04 安装cuda cudnn

1.输入nvidia-smi查看可以支持安装的cuda最大版本 2.cuda与cudnn版本的选择 核心原则 向下兼容性:较新的 cuDNN 通常兼容旧版 CUDA,但反之不成立 框架依赖:优先考虑深度学习框架(TensorFlow/PyTorch)的版本要求 硬件…

5、Receiving Messages:Message Listener Containers

提供了两个MessageListenerContainer实现: KafkaMessageListenerContainer ConcurrentMessageListener容器 KafkaMessageListenerContainer在单个线程上接收来自所有主题或分区的所有消息。ConcurrentMessageListenerContainer委托给一个或多个KafkaMessageListe…

JDBC 注册驱动的常用方法详解

JDBC 注册驱动的常用方法详解 在 JDBC 中,注册驱动是建立数据库连接的第一步。以下是几种常用的驱动注册方式: 1. 显式类加载(传统方式) // 通过 Class.forName() 加载驱动类 Class.forName("com.mysql.cj.jdbc.Driver&qu…

插入数据优化

目录 一.插入数据优化 1.insert语句优化 ①批量插入 ②手动提交事务 ③主键顺序插入 2.大批量插入数据(100万条) 举例 第一步:连接数据库时,加上--local-infile属性 第二步:查看全局参数local_infile的值&…

区块链在域名系统安全中的应用进展综述

一、区块链与DNS结合的核心原理1.1 传统DNS的安全缺陷中心化架构:传统DNS依赖中心化服务器(如ICANN管理的根服务器),存在单点故障风险,易受DDoS攻击或配置错误影响。协议脆弱性:DNS协议设计之初缺乏加密和认…

GO Web 框架 Gin 完全解析与实践

目录 1. 为什么选择 Gin?解锁 Go Web 开发的超能力 Gin 的核心优势 什么时候用 Gin? 第一个 Hello World 2. 路由的艺术:从简单 GET 到复杂匹配 基础路由 高级路由技巧 性能优化小贴士 3. 中间件的魔法:让请求处理更聪明 内置中间件 自定义中间件 中间件的最佳实…

RabbitMQ使用topic Exchange实现微服务分组订阅

案例场景:用户下单后需要多个微服务(如营销、会员)分别订阅并处理订单事件,且每个微服务可能有多个集群实例,需要保证同一个微服务的集群中,只有一个实例消费到消息。不同于Kafka和rocketMQ有分组消费的功能…

kotlin 通道trysend方法

trySend 方法是 Kotlin 协程中 Channel 类的一个重要功能。它用于向通道发送元素,但与 send 方法不同的是,trySend 是非阻塞的。这意味着它不会在通道满时挂起当前协程,而是会立即返回。 trySend 方法的效果 非阻塞行为: 当你调用…

winform CheckedListBox单击选中解决方案

在WinForms的CheckedListBox控件中,默认需要双击才能切换选中状态(复选框勾选)。要实现单击即选中,需要通过代码处理鼠标点击事件并手动切换选中状态。以下是实现步骤: 1.CheckOnClick属性置为true即可。 2.通过事件处…