首页 > 其他分享 >深度学习张量数值计算

深度学习张量数值计算

时间:2024-08-09 21:24:11浏览次数:11  
标签:tensor torch 张量 数值 深度 print 存储设备 data

张量的介绍

PyTorch 是一个 Python 深度学习框架,它将数据封装成张量(Tensor)来进行运算。PyTorch 中的张量就是元素为同一种数据类型的多维矩阵。在 PyTorch 中,张量以 "类" 的形式封装起来,对张量的一些运算、处理的方法被封装在类中。

张量基本运算

基本运算中,包括 add、sub、mul、div、neg 等函数, 以及这些函数的带下划线的版本 add_、sub_、mul_、div_、neg_,其中带下划线的版本为修改原数据。

import numpy as np
import torch


def test():

    data = torch.randint(0, 10, [2, 3])
    print(data)
    print('-' * 50)

    # 1. 不修改原数据
    new_data = data.add(10)  # 等价 new_data = data + 10
    print(new_data)
    print('-' * 50)

    # 2. 直接修改原数据
    # 注意: 带下划线的函数为修改原数据本身
    data.add_(10)  # 等价 data += 10
    print(data)

    # 3. 其他函数
    print(data.sub(100))
    print(data.mul(100))
    print(data.div(100))
    print(data.neg())


if __name__ == '__main__':
    test()

输出结果:

tensor([[3, 7, 4],
        [0, 0, 6]])
--------------------------------------------------
tensor([[13, 17, 14],
        [10, 10, 16]])
--------------------------------------------------
tensor([[13, 17, 14],
        [10, 10, 16]])
tensor([[-87, -83, -86],
        [-90, -90, -84]])
tensor([[1300, 1700, 1400],
        [1000, 1000, 1600]])
tensor([[0.1300, 0.1700, 0.1400],
        [0.1000, 0.1000, 0.1600]])
tensor([[-13, -17, -14],
        [-10, -10, -16]])

 阿达玛积

阿达玛积指的是矩阵对应位置的元素相乘.

import numpy as np
import torch


def test():

    data1 = torch.tensor([[1, 2], [3, 4]])
    data2 = torch.tensor([[5, 6], [7, 8]])

    # 第一种方式
    data = torch.mul(data1, data2)
    print(data)
    print('-' * 50)

    # 第二种方式
    data = data1 * data2
    print(data)
    print('-' * 50)


if __name__ == '__main__':
    test()

输出结果:

tensor([[ 5, 12],
        [21, 32]])
--------------------------------------------------
tensor([[ 5, 12],
        [21, 32]])
--------------------------------------------------

点积运算

