2024-11-21 学习人工智能的Day29 初见深度学习

深度学习前置

Pytorch

​ Pytorch是基于python的深度学习框架,被广泛应用在计算机视觉、自然语言处理、语音识别等领域。PyTorch提供了许多高级功能,如**自动微分(automatic differentiation)、自动求导(automatic gradients)**等,这些功能可以帮助我们更好地理解模型的训练过程,并提高模型训练效率。

​ 除了Pytorch,还有其他很多的框架,比如耳熟的TensorFlow,由Google开发。PaddlePaddle由百度推出。这两个都是非常常用的开发框架,而使用Pytorch的原因也是因为Pytorch在教育方面Pytorch的使用非常的广泛。

​ 然后就是安装,安装的话会根据是否有nvidia显卡来区分,因为如果是A卡或者是I卡的可能不是那样的适配,需要使用其他方法才能够调用Gpu,而N卡是直接适配Pytorch的,只需要下载对应cuda版本的torch和配套的工具包就行了。

​ 网络上有很多的方法,例如从安装cuda到cudnn最后到pytorch,但实际现在主流的带有独立显卡的笔记本或者电脑都会安装这两个东西,可以在cmd控制台中通过

nvidia-smi

进行cuda版本的查看,再去确认此cuda版本能够兼容的torch,最后在创建的虚拟环境中去安装的torch,而众所周知,目前国内能用的安装源只有阿里的源能够使用了。所以贴出下面链接给未能够成功下载GPU版本torch的同学指条路。

pytorch GPU国内镜像下载

这里唯一需要注意的是先确定自己的cuda版本,下载支持版本的torch,在下载指令最后的cu118哪里将118改为支持的版本,例如cu121这种。

Tensor的概述

​ 想之前学的Opencv一样,torch也有指定的操作数据格式,之前Opevncv中,大多是数据都是被转为了ndarray来进行处理,而这里的torch这是会将数据封装成张量(Tensor)进行计算,所谓张量就是元素为相同类型的多维矩阵,张量是可以在GPU上加速运行的,人话说就是GPU运算比CPU快,也是为什么要安装GPU版的原因。

​ Pytorch中有三种数据类型:浮点数、整数、布尔。其中、浮点和整数又分为了8位、16位、32位、64位。

Tensor的创建

最基本的方式

import torch
import numpy as np# torch.tensor
def test01():# 1. 用标量创建张量shape0 = torch.tensor(5)print(shape0,shape0.shape)# 2. 用numpy数组创建data = np.random.randint(3,4)data = torch.tensor(data)print(data,data.shape,data.device)# 3. 根据list创建data = [[1,2,3,4],[5,6,7,8]]data = torch.tensor(data)print(data,data.shape,data.dtype)# torch.Tensor
def test002():# 1. 根据形状创建张量tensor1 = torch.Tensor(2, 3)print(tensor1)# 2. 也可以是具体的值tensor2 = torch.Tensor([[1, 2, 3], [4, 5, 6]])print(tensor2, tensor2.shape, tensor2.dtype)tensor3 = torch.Tensor([10])print(tensor3, tensor3.shape, tensor3.dtype)# torch.IntTensor
def test003():# 1. 创建指定类型的张量tt1 = torch.IntTensor(2, 3)print(tt1)tt2 = torch.FloatTensor(3, 3)print(tt2, tt2.dtype)tt3 = torch.DoubleTensor(3, 3)print(tt3, tt3.dtype)tt4 = torch.LongTensor(3, 3)print(tt4, tt4.dtype)tt5 = torch.ShortTensor(3, 3)print(tt5, tt5.dtype)if __name__ == "__main__":test01()#test002()#test003()	

创建线性和随机张量

