Pytorch:张量创建及运算

目录

一、什么是PyTorch?

二、PyTorch能做什么?

三、如何安装PyTorch?

三、安装完后测试环境

四、张量的创建及运算

1、张量创建方式主要有三种:

2、创建线性张量和随机张量

3、指定值的张量

4、指定元素类型张量

5、张量类型转换

6、numpy数组转换为张量

7、提取标量张量的值

8、张量的基本运算

9、点乘运算

10、矩阵乘法运算

11、张量的运算函数


一、什么是PyTorch?

PyTorch是一个基于Python的科学计算包。

二、PyTorch能做什么?

1.PyTorch一个基于Python语言的深度学习框架,它将数据封装成张量(Tensor)来进行处理。

2.PyTorch提供了灵活且高效的工具,用于构建、训练和部署机器学习和深度学习模型。

3.PyTorch广泛应用于学术研究和工业界,特别是在计算机视觉、自然语言处理、强化学习等领域。

三、如何安装PyTorch?

官方地址:https://pytorch.org/

会看到一张图:

这是根据官方安装方法选择符合自己电脑的版本安装。

但是呢其实好多人判断不来该怎么办,下面给个

懒人方法推荐:

复制你的设备规格发给豆包让它格局规格推荐安装版本。

如果没有GPU可以安装CPU版本。

三、安装完后测试环境

打开pycharm查看安装的python版本及pytorch版本

python 复制代码
print('hello world')
import sys
print(sys.version)

import torch
print(torch.__version__)

四、张量的创建及运算

1、张量创建方式主要有三种:

(1) 指定数据或数据类型的张量

(2) 指定张量形状

(3)指定张量类型

什么是张量?

张量是矩阵,可以是一维度,二维,三维及多维

代码如下:

python 复制代码
# 代码示例
import torch
import numpy as np

# 1、根据指定的数据或者指定元素类型来创建张量
def demo1():
    list1 = [[1.,2,3],[4,5,6]]  #创建张量为float32
    int1 =10
    # array默认的类型是float64,所以创建的张量为float64
    n1 = np.array([[1.,2,3],[4,5,6]])
    t1 = torch.tensor(data=list1)
    t2 = torch.tensor(data=int1)
    t3 = torch.tensor(data=n1)

    print(f't1的值是:{t1}')
    print(f't1的类型是:{type(t1)}')
    print(f't1的元素类型为:{t1.dtype}')
    print(f't2的值是:{t2}')
    print(f't2的类型是:{type(t2)}')
    print(f't3的值是:{t3}')
    print(f't3的类型是:{t3.dtype}')
    print('*'*30)

# 2、根据指定数据或者指定形状创建张量
def demo2():
    # 指定数据
    t1 =torch.tensor(data=[[1.1,1.2,1.3],[2.2,2.3,2.4]])
    print(f't1的值是:{t1}')
    print(f't1的类型是:{type(t1)}')
    # 指定形状
    t2 = torch.Tensor(size=(2,3))
    print(f't2的值:{t2}')
    print(f't2的类型为:{type(t2)}')
    print(f't2的元素类型:{t2.dtype}')
    print('*'*30)

# 3、创建指定类型的张量
def demo3():
    # 如果元素类型不是指定类型,会自动转换
    t1 = torch.IntTensor([[1.1, 2, 3.7], [4, 5, 6]])
    t2 = torch.FloatTensor([[1.1, 2, 3.3], [4, 5, 6]])
    print(f't1的值是:{t1}')
    print(f't1的类型是:{type(t1)}')
    print(f't1的元素类型为:{t1.dtype}')
    print(f't2的值是:{t2}')
    print(f't2的类型是:{type(t2)}')
    print(f't2的元素类型是:{t2.dtype}')

# 测试
if __name__ == '__main__':
    demo1()
    demo2()
    demo3()

2、创建线性张量和随机张量

复制代码
# 线性张量
# torch.arange()
# torch.linspace()

# 随机张量
# torch.rand()/randn()
# torch.randint()
# torch.initial_seed():查看随机种子数
# torch.manual_seed():设置随机种子数

代码如下:

python 复制代码
import torch
# torch.arange(start,end,step=):创建线性张量,左闭右开
# torch.linspace(start,end,steps=):创建指定元素个数的线性张量 左闭右开
# steps:元素个数

def demo1():
    t1 = torch.arange(start=0,end=10,step=2)
    print(f't1的值为:{t1}')
    print(f't1的类型为{type(t1)}')

    t2 = torch.linspace(start =0,end=9,steps=9)
    print(f't2的值为:{t2}')
    print(f't2的类型为:{type(t2)}')
    print('*'*30)