点积运算要求第一个矩阵 shape: (n, m),第二个矩阵 shape: (m, p), 两个矩阵点积运算 shape 为: (n, p)。

  1. 运算符 @ 用于进行两个矩阵的点乘运算
  2. torch.mm 用于进行两个矩阵点乘运算, 要求输入的矩阵为2维
  3. torch.bmm 用于批量进行矩阵点乘运算, 要求输入的矩阵为3维
  4. torch.matmul 对进行点乘运算的两矩阵形状没有限定.                                                                   a.对于输入都是二维的张量相当于 mm 运算.                                                                             b.对于输入都是三维的张量相当于 bmm 运算                                                                           c.对数输入的 shape 不同的张量, 对应的最后几个维度必须符合矩阵运算规则
    import numpy as np
    import torch
    
    
    # 1. 点积运算
    def test01():
    
        data1 = torch.tensor([[1, 2], [3, 4], [5, 6]])
        data2 = torch.tensor([[5, 6], [7, 8]])
    
        # 第一种方式
        data = data1 @ data2
        print(data)
        print('-' * 50)
    
        # 第二种方式
        data = torch.mm(data1, data2)
        print(data)
        print('-' * 50)
    
        # 第三种方式
        data = torch.matmul(data1, data2)
        print(data)
        print('-' * 50)
    
    
    # 2. torch.mm 和 torch.matmull 的区别
    def test02():
    
        # matmul 可以两个维度可以不同
        # 第一个张量: (3, 4, 5)
        # 第二个张量: (6, 4)
        # torch.mm 不可以相乘,而 matmul 则可以相乘
    
        print(torch.matmul(torch.randn(3, 4, 5), torch.randn(5, 4)).shape)
        print(torch.matmul(torch.randn(5, 4), torch.randn(3, 4, 5)).shape)
    
    
    # 3. torch.mm 函数的用法
    def test03():
    
        # 批量点积运算
        # 第一个维度为 batch_size
        # 矩阵的二三维要满足矩阵乘法规则
    
        data1 = torch.randn(3, 4, 5)
        data2 = torch.randn(3, 5, 8)
    
        data = torch.bmm(data1, data2)
        print(data.shape)
    
    
    if __name__ == '__main__':
        test01()
        test02()
        test03()

    输出结果:

    tensor([[19, 22],
            [43, 50],
            [67, 78]])
    --------------------------------------------------
    tensor([[19, 22],
            [43, 50],
            [67, 78]])
    --------------------------------------------------
    tensor([[19, 22],
            [43, 50],
            [67, 78]])
    --------------------------------------------------
    torch.Size([3, 4, 4])
    torch.Size([3, 5, 5])
    torch.Size([3, 4, 8])

    指定运算设备 

PyTorch 默认会将张量创建在 CPU 控制的内存中, 即: 默认的运算设备为 CPU。我们也可以将张量创建在 GPU 上, 能够利用对于矩阵计算的优势加快模型训练。将张量移动到 GPU 上有两种方法: 1. 使用 cuda 方法 2. 直接在 GPU 上创建张量 3. 使用 to 方法指定设备 

import torch


# 1. 使用 cuda 方法
def test01():

    data = torch.tensor([10, 20 ,30])
    print('存储设备:', data.device)

    # 如果安装的不是 gpu 版本的 PyTorch
    # 或电脑本身没有 NVIDIA 卡的计算环境
    # 下面代码可能会报错
    data = data.cuda()
    print('存储设备:', data.device)

    # 使用 cpu 函数将张量移动到 cpu 上
    data = data.cpu()
    print('存储设备:', data.device)

    # 输出结果:
    # 存储设备: cpu
    # 存储设备: cuda:0
    # 存储设备: cpu


# 2. 直接将张量创建在 GPU 上
def test02():

    data = torch.tensor([10, 20, 30], device='cuda:0')
    print('存储设备:', data.device)

    # 使用 cpu 函数将张量移动到 cpu 上
    data = data.cpu()
    print('存储设备:', data.device)

    # 输出结果:
    # 存储设备: cuda:0
    # 存储设备: cpu


# 3. 使用 to 方法
def test03():

    data = torch.tensor([10, 20, 30])
    print('存储设备:', data.device)

    data = data.to('cuda:0')
    print('存储设备:', data.device)

    # 输出结果:
    # 存储设备: cpu
    # 存储设备: cuda:0


# 4. 存储在不同设备的张量不能运算
def test04():

    data1 = torch.tensor([10, 20, 30], device='cuda:0')
    data2 = torch.tensor([10, 20, 30])
    print(data1.device, data2.device)

    # RuntimeError: Expected all tensors to be on the same device,
    # but found at least two devices, cuda:0 and cpu!
    data = data1 + data2
    print(data)


if __name__ == '__main__':
    test04()

输出结果:

存储设备: cpu
存储设备: cuda:0
存储设备: cpu
存储设备: cuda:0
存储设备: cpu
存储设备: cpu
存储设备: cuda:0
cuda:0 cpu

标签:tensor,torch,张量,数值,深度,print,存储设备,data
From: https://blog.csdn.net/DGFfdAf/article/details/141070600