import torch
import numpy as np# 不用科学计数法打印
torch.set_printoptions(sci_mode=False)# 创建线性张量
def test004():# 1. 创建线性张量r1 = torch.arange(0, 10, 2)print(r1)# 2. 在指定空间按照元素个数生成张量:等差r2 = torch.linspace(3, 10, 10)print(r2)# 3. 在指定空间按照元素个数生成张量:等比r3 = torch.logspace(3, 10, 5, base=2)#在2^3到2^10之间均匀生成5个数 base默认为10print(r3)# 随机种子
def test005():# 设置随机数种子torch.manual_seed(123)# 获取随机数种子print(torch.initial_seed())# 随机张量
def test006():# 1. 设置随机数种子torch.manual_seed(123)# 2. 获取随机数种子print(torch.initial_seed())# 3. 生成随机张量print(torch.rand(2, 3))# 4. 生成随机张量:标准正态分布print(torch.randn(2, 3))# 5. 原生服从正态分布:均值为2, 方差为3,形状为1*4的正态分布print(torch.normal(mean=2, std=3, size=(1, 4)))if __name__ == "__main__":test004()#test005()#test006()

创建01张量

import torch
import numpy as np# 创建全0张量
def test001():# 创建全0张量data = torch.zeros(2, 3)print(data, data.dtype)mask = np.ones((3, 4))print(mask)data = torch.zeros_like(torch.tensor(mask))print(data)# 创建全1变量,其实就是将zeros改为ones
def test002():# 创建全1张量data = torch.ones(2, 3)print(data, data.dtype)mask = np.zeros((3, 4))print(mask)data = torch.ones_like(torch.tensor(mask))print(data)# 比较实用的指定值张量
def test003():# 创建指定值的张量data = torch.full((2, 3), 666.0)print(data, data.dtype)mask = np.zeros((3, 4))data = torch.full_like(torch.tensor(mask), 999)print(data)# 最后是单位矩阵张量def test004():data = torch.eye(4)print(data)if __name__ == "__main__":test001()#test002()#test003()#test004()

张量的属性

import torch# 获取属性
def test001():data = torch.tensor([1, 2, 3])print(data.dtype, data.device, data.shape)# 切换设备
def test002():data = torch.tensor([1, 2, 3])print(data.dtype, data.device, data.shape)# 把数据切换到GPU进行运算device = "cuda" if torch.cuda.is_available() else "cpu"data = data.to(device)print(data.device)#类型转换
def test003():data = torch.tensor([1, 2, 3])print(data.dtype)  # torch.int64# 1. 使用type进行类型转换data = data.type(torch.float32)print(data.dtype)  # float32data = data.type(torch.float16)print(data.dtype)  # float16# 2. 使用类型方法data = data.float()print(data.dtype)  # float32data = data.half()print(data.dtype)  # float16data = data.double()print(data.dtype)  # float64data = data.long()print(data.dtype)  # int64if __name__ == "__main__":test001()#test002()#test003()

Tensor数据转换

tensor和numpy

import torch
import numpy as np# 张量转numpy 浅拷贝
def test001():# 1. 张量转numpydata_tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])data_numpy = data_tensor.numpy()print(type(data_tensor), type(data_numpy))# 2. 他们内存是共享的data_numpy[0, 0] = 100print(data_tensor, data_numpy)# 张量转numpy 深拷贝
def test002():# 1. 张量转numpydata_tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])# 2. 使用copy()避免内存共享data_numpy = data_tensor.numpy().copy()print(type(data_tensor), type(data_numpy))# 3. 此时他们内存是不共享的data_numpy[0, 0] = 100print(data_tensor, data_numpy)# numpy转张量 浅拷贝
def test003():# 1. numpy转张量data_numpy = np.array([[1, 2, 3], [4, 5, 6]])data_tensor = torch.from_numpy(data_numpy)print(type(data_tensor), type(data_numpy))# 2. 他们内存是共享的data_tensor[0, 0] = 100print(data_tensor, data_numpy)# numpy转张量 深拷贝    
def test004():# 1. numpy转张量data_numpy = np.array([[1, 2, 3], [4, 5, 6]])data_tensor = torch.tensor(data_numpy)print(type(data_tensor), type(data_numpy))# 2. 内存是不共享的data_tensor[0, 0] = 100print(data_tensor, data_numpy)if __name__ == "__main__":test001()#test002()#test003()#test004()

