深度学习(1)

一、torch的安装

基于直接设备情况,选择合适的torch版本,有显卡的建议安装GPU版本,可以通过nvidia-smi命令来查看显卡驱动的版本,在官网中根据cuda版本,选择合适的版本号,下面是安装示例代码
GPU:

pip install torch==2.5.0 torchvision==0.20.0 torchaudio==2.5.0 --index-url https://download.pytorch.org/whl/cu124

CPU:

pip install torch==2.5.0 torchvision==0.20.0 torchaudio==2.5.0 --index-url https://download.pytorch.org/whl/cpu

!!!,因为torch包很大,有3个G左右,下载时请选择稳定的网络环境,预防因网络波动导致安装失败。

二、tensor简述

PyTorch会将数据封装成张量(Tensor)进行计算,所谓张量就是元素为相同类型的多维矩阵。张量可以在 GPU 上加速运行。

2.1、概述

张量是一个多维数组,通俗来说可以看作是扩展了标量、向量、矩阵的更高维度的数组。张量的维度决定了它的形状(Shape),常见的张量有:

  • 标量:0阶张量;
  • 向量:1阶张量;
  • 矩阵:2阶张量;
  • 其他:例如高阶张量、图像、视频等复杂数据结构。

2.2、特点

  • 动态计算图
  • GPU支持
  • 自动微分

2.3、数据类型

PyTorch中有3种数据类型:浮点数、整数、布尔。其中,浮点数和整数又分为8位、16位、32位、64位,加起来共9种。

三、tensor创建---- torch.tensor:根据指定的数据创建张量。

3.1、标量

def th_touchs():# ? 创建一个一阶张量t1 = torch.tensor(5)print(t1.shape) # 打印张量的形状print(t1.dtype) # 打印张量的数据类型print(type(t1)) # 打印张量的类型

3.2、数组

# 数组
data = np.array([1, 2, 3, 4])
x = torch.tensor(data)
print(x)

3.3、列表

# 列表
data = [1,2,3,4]
x = torch.tensor(data)
print(x)

3.4、指定张量的数据类型

data = np.array([1, 2, 3, 4],dtype = int)
x = torch.tensor(data)
print(x)

3.5、指定张量的执行设备

data = np.array([1, 2, 3, 4],divice = "cuda")
x = torch.tensor(data)
print(x)

3.6、其他指定类型张量

"""
创建张量
"""
import torch# ! 创建线性张量
def test_linear():# 左闭右开区间,步长为2x = torch.arange(1, 10, 2)# print(x)#闭区间,自动等差步长y = torch.linspace(1, 10, 4)# print(y)# 等比数列,base表示指数,表示3^1~3^10取5个数z = torch.logspace(1, 10, 10,base=2)# print(z)# ! 创建随机张量
def test_tensor():# 设置随机数种子torch.manual_seed(123)# 获取当前随机数种子# print(torch.initial_seed())# 生成随机张量x = torch.rand(10, 5)# print(x)# 生成正太分布的随机张量y = torch.randn(2, 10)# print(y)# 自定义方差和均值z = torch.normal(mean=10, std=2, size=(2, 2))print(z)# ! 创建0/1张量
def test_zeros():# 创建指定形状的张量x = torch.zeros((4, 4), dtype=torch.int64)# print(x)# 从数据中构建张量,传入的容器只能是tensorx = torch.tensor([[1, 2, 3],[4, 5, 6]])x = torch.rand(3,3)x = torch.zeros_like(x)print(x)def test_ones():# 创建指定形状的张量x = torch.ones((4, 4), dtype=torch.int64)# print(x)# 从数据中构建张量,传入的容器只能是tensorx = torch.tensor([[1, 2, 3],[4, 5, 6]])x = torch.rand(3,3)x = torch.ones_like(x)print(x)# ! 创建指定值张量
def test_full():# 创建指定形状的张量x = torch.full((4, 4), fill_value=7)# print(x)# 从数据中构建张量,传入的容器只能是tensorx = torch.tensor([[1, 2, 3],[4, 5, 6]])x = torch.full_like(x, 11)print(x)# ! 创建单位矩阵张量
def test_eye():# 创建指定形状的张量x = torch.eye(4, 4)print(x)if __name__ == '__main__':test_linear()test_tensor()test_zeros()test_ones()test_full()test_eye()

tensor常用属性

