1什么是pytorch
是一个基于numpy的科学计算包,主要提供了两种功能
- 作为numpy的替代者,提供了使用gpu的能力
- 作为深度学习的平台,向用户提供了灵活性和速度
2基本元素操作-Tensor
与numpy中的ndarry数据结构较为类似,最大的区别在于Tenseo可以利用gpu进行加速。使用import torch
导入torch模块。
- 创建一个空的矩阵
x = troch.empty(5,3)
,矩阵中的数值是未知的不代表任何含义; - 创建一个全为0的矩阵
.zero()
,并使用dtype=
来只带数据的类型; - 直接通过数据创建相应的矩阵
x = torch.tensor([2.5, 3.5])
; - 通过已有矩阵的尺寸创建一个与之相同尺寸的矩阵
x = x.new_ones(5,3, dtype=?)
或者使用y = torch.randn_like(x, dtype= ?)
- 张量形状打印可以使用
.size()
的方式进行
3 基本运算操作
主要包括有加减乘除这四种运算
- 加法操作:
print(x+y)
,torch.add(x , y)
,原地置换方式y.add_(x)
即x+y的结果直接存储到y中 - 减法操作:
print(x-y)
,torch.sub(x , y)
,原地置换方式y.sub_(x)
即x+y的结果直接存储到y中
-乘法操作:print(x*y)
,torch.mul(x , y)
,原地置换方式y.mul_(x)
即x+y的结果直接存储到y中 - 除法操作:
print(x/y)
,torch.div(x , y)
,原地置换方式y.div_(x)
即x+y的结果直接存储到y中
4 张量的切片操作
在PyTorch中,可以使用切片操作来获取张量的子集。切片操作允许您选择张量中的特定维度上的特定元素或子张量,并返回一个新的张量。以下是一些常见的切片操作示例:
- 选择特定索引的元素:
import torch
# 创建一个张量
a = torch.tensor([1, 2, 3, 4, 5])
# 选择单个元素
element = a[0]
print(element) # 输出: tensor(1)
# 选择多个元素
elements = a[1:4] # 选择索引为1到3的元素
print(elements) # 输出: tensor([2, 3, 4])
- 切片操作也适用于多维张量:
import torch
# 创建一个二维张量
a = torch.tensor([[1, 2, 3], [4, 5, 6]])
# 选择特定行和列
row = a[0, :] # 选择第一行的所有元素
print(row) # 输出: tensor([1, 2, 3])
column = a[:, 1] # 选择第二列的所有元素
print(column) # 输出: tensor([2, 5])
- 还可以使用步长来选择间隔的元素:
import torch
# 创建一个张量
a = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9])
# 使用步长选择元素
subset = a[1:8:2] # 从索引1到7之间选择每隔一个元素
print(subset) # 输出: tensor([2, 4, 6, 8])
在这些示例中,我们使用切片操作通过指定索引或范围来选择张量的子集。要注意的是,在PyTorch中,切片是基于0索引的,所以第一个元素的索引为0。使用:
表示连续索引,而使用步长(:
后的数字)表示间隔。
切片操作返回的是原始张量的视图(view),即与原始张量共享内存,因此在原始张量或切片张量上的更改会相互影响。如果需要创建原始张量的副本,可以使用.clone()
方法复制张量。例如:subset = a[1:4].clone()
。
5 张量维度改变.view()
在PyTorch中,可以使用.view()
方法来改变张量的维度。.view()
方法接受一个参数,即新的维度大小的元组。通过改变维度,可以重新组织张量的数据,但要确保新的形状与原来的形状兼容(即原来的元素总数与新形状的元素总数相同)。
以下是使用.view()
方法改变张量维度的示例:
import torch
# 创建一个三维张量
a = torch.tensor([[1, 2, 3], [4, 5, 6]])
# 改变张量的维度
b = a.view(3, 2) # 将形状改变为(3, 2)
print(b)
# 输出:
# tensor([[1, 2],
# [3, 4],
# [5, 6]])
# 创建一个四维张量
c = torch.tensor([[[1, 2], [3, 4]],
[[5, 6], [7, 8]],
[[9, 10], [11, 12]]])
# 改变张量的维度
d = c.view(2, 3, 2) # 将形状改变为(2, 3, 2)
print(d)
# 输出:
# tensor([[[ 1, 2],
# [ 3, 4],
# [ 5, 6]],
#
# [[ 7, 8],
# [ 9, 10],
# [11, 12]]])
# 改变维度后的张量与原始张量共享内存
# 修改b或d的值将影响a或c的值,反之亦然
在这些示例中,我们使用.view()
方法将张量的维度重新整形为指定的大小。需要注意的是,.view()
方法返回的是原始张量的视图(view),即与原始张量共享内存。这意味着在视图上的操作会影响原始张量,反之亦然。如果需要创建原始张量的副本并改变维度,可以在视图调用之后使用.clone()
方法。
另外,.view()
方法还支持使用-1作为维度的占位符。通过将某个维度设置为-1,PyTorch会自动计算该维度的大小,以满足原始张量元素总数与新张量元素总数相同的要求。例如:
a = torch.tensor([1, 2, 3, 4, 5, 6])
b = a.view(2, -1) # 自动计算第二个维度的大小
print(b)
# 输出:
# tensor([[1, 2, 3],
# [4, 5, 6]])
在这个示例中,.view(2, -1)
会将原始张量重塑为形状为(2,3)的张量。第二个维度的大小会自动计算为6/2=3。