tensor和图像

import torch
from PIL import Image
from torchvision import transforms# 图片转Tensor
def test001():imgpath = r"./105429.jpg"# 1. 读取图片img = Image.open(imgpath)# 使用transforms.ToTensor()将图片转换为张量transform = transforms.ToTensor()img_tensor = transform(img)print(img_tensor)# Tensor转图片
def test002():# 1. 随机一个数据表示图片img_tensor = torch.randn(3, 224, 224)# 2. 创建一个transformstransform = transforms.ToPILImage()# 3. 转换为图片img = transform(img_tensor)img.show()# 4. 保存图片img.save("./test.jpg")# 图像处理
def test003():# 指定读取的文件路径imgpath = r"./105429.jpg"# 加载图片img = Image.open(imgpath)# 图像转为Tensortransform = transforms.ToTensor()img_tensor = transform(img)# 去掉透明度值print(img_tensor.shape)# 检查CUDA是否可用并将tensor移至CUDAif torch.cuda.is_available():img_tensor = img_tensor.cuda()print(img_tensor.device)# 修改每个像素值img_tensor += 0.2# 将tensor移回CPU并转换回PIL图像img_tensor = img_tensor.cpu()transform = transforms.ToPILImage()img = transform(img_tensor)# 保存图像img.save("./ok.png")if __name__ == "__main__":test001()#test002()#test003()

Tensor操作

元素操作

import torch# 获取元素值
def test001():data = torch.tensor([18])print(data.item())pass# 元素值运算
def test002():data = torch.randint(0, 10, (2, 3))print(data)# 元素级别的加减乘除:不修改原始值print(data.add(1))print(data.sub(1))print(data.mul(2))print(data.div(3))print(data.pow(2))# 元素级别的加减乘除:修改原始值data = data.float()data.add_(1)data.sub_(1)data.mul_(2)data.div_(3.0)data.pow_(2)print(data)# 阿达玛积 就是矩阵对应位置的乘法
def test003():data1 = torch.tensor([[1, 2, 3], [4, 5, 6]])data2 = torch.tensor([[2, 3, 4], [2, 2, 3]])print(data1 * data2)def test004():data1 = torch.tensor([[1, 2, 3], [4, 5, 6]])data2 = torch.tensor([[2, 3, 4], [2, 2, 3]])print(data1.mul(data2))# Tensor相乘
def test005():data1 = torch.tensor([[1, 2, 3], [4, 5, 6]])data2 = torch.tensor([[3, 2], [2, 3], [5, 3]])print(data1 @ data2)print(data1.matmul(data2))print(data1.mm(data2))if __name__ == "__main__":test001()#test002()#test003()#test004()#test005()

索引操作

import torch# 简单索引
def test001():data = torch.randint(0, 10, (3, 4))print(data)# 1. 行索引print("行索引:", data[0])# 2. 列索引print("列索引:", data[:, 0])# 3. 固定位置索引:2种方式都行print("索引:", data[0, 0], data[0][0])# 列表索引
def test002():data = torch.randint(0, 10, (3, 4))print(data)# 1. 使用列表进行索引:(0, 0), (1, 1), (2, 1)print("列表索引:", data[[0, 1, 2], [0, 1, 1]])# 2. 行级别的列表索引print("行级别列表索引:", data[[[2], [1]], [0, 1, 2]])# 布尔索引  多条件索引最好的方式就是将条件分开简化后用单变量表示
def test003():data = torch.randint(0, 10, (3, 4))print(data)# 1. 索引第3个元素大于3的所有行print(data[data[:, 2] > 3])# 2. 索引第3行 值大于3 的所有的元素 所在的列print(data[:, data[2] > 3])# 3. 第二列是偶数, 且第一列大于6的行print(data[(data[:, 1] % 2 == 0) & (data[:, 0] > 6)])# 索引赋值   
def test004():data = torch.eye(4)print(data)# 赋值data[:, 1:-1] = 0print(data)    if __name__ == "__main__":test001()