"""
常见属性
"""import torchdef th_tensor():x = torch.tensor([1, 2, 3],device='cuda') # 指定创建到cuda/cpu的tensorprint(x.dtype) # 数据类型print(x.device)# tensor所在的设备,默认是cpuprint(x.shape) # 形状# 设备切换
def device_change():# 方式1# 将tensor创建在cuda设备上x = torch.tensor([1, 2, 3], device='cuda')# print(1,x.device)# 方式2# 先创建一个cpu上的tensorx = torch.tensor([1, 2, 3])# 将tensor移动到cuda设备上x = x.to('cuda:0')# print(2,x.device)# 通过api获取设备是否有cuda# 检查CUDA是否可用res = torch.cuda.is_available()print(res)# 条件判断c = 1 if 100>10 else 0print(c)# 根据CUDA可用性将tensor移动到cuda或cpu设备上x.to("cuda" if torch.cuda.is_available() else "cpu")print(x.device)# 方式3# 创建一个cpu上的tensorx = torch.tensor([1, 2, 3])print(x.device)# 把tensor移动到cuda上y = x.cuda()  # 把tensor移动到cuda上print(y.device)# 根据CUDA可用性将tensor移动到cuda或cpu设备上x = x.cuda() if torch.cuda.is_available() else x.cpu()# 类型转换
def type_convert():# 直接指定tensor的数据类型x = torch.tensor([1, 2, 3], dtype=torch.float64)print(x.dtype)# 通过type方法转换tensor的数据类型x  = x.type(torch.int8)print(x.dtype)# 通过half方法转换tensor的数据类型x = x.half()print(x.dtype)# 通过double方法转换tensor的数据类型x = x.double()print(x.dtype)# 通过float方法转换tensor的数据类型x = x.float()print(x.dtype)# 通过int方法转换tensor的数据类型x = x.int()print(x.dtype)if __name__ == '__main__':# print(th_tensor())# device_change()type_convert()

五、tensor数据类型转换

5.1、常规数据类型转换

import numpy as np
import torchdef th_data_np():x = torch.tensor([1, 2, 3])print(x)# 把Tensor转换为numpy数组x1 = x.numpy()print(x1)print(type(x1))# x 和x1 是两个不同的对象,但它们都指向同一个数据存储空间x1[0] = 100print(x)def th_data_copy():x = torch.tensor([1, 2, 3])print(x)# 把Tensor转换为numpy数组并copy,copy()不会改变原来的数据x1 = x.numpy().copy() # 注意这里是copy(深拷贝),还有一个view(浅拷贝)print(x1)print(type(x1))x1[0] = 100print(x)print(x1)def th_data_np_tensor():# np转tensor,不共用内存(浅拷贝)x = np.array([1, 2, 3])print(x)# 把numpy数组转换为Tensorx1 = torch.tensor(x)x[0] = 100x1[0] = 200print(x)print(x1)# from_numpy()会和原来的数组共享内存(深拷贝)x2 = np.array([1, 2, 3])x3 = torch.from_numpy(x2)x2[0] = 100x3[1] = 200print(x2)print(x3)if __name__ == '__main__':# th_data_np()# th_data_copy()th_data_np_tensor()

5.2、图片数据类型转换


from PIL import Image
import torch
from torchvision import transformsdef tensor_to_img():pass# ? 将图像转换为张量
def img_to_tensor():path = './data/1.png'img = Image.open(path)print(img)transfer = transforms.ToTensor()img_tensor = transfer(img)print(img_tensor.shape)# ? 将张量转换为图像
def test():# r = torch.rand(315,315)# g = torch.rand(315,315)# b = torch.rand(315,315)img_tensor = torch.rand(4,315,315)# print(img_tensor)# print(img_tensor.shape)# tensor转PIL对象transfer = transforms.ToPILImage()img = transfer(img_tensor)img.show()def test2():prth = r"./data/1.png"img = Image.open(prth)print(img)transfer = transforms.ToTensor()img_tensor = transfer(img)img_tensor[0] = 255tensor2pil = transforms.ToPILImage()img_pil = tensor2pil(img_tensor)img_pil.show()img_pil.save('./data/2.png')if __name__ == "__main__":# img_to_tensor(# test()test2()

六、tensor常见操作

6.1、获取元素

"""
从tensor中获取元素
"""import torchdef th_items():# 标量x = torch.tensor(1)print(x.item())# 一阶x = torch.tensor([100])print(x.item())# ! 如果输入的数据大于一个,会报错x = torch.tensor([1, 2])# print(x.item())if __name__ == '__main__':th_items()

6.2、元素值运算