def demo2():
    #(5,4):5行4列
    t1 = torch.rand(size=(5,4))
    print(f't1的值为:{t1}')
    print(f't1的类型为:{type(t1)}')
    print(f't1的元素类型为{t1.dtype}')
    print(f't1的随机种子数:{torch.initial_seed()}')
    # 设置随机种子数
    torch.manual_seed(seed=66)
    t2 = torch.randint(low=0,high=10,size=(2,3))
    print(f't2的值为:{t2}')
    print(f't2的类型为:{type(t2)}')
    print(f't2的元素类型为{t2.dtype}')
    print(f't2的随机种子数:{torch.initial_seed()}')

# 测试
if __name__ == '__main__':
    demo1()
    demo2()

3、指定值的张量

复制代码
# torch.ones/zeros/full(size=[,fill_value=])
# torch.ones_like/zeros_like/full_like(input=tensor[,fill_value=])

代码如下:

python 复制代码
import torch
# torch.ones(size=):根据形状创建全1的张量
# torch.ones_like(input=):根据指定张量的形状创建全1的张量

def demo1():
    t1 = torch.ones(size=(2,3))
    print(f't1的值是:{t1}')
    print(f't1的形状是:{t1.shape}')
    print(f't1的元素类型是:{t1.dtype}')

    t2 = torch.tensor(data =[1,2,3,4,5])
    t3 = torch.ones_like(input=t2)
    print(f't2的形状是:{t2.shape}')
    print(f't3的值是:{t3}')
    print(f't3的形状是:{t3.shape}')
    print('*'*30)

def demo2():
    t1 = torch.zeros(size=(2,3))
    print(f't1的值是:{t1}')
    print(f't1的形状是:{t1.shape}')
    print(f't1的元素类型是:{t1.dtype}')

    t2 = torch.tensor(data =[1,2,3,4,5])
    t3 = torch.zeros_like(input=t2)
    print(f't2的形状是:{t2.shape}')
    print(f't3的值是:{t3}')
    print(f't3的形状是:{t3.shape}')
    print('*'*30)

def demo3():
    t1 = torch.full(size=(2,3,4),fill_value=5)
    t2 = torch.tensor(data=[[1,2],[3,4]])
    t3 = torch.full_like(input=t2,fill_value=100)
    print(f't1的值是:{t3}')
    print(f't1的形状是:{t3.shape}')
    print(f't3的值是:{t3}')
    print(f't3的形状是:{t3.shape}')

if __name__ == '__main__':
    demo1()
    demo2()
    demo3()

4、指定元素类型张量

代码如下:

python 复制代码
import torch

# torch.tensor(data=,dtype=)
# 浮点类型默认是float32

def demo1():
    t1 = torch.tensor(data=[[1.,2,3],[4,5,6]], dtype=torch.float16)
    print(f't1的元素类型为;{t1.dtype}')
    # 转换为float32
    t2 = t1.type(dtype=torch.FloatTensor)
    t3 = t1.type(dtype=torch.int64)
    print(f't2的元素类型是:{t2.dtype}')
    print(f't3的元素类型是:{t3.dtype}')
    print('--'*30)

def demo2():
    t1 = torch.tensor(data=[1,2])
    print(f't1的元素类型是:{t1.dtype}')
    t2 = t1.int()
    print(t2)
    print(f't2的元素类型为:{t2.dtype}')


if __name__ == '__main__':
    demo1()
    demo2()

5、张量类型转换

代码如下:

python 复制代码
# 张量转换为numpy数组
import torch
import numpy as np

# 张量转换为numpy数组
# tensor.numpy():共享内存,修改一个另外一个也跟着变,可以通过copy()函数不共享内存
def demo1():
    t1 = torch.tensor([[1, 2, 3], [4, 5, 6]])
    print(f't1的值为:{t1}')
    # 转换为numpy数组
    n1 = t1.numpy().copy()
    print(n1)
    print(f'n1的类型为;{type(n1)}')
    print(f'n1的元素类型为:{n1.dtype}')
    n1[0][0] = 100
    print(f'修改后的n1为:{n1}')
    print(f't1为:{t1}')

demo1()

6、numpy数组转换为张量

代码如下:

python 复制代码
# torch.form_numpy(ndarray):共享内存,对ndarray数组进行copy()
# torch.tensor(data=ndarray):不共享内存

import torch
import numpy as np

def demo1():
    n1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    t1 = torch.from_numpy(n1)
    print(f't1的值为:{t1}')
    print(f't1的类型为:{type(t1)}')
    # 修改张量元素
    t1[0][0] = 888
    print(f'修改后的t1为:{t1}')
    print(n1)

if __name__ == '__main__':
    demo1()

7、提取标量张量的值

代码如下:

python 复制代码
import torch

# tensor.item():提取单个元素张量的数值,张量可以是一维、二维
def demo1():
    # 数值转换为张量
    # 标量
    t1 = torch.tensor(data=10)
    print('f{t1的值为:{t1}}')
    print(f't1的形状为:{t1.shape}')
    # 单个元素张量转换为数值,提取数值
    print(f't1提取的数值为:{t1.item()}')

if __name__ == '__main__':
    demo1()

8、张量的基本运算

复制代码
# tensor/torch.add() sub() mul() div() neg()  加-减-乘-除-取反
# 说明:不带下划线不修改原张量,带下划线修改原张量

