深度学习之张量(Tensor)的创建、常见属性及数据转换

news2024/11/15 10:00:16

基本概念

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

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

  • 标量 是 0 维张量,向量 是 1 维张量,矩阵 是 2 维张量

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

创建Tensor

创建tensor的函数中有两个有默认值的参数dtype和device, 分别代表数据类型和计算设备

根据指定的数据创建张量

import torch
import numpy as np
#tensor是小写

def test():
    #标量创建张量
    a=torch.tensor(2)
    print(a,a.shape)
    print("--------------")

    #numpy数组创建张量
    b=np.random.randn(0,1)
    b=torch.tensor(b)
    print(b,b.shape,b.device)
    print("--------------")

    #list创建张量
    c=[[1,2,3],[4,5,6]]
    c=torch.tensor(c)
    print(c,c.shape,c.dtype)
    print("--------------")

    pass


if __name__=="__main__":
    test()

根据形状创建张量,也可用来创建指定数据的张量。

import torch
#Tensor为大写

def task():

    a=torch.Tensor(3,3)
    print(a)
    print("---------------")


    b=torch.Tensor([[1,2,3],[4,5,6]])
    print(b,b.shape,b.dtype)
    print("---------------")

    c=torch.Tensor([10])
    print(c,c.shape,c.dtype)
    print("---------------")
    
    pass
    
if __name__=="__main__":
    task()

创建指定类型的张量

import torch

def task():

    a=torch.IntTensor(3,3)
    print(a)
    print("---------------")

    b=torch.FloatTensor(3,3)
    print(b,b.dtype)
    print("---------------")

    c=torch.DoubleTensor(3,3)
    print(c,c.dtype)
    print("---------------")

    d=torch.LongTensor(3,3)
    print(d,d.dtype)
    print("---------------")

    e=torch.ShortTensor(3,3)
    print(e,e.dtype)
    print("---------------")

    pass
    
if __name__=="__main__":
    task()

创建线性和随机张量

线性张量

import torch

def task():

    a=torch.arange(1,9,3)
    print(a)
    print("---------------")

    b=torch.linspace(5,20,4)
    print(b)
    print("---------------")

    c=torch.logspace(1,3,2,base=4)
    #在4的1次方到4的3次方生成间隔均匀的两个数
    print(c)
    print("---------------")

    pass
    
if __name__=="__main__":
    task()

随机张量

import torch


def task():
    #设置随机数种子
    torch.manual_seed(100)
    #获取随机数种子
    print(torch.initial_seed())
    print("---------------")
    #生成随机张量
    print(torch.rand(3,3))
    print("---------------")
    #生成随机张量:标准正态分布
    print(torch.randn(3,3))
    print("---------------")
    # 原生服从正态分布:均值为5, 方差为20,形状为3*3的正态分布
    print(torch.normal(mean=5,std=20,size=(3,3)))

    pass
    
if __name__=="__main__":
    task()

注:不设置随机种子时,每次打印的结果不一样。

创建 0、1、单位矩阵、指定值张量

创建全0张量

import torch
import numpy as np

def task():
    #创建全0张量
    a=torch.zeros(3,3)
    print(a,a.dtype)
    print("---------------")
    b=np.ones((3,3))
    print(b)
    print("---------------")
    c=torch.zeros_like(torch.tensor(b))
    print(c)
    pass
    
if __name__=="__main__":
    task()

创建全1张量

import torch
import numpy as np

def task():
    #创建全1张量
    a=torch.ones(3,3)
    print(a,a.dtype)
    print("---------------")
    b=np.zeros((3,3))
    print(b)
    print("---------------")
    c=torch.ones_like(torch.tensor(b))
    print(c)
    pass
    
if __name__=="__main__":
    task()

创建单位矩阵张量

import torch
import numpy as np

def task():
    a=torch.eye(3)
    print(a)
    pass
    
if __name__=="__main__":
    task()

创建指定值张量

import torch
import numpy as np

def task():
    a=torch.full((3,3),111)
    print(a,a.dtype)
    print("---------------")
    b=np.zeros((3,3))
    c=torch.full_like(torch.tensor(b),222)
    print(c)
    pass
    
