目录
一、什么是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框架。