"""
元素值运算
"""
import torchdef th_cction():torch.manual_seed(666)x = torch.randint(1, 10, (3, 3))print(x)# ? 加x1 = x.add(100)print(x1)# !带_结尾的函数,基本上都是在原数据进行操作x.add_(200)print(x)# ? 减x2 = x.sub(50)print(x2)x.sub_(40)print(x)# ? 乘x3 = x.mul(2)print(x3)x.mul_(2)print(x)# ? 除x4 = x.div(2)print(x4)x.div_(2)print(x)# ? 幂x5 = x.pow(2)print(x5)x.pow_(2)print(x)# ?x6 = x**2print(x6)if __name__ == '__main__':th_cction()

6.3、阿达玛积

"""
计算阿达玛积"""
import torchdef adama():x1 = torch.tensor([[1,2],[3,4]])x2 = torch.tensor([[1,2],[3,4]])#! Adama积矩阵形状必须相同x3 = x1 * x2print(x3)if __name__ == '__main__':adama()

6.4、相乘

"""
矩阵相乘
"""import torchdef dot():x1 = torch.tensor([[1,2],[3,4]])x2 = torch.tensor([[1,2],[3,4]])x3 = torch.matmul(x1, x2)x3 = x1.matmul(x2)x3 = x1 @ x2x3 = x1.mm(x2)print(x3)if __name__ == '__main__':dot()

6.5、索引

"""
索引
"""import torchdef index():# tensor 的布尔运算# torch.manual_seed(66)# x = torch.randint(0, 10, (5, 5))# print(x)# x1 = x > 7# print(x1)# x3 = x[x1]# print(x3)# print(x[x % 2 == 0])# 创建一个5x5的tensor作为示例数据x = torch.tensor([[2, 3, 2000, 10, 20],  # 满足条件:偶数,奇数,闰年[1, 2, 2001, 30, 40],  # 不满足条件:第一列是奇数[4, 5, 2004, 50, 60],  # 满足条件:偶数,奇数,闰年[3, 7, 1900, 70, 80],  # 不满足条件:第三列不是闰年(虽然能被4整除,但也能被100整除且不能被400整除)[6, 9, 1600, 90, 100]  # 满足条件:偶数,奇数,闰年])# 找出第一列是偶数,第二列是奇数,第三列是闰年的行中的第四列和第五列的数据print(x[(x[:, 0] % 2 == 0) & (x[:, 1] % 2 != 0) & ((x[:, 2] % 4 == 0) | (x[:, 2] % 400 == 0))][:, [3, 4]])# ? 索引赋值
def index_ass():torch.manual_seed(66)x = torch.randint(1,10,(5, 5))print(x)x1 = x[1,1]print(x1)x[1,1] = 100print(x)x[:,3] = 200print(x)x[:,:] = 300print(x)x.fill_(400)print(x)if __name__ == "__main__":# index()index_ass()

6.6、拼接

"""
拼接
"""import torch
from PIL import Image
from torchvision import transformsdef montage_cat():x = torch.randint(1, 10, (3,3))y = torch.randint(1, 10, (3,3))print(x)print(y)# cat():不会增加维度# 拼接,dim=0:按行拼接,dim=1:按列拼接z = torch.cat([x, y], dim=0)print(z)def montage_stack():torch.manual_seed(66)x = torch.randint(1, 10, (3,3))y = torch.randint(1, 10, (3,3))# print(x)# print(y)# ! stack():会增加维度(张量级别)# ! 堆叠,dim=0:按行堆叠,dim=1:按列堆叠# ! 要堆叠的张量必须具有相同的形状z = torch.stack([x, y],dim=1)print(z)def montage_img():# 加载本地图像为PILimg = Image.open('./data/1.png')transfer = transforms.ToTensor()img_tensor = transfer(img)# print(img_tensor)# print(img_tensor.shape)res = torch.stack([img_tensor[0], img_tensor[1],img_tensor[2]], dim=0)if __name__ == '__main__':# montage_cat()# montage_stack()montage_img()

6.7、形状