张量拼接

import torch# cat 直接在维度上拼接,类似于numpy中的hstack或者vstack
def test001():tensor1 = torch.tensor([[1, 2, 3], [4, 5, 6]])tensor2 = torch.tensor([[7, 8, 9], [10, 11, 12]])# 1. 在指定的维度上进行拼接:0print(torch.cat([tensor1, tensor2], dim=0))# 输出:# tensor([[ 1,  2,  3],#         [ 4,  5,  6],#         [ 7,  8,  9],#         [10, 11, 12]])# 2. 在指定的维度上进行拼接:1print(torch.cat([tensor1, tensor2], dim=1))# 输出:# tensor([[ 1,  2,  3,  7,  8,  9],#         [ 4,  5,  6, 10, 11, 12]])# 需要注意的是,拼接的张量在所有的维度上的大小都必须相同# torch.stack 将指定维度的数据进行拼接,会导致数据升维
def test002():tensor1 = torch.tensor([[1, 2, 3], [4, 5, 6]])tensor2 = torch.tensor([[7, 8, 9], [10, 11, 12]])# 1. 沿新创建的第0维度堆叠:从第一层开始一人出一个数据 堆叠print(torch.stack([tensor1, tensor2], dim=0)) # 输出:# tensor([[[ 1,  2,  3],#          [ 4,  5,  6]],#         [[ 7,  8,  9],#          [10, 11, 12]]])# 2. 沿新创建的第1维度堆叠:从第二层开始一人出一个数据 堆叠print(torch.stack([tensor1, tensor2], dim=1))# 输出:# tensor([[[ 1,  2,  3],#          [ 7,  8,  9]],#         [[ 4,  5,  6],#          [10, 11, 12]]])# 2. 沿新创建的第2维度堆叠:从第三层开始一人出一个数据 堆叠	print(torch.stack([tensor1, tensor2], dim=2))if __name__ == "__main__":test001()

形状操作

reshape和view

reshape是将张量转换为不同的形状,但是转换后的形状的元素数量与原张量相同。

import torch# reshape
def test001():data = torch.randint(0, 10, (4, 3))print(data)# 1. 使用reshape改变形状data = data.reshape(2, 2, 3)print(data)# 2. 使用-1表示自动计算data = data.reshape(2, -1)print(data)if __name__ == "__main__":test001()

view进行形状变换的特征:

1、张量在内存中是连续的;

2、返回的是原始张量视图,不重新分配内存,效率更高;

3、如果张量在内存中不连续,view 将无法执行,并抛出错误。

# 对内存连续性进行实验
import torchdef test001():tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])print("正常情况下的张量:", tensor.is_contiguous())# 对张量进行转置操作tensor = tensor.t()print("转置操作的张量:", tensor.is_contiguous())print(tensor)# 此时使用view进行变形操作tensor = tensor.view(2, -1)print(tensor)if __name__ == "__main__":test001()

transpose&permute&flatten

import torch# transpose的作用的交换张量的两个维度,而它返回的是原张量的视图
def test001():data = torch.randint(0, 10, (3, 4, 5))print(data, data.shape)# 使用transpose进行形状变换transpose_data = data.transpose(0, 1)print(transpose_data, transpose_data.shape)# permute 用于改变张量的所有维度顺序。与 transpose 类似,但它可以交换多个维度。
def test002():data = torch.randint(0, 10, (3, 4, 5))print(data, data.shape)# 使用permute进行多维度形状变换permute_data = data.permute(1, 2, 0)print(permute_data, permute_data.shape)# flatten 用于将张量展平为一维向量。
# flatten参数start_dim:从哪个维度开始展平
# end_dim:在哪个维度结束展平。默认值为-1,表示展平到最后一个维度。
def test003():data = torch.randint(0, 10, (3, 4, 5))# 展平flatten_data = data.flatten(1, -1)print(flatten_data)if __name__ == "__main__":test001()

