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框架。

相关推荐
Cosolar14 分钟前
AutoGen:微软开源的多Agent对话框架详解
人工智能·系统架构·大模型·agent·rag
Urbano16 分钟前
一条休闲束脚裤的工业化诞生科普 八道自动化缝纫工序拆解
人工智能
陕西企来客4 小时前
企来客科技来客 GEO 优化系统深度解析:核心技术与原因分析
大数据·人工智能·科技·搜索引擎
来让爷抱一个7 小时前
MonkeyCode 多模型切换技巧:什么时候用 Claude/GPT/DeepSeek
人工智能·ai编程
李白你好8 小时前
AI Agent 架构的自动化渗透测试工具
运维·人工智能·自动化
许彰午8 小时前
14_Java泛型完全指南
java·windows·python
2601_949499948 小时前
8 大工业光模块供应商选型:芯瑞科技 400G OSFP 助力 AI 算力集群升级
人工智能·科技
温柔只给梦中人8 小时前
NLP学习:注意力机制
人工智能·学习·自然语言处理
广州灵眸科技有限公司8 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) Easy-Eai编译环境准备与更新
服务器·前端·人工智能·python·深度学习
深度学习lover8 小时前
<数据集>yolo樱桃识别<目标检测>
人工智能·深度学习·yolo·目标检测·计算机视觉·数据集·樱桃识别