if __name__=="__main__":
    task()

Tensor常见属性

获取属性

切换设备

import torch

def task():
#获取属性
    a=torch.tensor(3)
    print(a.dtype,a.device,a.shape)
     #运行结果:torch.int64 cpu torch.Size([]) 


#切换设备
    #把数据切换到GPU进行运算
    device="cuda" if torch.cuda.is_available() else "cpu"
    b=a.to(device)
    print(b.device)
     #运行结果:cuda:0
    
    #使用cuda进行转换
    c=a.cuda()
    print(c)
     #运行结果:tensor(3, device='cuda:0')

    #直接创建在GPU上
    d=torch.tensor((3),device='cuda')
    print(d.device)
     #运行结果:cuda:0
    pass
    
if __name__=="__main__":
    task()

类型转换

import torch

def task():
    a=torch.tensor(3)
    print(a.dtype)
    #torch.int64

    #用type进行类型转换
    b=a.type(torch.float32)
    print(b.dtype)
    # torch.float32

    #使用类型方法
    c=b.half()
    print(c.dtype)
    # torch.float16

    d=b.double()
    print(d.dtype)
    # torch.float64

    e=b.long()
    print(e.dtype)
    # torch.int64

    pass
    
if __name__=="__main__":
    task()

Tensor数据转换

张量、Numpy

Tensor 自称为神经网络界的Numpy,它与 Numpy 相似,二者可以共享内存,且之间的转换非常方便和高效。

不过它们也有不同之处,最大的区别就是 Numpy会把ndarray放在CPU中进行加速运算,而由Torch产生的Tensor会放在GPU中进行加速运算(如果当前环境有GPU)。

PyTorch 的Tensor是PyTorch 封装的一种数据结构,类似于Numpy的ndarray。

张量转Numpy

内存共享

#浅拷贝

import torch
def task():
    data_tensor=torch.tensor([[1,2,3],[4,5,6]])
    data_numpy=data_tensor.numpy()
    print(type(data_tensor),type(data_numpy))
    print("-----------")
    #输出结果:略

    data_numpy[0,1]=50
    print(data_tensor,data_numpy)
#     tensor([[ 1, 50,  3],
#         [ 4,  5,  6]]) [[ 1 50  3]
#  [ 4  5  6]]

    pass
    
if __name__=="__main__":
    task()

内存不共享

#深拷贝

import torch
def task():
    data_tensor=torch.tensor([[1,2,3],[4,5,6]])
    #使用copy避免内存共享
    data_numpy=data_tensor.numpy().copy()
    print(type(data_tensor),type(data_numpy))
    print("-----------")
    #输出结果:略

    data_numpy[0,1]=50
    print(data_tensor,data_numpy)
# tensor([[1, 2, 3],
#         [4, 5, 6]]) [[ 1 50  3]
#  [ 4  5  6]]
    data_tensor[0,0]=20
    print(data_tensor,data_numpy)
# tensor([[20,  2,  3],
#         [ 4,  5,  6]]) [[ 1 50  3]
#  [ 4  5  6]]
    pass
    
if __name__=="__main__":
    task()

Numpy转张量

内存共享

#浅拷贝

import torch
import numpy as np

def task():
    data_numpy=np.array([[1,2,3],[4,5,6]])
    data_tensor=torch.from_numpy(data_numpy)
    print(type(data_tensor),type(data_numpy))
    print("--------")
    #输出结果:略

    data_tensor[0,1]=20
    print(data_tensor,data_numpy)
# tensor([[ 1, 20,  3],
#         [ 4,  5,  6]], dtype=torch.int32) [[ 1 20  3]
#  [ 4  5  6]]
    pass


if __name__=="__main__":
    task()

内存不共享

#深拷贝

import torch
import numpy as np

def task():
    data_numpy=np.array([[1,2,3],[4,5,6]])
    data_tensor=torch.tensor(data_numpy)
    print(type(data_tensor),type(data_numpy))
    print("--------")
    #输出结果:略

    data_tensor[0,1]=20
    print(data_tensor,data_numpy)