代码如下:

python 复制代码
import torch
def demo1():
    # 创建张量
    t1 = torch.tensor(data=[1,2,3,4,5,6])
    t2 = t1+10
    print(f't2为:{t2}')
    t3 = t1 +t2
    print(f't3为:{t3}')

    # add()不修改原张量
    t1.add(other=100)
    t4 = torch.add(input=t1,other=100)
    print(f't4的值为:{t4}')

    # neg_()修改原张量
    t5 = t1.neg_()
    print(f't1的值为:{t1}')
    print(f't5的值为:{t5}')

if __name__ == '__main__':
    demo1()

9、点乘运算

代码如下:

python 复制代码
import torch

# 点乘:又称为阿达玛积,对应位置的元素进行点乘,一般要求两个张量形状相同
def demo1():
    t1 = torch.tensor(data=[1,2])
    t2 =torch.tensor(data=[[5,6],[7,8]])
    t3 = t1*t2
    print(f't3的值为:{t3}')
    t4 = torch.mul(input=t1,other=t2)
    print(f't4的值为:{t4}')



if __name__ == '__main__':
    demo1()

10、矩阵乘法运算

复制代码
第一个矩阵的行数和第二个矩阵的列数相乘

代码如下:

python 复制代码
# 第一个矩阵的行数和第二个矩阵的列数相乘
import torch
def demo1():
    t1 = torch.tensor([[1,2],[3,4]])
    t2 = torch.tensor([[5,6],[7,8]])
    t3 = torch.tensor([[5,6,7],[8,9,10]])
    t4 = t1@t2
    print(f't4的值为:{t4}')
    # 不同形状,只要后边维度符合矩阵乘法规则即可
    t5 = torch.matmul(input=t1,other=t3)
    print(f't5的值为:{t5}')

if __name__ == '__main__':
    demo1()


# 矩阵乘法原理说明
"""
t1 = [[1,2],  [5,6] = t2
      [3,4]]  [7,8]

t1 @ t2 = 第一行点乘第一列:1×5 + 2×7 = 5+14=19
          第一行点乘第二列:1×6 + 2×8 = 6+16=22
          第二行点乘第一列:3×5 + 4×7=15+28=43
          第二行点乘第二列:3×6 + 4×8=18+32=50

最终结果:
[[19, 22],
 [43, 50]]
"""

11、张量的运算函数

复制代码
# 张量的运算函数
# mean()
# sum()
# max()
# min()
# dim():按不同维度计算
# exp():指数
# squrt():平方根
# pow():幂次方
# log()/log()/log10():对数

代码如下:

python 复制代码
import torch
def demo1():
    t1 = torch.tensor(data=[[1.,2,3,4],[5,6,7,8]])
    print(f'所有值的平均值为:{t1.mean()}')
    print(f'按列的平均值为:{t1.mean(dim=0)}')
    print(f'按行的平均值为:{t1.mean(dim=1)}')

    # 求和
    print(f'所有值求和:{t1.sum()}')
    print(f'按列的求和为:{t1.sum(dim=0)}')
    print(f'按行的求和为:{t1.sum(dim=1)}')

    # 几次方
    print(f'幂次方:{torch.pow(input=t1,exponent=2)}')

    # 对数
    print(f'以10为底数的对数:{t1.log10()}')

if __name__ == '__main__':
    demo1()

以上大概就张量的创建以及运算操作,后面会逐渐步步深入学习pytorch框架。

相关推荐
iAm_Ike8 小时前
Go 中自定义类型与基础类型间的显式类型转换详解
jvm·数据库·python
iuvtsrt8 小时前
Golang怎么实现方法集与接口的匹配_Golang如何理解值类型和指针类型实现接口的区别【详解】
jvm·数据库·python
牧子川8 小时前
009-Transformer-Architecture
人工智能·深度学习·transformer
covco8 小时前
矩阵管理系统指南:拆解星链引擎的架构设计与全链路落地实践
大数据·人工智能·矩阵
沪漂阿龙8 小时前
AI大模型面试题:支持向量机是什么?间隔最大化、软间隔、核函数、LinearSVC 全面拆解
人工智能·算法·支持向量机
lifewange8 小时前
AI编写测试用例工具介绍
人工智能·测试用例
陕西字符8 小时前
2026 西安 豆包获客优化技术深度解析:企来客科技 AI 全域获客系统测评
大数据·人工智能
掘金安东尼8 小时前
GGUF、GPTQ、AWQ、EXL2、MLX、VMLX...运行大模型,为什么会有这么多格式?
人工智能
新知图书8 小时前
市场分析报告自动化生成(使用千问)
人工智能·ai助手·千问·高效办公
无心水8 小时前
【Hermes:安全、权限与生产环境】38、Hermes Agent 安全四层纵深:最小权限原则从理论到落地的完全指南
人工智能·安全·mcp协议·openclaw·养龙虾·hermes·honcho