相关文章

  • 《Advanced RAG》-04-深度研究RAG技术Re-ranking
    摘要文章首先介绍了重新排序在RAG中的重要性,它允许对检索到的文档进行重新排序和过滤,以确保最相关的文档能够被优先考虑,从而提高RAG的效率和准确性。接着,文章详细描述了两种主流的重新排序方法:一种是使用重新排序模型,如bge-reranker-base和bge-reranker-large等,这些模型......
  • 在Modbus协议中,传输一个float类型的数值
    假设你想传输的浮点数是123.456,其在内存中的二进制表示为CDABEF12(这是假设为大端序的情况,即最高有效字节先出现)。为了将其发送给Modbus设备,你需要将这32位拆分为两个16位的寄存器值CDAB和EF12。#include<stdint.h>voidfloat_to_modbus_regs(floatf,uint16_t*reg_high......
  • 深度学习——神经网络(neural network)详解(二). 带手算步骤,步骤清晰0基础可看
    深度学习——神经网络(neuralnetwork)详解(二).手算步骤,步骤清晰0基础可看前文如下:深度学习——神经网络(neuralnetwork)详解(一).带手算步骤,步骤清晰0基础可看运用神经网络模型进行房价预测具体手算过程,具体示例假设我们有一个简单的神经网络,还是之前这个神经网络,输入层2个......
  • Pytorch深度学习入门基础(三):python 加载数据初认识
    目录 一、 导入二、数据集中数据和label的组成形式三、Dataset读入数据四、Dataset类代码实战4.1创建函数4.2  设置初始化函数4.3读取每一个图片4.4设置获取数据长度函数4.5创建实例4.5.1单个图片数据集4.5.2 多个图片数据集    现在来开......
  • 问题 K: 数据结构基础11-图的深度优先遍历
    题目描述读入一个邻接矩阵存储的无向图,输出它的深度优先遍历序列。  输入第1行1个整数n,表示图中的顶点数,2<=n<=100接下来的n行是一个n*n的邻接矩阵,a[i][j]=1表示顶点i和顶点j之间有直接边相连,a[i][j]=0表示没有直接边相连,保证i=k时a[i][j]=0,且a[i,j]=a[j,i].输出输......
  • 深度学习每周学习总结N6:使用Word2vec实现文本分类
    ......
  • LeetCode 1111. 有效括号的嵌套深度
    1111.有效括号的嵌套深度有效括号字符串 定义:对于每个左括号,都能找到与之对应的右括号,反之亦然。详情参见题末「有效括号字符串」部分。嵌套深度 depth 定义:即有效括号字符串嵌套的层数,depth(A) 表示有效括号字符串 A 的嵌套深度。详情参见题末「嵌套深度」部分。有......
  • 如何使用字典更改张量中的值?
    当我有如下的张量和字典时,如何将字典映射到张量?例如,Dict={1:'A',2:'B',3:'C'}ex=torch.tensor([[1,2,3],[3,2,1]])#Expectedresult#tensor([[A,B,C],#[C,B,A]])我尝试了这个代码和torch.where,但它不起作用出色地。......
  • C语言进阶——一文带你深度了解“C语言关键字”(中篇3)
    这篇文章记录我学习C语言关键字的相关知识,旨在记录一些进阶的知识。目录一、if、else之间的组合(一)、bool变量与零值之间的比较(二)、float变量与零值之间的比较 (三)、指针变量与零值之间的比较 (四)、else究竟与哪个if进行配对呢?二、结语 一、if、else之间的组合(一......
  • 深度学习中,图像和文本的输入区别
    图像输入1.数据预处理尺寸调整(Resizing):将图像调整到统一的尺寸,如224×224或256×256。归一化(Normalization):对每个像素值进行归一化,像素值通常归一化到[0,1]或[-1,1]范围。数据增强(DataAugmentation):包括随机裁剪、翻转、旋转等操作,以增加模型的泛化能力......