# tensor([[ 1, 20,  3],
#         [ 4,  5,  6]], dtype=torch.int32) [[1 2 3]
#  [4 5 6]]   
    pass


if __name__=="__main__":
    task()

Tensor与图像

图片转Tensor

import torch
from PIL import Image
from torchvision import transforms

def test():
    img_=r"./QQ图片20211207153728.jpg"
    img=Image.open(img_)

    #图片转化为tensor
    transform=transforms.ToTensor()
    img_tensor=transform(img)
    print(img_tensor)

if __name__=="__main__":
    test()

Tensor转图片

import torch
from PIL import Image
from torchvision import transforms

def test():
    #随机一个数据表示生成的图片
    img_=torch.randn(2,128,222)
    #创建一个transforms
    transform=transforms.ToPILImage()
    #转换图片
    img=transform(img_)
    img.show()
    #保存图片
    img.save("./test.jpg")


if __name__=="__main__":
    test()

Pytorch图像处理

import torch
from PIL import Image
from torchvision import transforms

def test():

    # 指定读取的文件路径
    imgpath = r"./test.jpg"
    # 加载图片
    img = Image.open(imgpath)
    # 图像转为Tensor
    transform = transforms.ToTensor()
    img_tensor = transform(img)
    # 去掉透明度值
    print(img_tensor.shape)
    # 检查CUDA是否可用并将tensor移至CUDA
    if 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__":
    test()

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

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

相关文章

同城搭子系统小程序开发产品分析

1. 市场调研与需求分析 目标用户定位:定义核心用户群,例如上班族、学生、旅游爱好者等。需求收集:运用问卷调查、用户访谈等方法收集用户对功能的具体需求,特别是对安全、便捷性和费用分摊的关注点。竞品分析:分析同类…

开心第一课:健康坐姿

文章目录 引言保持脊柱的自然伸展选择一把合适的座椅引言 建议坐位时间超过 30 分钟,就起身活动一下,促进血液循环,预防久坐带来的各种健康问题。 保持脊柱的自然伸展 正确的骨盆位置是使坐位时身体重量都作用在双侧的坐骨结节上,在结节的顶端有滑囊,滑囊分泌液体减少组…

由“为什么VO不能继承PO?” 引出的为什么组合优于继承?

