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

相关推荐
领麦微红外2 小时前
W-TRS-5.5D1传感器:充电桩的“温度卫士”,解锁安全高效充电新范式
人工智能·安全
SomeB1oody2 小时前
【Python深度学习】3.4. 循环神经网络(RNN)实战:预测股价
开发语言·人工智能·python·rnn·深度学习·机器学习
ACCELERATOR_LLC2 小时前
【DataWhale组队学习】DIY-LLM Task2 PyTorch 与资源核算
人工智能·pytorch·深度学习·大模型
m0_748920362 小时前
Golang goquery怎么解析HTML_Golang goquery教程【核心】
jvm·数据库·python
m0_746752302 小时前
golang如何编写Markdown转HTML工具_golang Markdown转HTML工具编写详解
jvm·数据库·python
Bug 挖掘机2 小时前
一篇理清Prompt,Skill,MCP之间的区别
开发语言·软件测试·python·功能测试·测试开发·prompt·ai测试
weixin_424999362 小时前
C#怎么使用TopLevel顶级语句 C#顶级语句怎么写如何省略Main方法简化控制台程序【语法】
jvm·数据库·python
Elastic 中国社区官方博客3 小时前
Elastic Security、Observability 和 Search 现在在你的 AI 工具中提供交互式 UI
大数据·运维·人工智能·elasticsearch·搜索引擎·安全威胁分析·可用性测试
一碗白开水一3 小时前
【目标跟踪综述】目标跟踪近3年技术研究,全面了解目标跟踪发展
人工智能·计算机视觉·目标跟踪