升维和降维

import torch# squeeze :用于移除所有大小为 1 的维度,或者移除指定维度的大小为 1 的维度。
def test001():data = torch.randint(0, 10, (1, 4, 5, 1))print(data, data.shape)# 进行降维操作data = data.squeeze(0).squeeze(-1)print(data.shape)# unsqueeze:用于在指定位置插入一个大小为 1 的新维度。
def test002():data = torch.randint(0, 10, (32, 32, 3))print(data.shape)# 升维操作data = data.unsqueeze(0)print(data.shape)if __name__ == "__main__":test001()

到这里今天的内容就结束了,今天主要讲的还是Pytorch最基础的部分,包括这下常用api的使用等。

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

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

相关文章

实验室管理现代化:Spring Boot技术方案

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…

2.langchain中的prompt模板 (FewShotPromptTemplate)

本教程将介绍如何使用 LangChain 库中的 PromptTemplate 和 FewShotPromptTemplate 来构建和运行提示(prompt),并通过示例数据展示其应用。 安装依赖 首先,确保你已经安装了 langchain 和相关依赖: pip install lan…

如何在 Microsoft Edge 中设置代理: 快速而简单的方法

你知道在 Microsoft Edge 中设置代理可以大大提升浏览体验吗?无论您是想提高隐私保护、访问受地理位置限制的内容,还是想更高效地浏览网页,代理服务器都能改变一切。 本指南将介绍如何在 Microsoft Edge 中设置代理,解决常见的代…

【机器学习】近似分布的熵到底是p(x)lnq(x)还是q(x)lnq(x)?

【1】通信的定义 信息量(Information Content)是信息论中的一个核心概念,用于定量描述一个事件发生时所提供的“信息”的多少。它通常用随机变量 𝑥的概率分布来定义。事件 𝑥发生所携带的信息量由公式给出&#xff1…

Excel如何批量导入图片

这篇文章将介绍在Excel中如何根据某列数据,批量的导入与之匹配的图片。 准备工作 如图,我们准备了一张员工信息表以及几张员工的照片 可以看到,照片名称是每个人的名字,与Excel表中的B列(姓名)对应 的卢易…

【操作系统】操作系统的特征

操作系统的七个基本特征 并发性(Concurrence) 并发性是指操作系统在同一时间间隔内执行和调度多个程序的能力,提高资源利用率和系统效率。尽管多个任务可能在同一时刻看似同时进行,但实际上,CPU在多个任务之间快速切…

iPhone 17 Air看点汇总:薄至6mm 刷新苹果轻薄纪录

我们姑且将这款iPhone 17序列的超薄SKU称为“iPhone 17 Air”,Jeff Pu在报告中提到,我同意最近关于 iPhone 17超薄机型采用6 毫米厚度超薄设计的传言。 如果这一测量结果被证明是准确的,那么将有几个值得注意的方面。 首先,iPhone…

springboot嗨玩旅游网站

摘 要 嗨玩旅游网站是一个专为旅行爱好者打造的在线平台。我们提供丰富多样的旅游目的地信息,包括景点信息、旅游线路、商品信息、社区信息、活动推广等,帮助用户轻松规划行程。嗨玩旅游网站致力于为用户提供便捷、实用的旅行服务,让每一次旅…

LLM学习笔记(2)会话补全Chat Completions、什么是JSON?

什么是会话补全Chat Completions? 功能目标:处理多轮对话。 它模拟对话的逻辑,比如聊天机器人对用户消息的回应。使用的模型主要是针对对话型应用优化的模型,例如gpt-3.5-turbo或gpt-4。 什么是JSON? JSON 本质上是…

C++和js对比

1. 变量定义 C&#xff1a; #include <iostream> int main() {// 定义整型变量int num 10;// 定义浮点型变量double pi 3.14159;// 定义字符型变量char ch A;std::cout << "num: " << num << ", pi: " << pi << &…