"""
形状操作
"""import torchdef th_reshape():x = torch.reshape(x, (-1, 5))x1 = torch.reshape(x, (2, 6))print(x)x2 = torch.reshape(x, (2, 3, 2))print(x2)def th_view():x = torch.randint(1, 10,(4, 3))# print(x)# !改变形状,由于没有改变原x中的内存空间,因此改变形状操作比reshape快x1 = x.view((2, 6))# print(x1)# x2 = torch.randit(1, 10,(4, 3))# # x3 = torch.reshape(x2, (2, 6))# x4 = x2.t() # 转置矩阵# print(x4)# # !改变形状,在内存中不连续的数据不能通过view转换# x5 = x4.view(2,6)# print(x5)# ! 改变形状后,是否共享数据内存x6 = torch.randint(1, 10, (4, 3))x7 = x6.view(2, 6)x6[1,1] = 999print(x6)print(x7)# ? 改变维度0
def rh_transpose():x1 = torch.randint(1, 10, (4, 3))print(x1,x1.shape)# ! transpose(x, dim0, dim1), 交换两个维度x2 = torch.transpose(x1, 0, 1)print(x2,x2.shape)# ? 改变维度1
def th_permute():x1 = torch.randint(0, 255, (3, 512,360))print(x1.shape)x2 = x1.permute(1, 2, 0)print(x2.shape)# ? 改变为1维
def th_flatten():x1 = torch.randint(0, 255, (4, 3))# print(x1)x2 = x1.flatten()# print(x2)x3 = torch.randint(0, 255, (3, 4, 2, 2))print(x3)x4 = x3.flatten(start_dim=1, end_dim=-1)print(x4)# ? 数据升维
def th_unsqueeze():x1 = torch.randint(0, 255, (4, 3))print(x1)# ! 0,表示在0处插入一个维度x2 = x1.unsqueeze(0)print(x2.shape)# ? 数据降维
def th_squeeze():x1 = torch.randint(0, 255, (1, 4, 3, 1))print(x1)x2 = x1.squeeze()print(x2)x3 = x1.squeeze(0).squeeze(-1)print(x3)# ? 数据分割
def th_split():x1 = torch.randint(0, 255, (4, 3))print(x1)# ! split(),表示每个tensor有2行x2, x3 = torch.split(x1, 2)# print(x2, x3)# ! chunk(),表示将数据分割成多少份x4 = torch.chunk(x1, 4)print(x4)# ? 广播
def th_broadcast():a = torch.arange(1, 13).reshape(3, 4)b = torch.arange(1, 5)c = a + bif __name__ == '__main__':# th_reshape()# th_view()# rh_transpose()# th_permute()# th_flatten()# th_unsqueeze()# th_squeeze()# th_split()th_broadcast()
```

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

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

相关文章

vue学习11.21

vue特点: 采用组件化开发,提高代码复用率和维护 声明式编码,不需要直接操作DOM元素 使用diff算法,把虚拟DOM变成真实DOM, 如果两个容器都用vue的实例,只选最上面的容器。 一个容器使用两个vue实例也不行…

【数据分享】中国汽车工业年鉴(1986-2023)

本年鉴是由工业和信息化部指导,中国汽车技术研究中心有限公司与中国汽车工业协会联合主办。《年鉴》是全面、客观记载中国汽车工业发展与改革历程的重要文献,内容涵盖汽车产业政策、标准、企业、市场以及全国各省市汽车工业发展情况,并调查汇…

Java项目实战II基于微信小程序的南宁周边乡村游平台(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着城市化…

深入理解Redis(七)----Redis实现分布式锁

基于Redis的实现方式 1、选用Redis实现分布式锁原因: (1)Redis有很高的性能; (2)Redis命令对此支持较好,实现起来比较方便 2、使用命令介绍: (1)SETNX SETNX …

如何创建一个项目用于研究element-plus的原理

需求:直接使用element-plus未封装成组件的源码,创建一个项目,可以使用任意的element-plus组件,可以深度研究组件的运行。例如研究某一个效果,如果直接在node_modules修改elment-plus打包之后的那些js、mjs代码&#xf…

SQL进阶技巧:如何进行数字范围统计?| 货场剩余货位的统计查询方法

目录 0 场景描述 1 剩余空位区间和剩余空位编号统计分析 2 查找已用货位区间 3 小结 0 场景描述 这是在做一个大型货场租赁系统时遇到的问题,在计算货场剩余存储空间时,不仅仅需要知道哪些货位是空闲的,还要能够判断出哪些货位之间是连…

菜鸟驿站二维码/一维码 取件识别功能

特别注意需要引入 库文 ZXing 可跳转: 记录【WinForm】C#学习使用ZXing.Net生成条码过程_c# zxing-CSDN博客 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.…

2024年亚太地区数学建模大赛D题-探索量子加速人工智能的前沿领域

量子计算在解决复杂问题和处理大规模数据集方面具有巨大的潜力,远远超过了经典计算机的能力。当与人工智能(AI)集成时,量子计算可以带来革命性的突破。它的并行处理能力能够在更短的时间内解决更复杂的问题,这对优化和…

教程 - 在 Creo Elements/Pro 中使用 Mechanica 分析杆的 von-mises 应力?

这是教程。 步骤1: 在“零件”模式下启动 Creo Elements/Pro。 步骤2: 草绘>>顶平面并绘制一个直径为 20mm 的圆。 步骤3: 将其挤出 200 毫米。 步骤4: 应用>>机械. 步骤5: 单击“确定”&…

ssm框架-spring-spring声明式事务

声明式事务概念 声明式事务是指使用注解或 XML 配置的方式来控制事务的提交和回滚。 开发者只需要添加配置即可, 具体事务的实现由第三方框架实现,避免我们直接进行事务操作! 使用声明式事务可以将事务的控制和业务逻辑分离开来,提…

基于单片机的多功能跑步机控制系统

本设计基于单片机的一种多功能跑步机控制系统。该系统以STM32单片机为主控制器,由七个电路模块组成,分别是:单片机模块、电机控制模块、心率检测模块、音乐播放模块、液晶显示模块、语音控制模块、电源模块。其中,单片机模块是整个…

写给Vue2使用者的Vue3学习笔记

&#x1f64b;‍请注意&#xff0c;由于本人项目中引入了unplugin-auto-import的依赖&#xff0c;所以所有的代码示例中均未手动引入各种依赖库&#xff08;ref、reactive、useRouter等等&#xff09; 初始环境搭建 npm init vuelatest模板语法 插值 同 Vue2 <span>…

C# 数据结构之【图】C#图

1. 图的概念 图是一种重要的数据结构&#xff0c;用于表示节点&#xff08;顶点&#xff09;之间的关系。图由一组顶点和连接这些顶点的边组成。图可以是有向的&#xff08;边有方向&#xff09;或无向的&#xff08;边没有方向&#xff09;&#xff0c;可以是加权的&#xff…

短剧系统小程序开发产品设计实例解析

短剧系统小程序开发架构深度解析引言 随着数字娱乐市场的蓬勃发展&#xff0c;短剧因其紧凑的情节、创新的表现形式和便捷的观看体验&#xff0c;迅速吸引了大量观众的关注。作为承载短剧内容的重要平台&#xff0c;短剧系统小程序不仅需要在用户体验、内容管理等方面做到极致&…

AI数字人视频小程序:引领未来互动新潮流

当下&#xff0c;随着人工智能技术的不断创新发展&#xff0c;各类AI系统已经成为了创新市场发展的重要力量&#xff0c;AI文案、AI数字人、AI视频等&#xff0c;为大众带来更加便捷的创作方式&#xff0c;AI成为了一个全新的风口&#xff0c;各种AI红利持续释放&#xff0c;市…

解决vue-pdf的签章不显示问题

在使用vue-pdf 4.3.0时发现上传一般的普通pdf正常预览&#xff0c;但是上传带有红头文件的和和特殊字体的pdf无法正常内容显示&#xff0c;文字丢失问题。 1、查看控制台报错信息 2、缺少字体原因 getNumPages(url) {var loadingTask pdf.createLoadingTask({url: url,//引入…

跨境电商API接口:数据采集与业务集成的核心

跨境电商作为全球贸易的重要组成部分&#xff0c;正随着互联网技术的发展而迅速增长。在这个过程中&#xff0c;API接口扮演了至关重要的角色&#xff0c;它们不仅提高了运营效率&#xff0c;还增强了安全性和用户体验。本文将深入探讨跨境电商API接口的应用、重要性以及面临的…

【linux013】文件操作命令篇 - less 命令

文章目录 less 命令1、基本用法2、常见选项3、交互式键盘命令4、举例5、注意事项 less 命令 less 是 Linux 中强大的文件分页查看命令&#xff0c;比 more 更灵活且功能更强大。less 支持双向滚动、搜索、显示大文件等功能&#xff0c;适用于查看文件内容或管道输出的大量文本…

力扣 无重复字符的最长字串-3

无重复字符的最长字串-3 class Solution { public:// 解决方法&#xff1a;双指针int lengthOfLongestSubstring(string s) { // 如果字符串为空&#xff0c;直接返回0if (s.length() 0)return 0;// 如果字符串不为空&#xff0c;字符串每个字符都不同的情况下&#xff0c;最…

如何在Ubuntu当中利用CloudCompare软件进行点云配准拼接?

1.首先需要安装相应的cloudcompare软件&#xff0c;以下有两种方式&#xff1a;第一种直接在ubuntu的软件商店里搜索CloudCompare软件进行install&#xff0c;我这里已经安装完毕。 方式二&#xff1a;可以直接原码安装&#xff1a; github地址&#xff1a; https://github.co…