简述VO、DTO、PO的概念。 如下概念是我个人的理解: VO(View Object): 视图对象,用于展示,这很好理解,就是前端页面所需数据封装,一般所需要的属性比 PO 多并且。DTO(Da…

二手电脑配置给你不一样的成就感之四

今天测了e3 1220 v1 没有想象中的好,鲁大师才评20多万分,比fm2平台6600k强一点点有限。 6600k fm2平台是20万出头。cpuz的评分还是比较高,实际使用效果比6600k稍好一些。 单盒能力确实比apu强一些。同样拿world frvr 测试,调到最低…

微分方程_by小崔说数

可降解的微分方程 不显含x:y两撇dp/dxdp/dy*dy/dx 不显含y:dp/dx 都是y撇等于p 自变量与因变量呼唤 讲解为一阶线性微风方程 ,变成可分离得 公式得 高阶可降解得微分方程 通解非齐次特解齐次通解 非齐次特解;解得叠加原…

旗晟智能助推浙大海创人形机器人创新中心发展!

8月27日上午,余杭区成功举办机器人产业高质量发展大会。会上,由地方政府与浙江大学共同建设的人形机器人产业创新中心成立并揭牌。该中心目标明确,致力于打造机器人领域国内、国际的高等级创新高地。浙江大学校领导、院士专家、机器人企业代表…

js调试--本地替换

js调试--本地替换 一、本地替换的作用二、操作方法(以百度首页为例)1、选中目标资源地址二、替换为本地资源三、修改本地内容一、本地替换的作用 本地替换的作用就是将原本访问服务器的数据改成访问本地。 二、操作方法(以百度首页为例) 1、选中目标资源地址 以百度首页…

智能工厂MES实施规划

智能工厂MES(制造执行系统)实施规划是一个复杂而系统的过程,旨在通过数字化手段提升工厂的生产效率、降低成本并提高产品质量。以下是一个全面的智能工厂MES实施规划方案,涵盖主要步骤和关键点: 一、前期准备与需求分析…

手撸瀑布流

一、需求? 要求实现 一排两列 瀑布流样式,样式如下:其中A为容器,B为组件样式,卡片高度会因为标题的多少来自适应。 二、解法 1.使用CSS的column(⚠️不推荐) 使用CSS 属性 column 用来设置…

朋友们!pinterest视频保存教学给你们做出来啦

有没有在为pinterest视频无法下载而烦恼的小伙伴呀?我反正是被这个困扰好久了,每每看到喜欢的视频素材不能下载,真的很捉急!最近发现了这款神器,就是之前给大家推荐【水印抹布】app可以完美解决pinterest视频保存的问题…

Vue2与Vue3区别以及兼容那些浏览器酌情使用

一、vue2与vue3区别 vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。 项目地址:https://gitcode.com/gh_mirrors/vu/vue 免费下载资源 1.根节点不同 vue2中必须要有根标签vue3中可以没…

pod进阶:

pod进阶: pod的生命周期当中的状态: 1、Running 运行中,pod已经分配到节点上,且pod内的容器正常运行。正常状态(ready 1/1) 2、complete 完成之后退出,容器内的返回码是0 echo $? 表示容器是…

基于Easy-Wav2lip-Gradio的AI数字人

数字人技术近年来在多个领域得到广泛应用,从虚拟主播到电影特效,都需要精确的音视频同步技术来实现逼真的效果。传统的嘴型同步技术往往面临着准确性不高、处理速度慢等问题。为了解决这些问题,原有的Wav2Lip项目应运而生。Wav2Lip通过人工智能技术,实现了音频和视频的高精…

从LED硬件控制流程认识Android架构!

0.Android架构图 一上来就是一张框架图,发明了框架图的天才真是个天才! 简单点评一下: 1.对于安卓应用开发来说:App层以下都是操作系统,反正我只关心Android Studio(其实是SDK)给我什么包&…

字节-人工智能编辑代码方向面试-题目记录

问的都是自己简历里写的!不会就不要写 简述一下几个排序算法 二分查找的时间复杂度(是O(log2n)!!!) find函数和count函数的时间复杂度都是O(n),因为都是遍历整个数组来找的&#x…

Ubuntu Linux Server安装Kubernetes

本文主要描述在Ubuntu Linux Server操作系统中安装Kubernetes云原生对应的microk8s组件。 sudo snap install microk8s --classic 如上所示,在Ubuntu服务器中安装microk8s组件完成,对应的版本是microk8s v1.30版本 microk8s enable dashboard 如上所…

Java小白一文讲清Java中集合相关的知识点(二)

List List接口和常用方法 基本介绍 List接口是Collection接口的子接口 List集合类中的元素有序–即添加顺序和取出顺序一致、且可重复 public class Journey {SuppressWarnings({"all"})public static void main(String[] args) {List list new ArrayList();li…

基于Video-Retalking-Gradio的AI数字人

随着数字内容的普及,如何在视频中实现高精度的音频与唇形同步成为一个重要课题。传统方法通常需要大量的人工干预和调整,效果也往往不尽如人意。为了应对这一挑战,VideoReTalking 系统应运而生。由西安电子科技大学和腾讯AI实验室的研究人员联合开发,VideoReTalking 是一个…

【微信小程序】微信小程序如何使用 MobX 进行状态管理?

微信小程序官方在 2019 年针对小程序发布了 MobX 辅助绑定库,可以让我们在微信小程序中使用 Mobx 进行状态管理: mobx-miniprogram:相当于 MobX;mobx-miniprogram-bindings:针对小程序的 MobX 辅助绑定库,…

【全志H616】【开源】 ARM-Linux 智能分拣项目:阿里云、网络编程、图像识别

【全志H616】【开源】 ARM-Linux 智能分拣项目:阿里云、网络编程、图像识 文章目录 【全志H616】【开源】 ARM-Linux 智能分拣项目:阿里云、网络编程、图像识1、实现功能2、软件及所需环境3、逻辑流程图及简述3.1 完整逻辑流程图3.2 硬件接线3.3 功能简述…