SpringBoot与MongoDB深度整合及应用案例

SpringBoot与MongoDB深度整合及应用案例 在当今快速发展的软件开发领域&#xff0c;NoSQL数据库因其灵活性和可扩展性而变得越来越流行。MongoDB&#xff0c;作为一款领先的NoSQL数据库&#xff0c;以其文档导向的存储模型和强大的查询能力脱颖而出。本文将为您提供一个全方位…

潜水打捞系统的功能概率和使用方法_深圳鼎跃

潜水打捞系统是用于帮助打捞沉物&#xff0c;提供足够的浮力支持&#xff0c;确保沉物从水底浮升到水面。它是一种高强度的袋状结构&#xff0c;能够在水下提供调节浮力的功能&#xff0c;广泛应用于水下打捞、海上救援、沉船打捞等领域。 一、功能概述 潜水打捞系统主要功能为…

网络互助在中国 共筑健康保障新生态

在数字化的浪潮中,网络互助行业以其独特的普惠价值和发展潜力,迅速在中国的健康保障领域崭露头角。网络互助行业以其低门槛、普惠性特点,有效缓解了中低收入人群大病医疗资金的压力,避免了因病致贫的风险。据艾媒咨询数据显示,2019年中国网络互助行业救助总人数超过3万人,救助总…

linux:python2.7.x升级至3.13.0详细记录(含踩坑内容)

部署linux系统默认2.7.x环境&#xff0c;但是有些项目部署需3.x以上&#xff0c;由于低版本也存在高风险漏洞&#xff0c; 查看openSSL版本信息 高于1.1.1 直接安装即可 [rootlocalhost ~]# openssl version OpenSSL 1.1.1f 31 Mar 2020 [rootlocalhost ~]#直接安装python3…

SpringMVC接收请求参数

&#xff08;5&#xff09;请求参数》五种普通参数 1.普通参数 代码块 RequestMapping("/commonParam") ResponseBody public String commonParam(String name,int age){System.out.println("普通参数传递 name > "name);System.out.println("普通…

洛谷P1597

语句解析 - 洛谷 语句解析 题目背景 木有背景…… 题目描述 一串长度不超过255的 PASCAL 语言代码&#xff0c;只有 a,b,c 三个变量&#xff0c;而且只有赋值语句&#xff0c;赋值只能是一个一位的数字或一个变量&#xff0c;每条赋值语句的格式是 [变量]:[变量或一位整数…

CPU 内存加压工具 stress-ng 介绍

01 文章背景介绍 在实车测试时&#xff0c;除了感知算法外&#xff0c;往往还会有别的 APP 在同时运行&#xff0c;从而挤压算法的资源占用&#xff0c;影响模型性能&#xff0c;降低部署效果。因此在项目早期做板端验证的时候&#xff0c;我们就可以使用一些工具对 CPU 和内存…

(C语言)文件操作

目录 文件 程序文件 数据文件 文件名 ​编辑数据文件的分类 文件的打开和关闭 流 标准流 1&#xff09;stdin 2&#xff09;stdout 3&#xff09;stderr 文件指针 文件的打开和关闭 对文件内容操作的函数 1&#xff09;fgetc&#xff0c;fputc 2&#xff09;fp…

低代码开发平台搭建思考与实战

什么是低代码开发平台&#xff1f; 低代码开发平台是一种平台软件&#xff0c;人们能通过它提供的图形化配置功能&#xff0c;快速配置出满足各种特定业务需求的功能软件。 具有以下特点&#xff1a; 提供可视化界面进行程序开发0代码或少量代码快速生成应用 什么是低代码产…

Axure设计之日期时间范围选择器

在产品设计和原型制作过程中&#xff0c;日期时间范围选择器是一个常见的需求。Axure作为一个强大的原型设计工具&#xff0c;能够帮助我们快速实现这一功能。通过利用Axure的动态面板、中继器、文本框、按钮以及时间函数&#xff0c;我们可以轻松制作一个功能完备的日期时间范…