共计 4540 个字符,预计需要花费 12 分钟才能阅读完成。
5 个 PyTorch 中的解决张量的根本函数
每个深度学习初学者都应该晓得这 5 个 Pytorch 的根本函数。
可能以精确无效的形式构建神经网络是招聘人员在深度学习工程师中最受追捧的技能之一。PyTorch 是一个 次要用于深度学习的 Python 库。PyTorch 最根本也是最重要的局部之一是创立张量,张量是数字、向量、矩阵或任何 n 维数组。在构建神经网络时为了升高计算速度必须防止应用显式循环,咱们能够应用矢量化操作来防止这种循环。在构建神经网络时,足够快地计算矩阵运算的能力至关重要。
“为什么不应用 NumPy 库呢?”
对于深度学习,咱们须要计算模型参数的导数。PyTorch 提供了在反向流传时跟踪导数的能力而 NumPy 则没有,这在 Pytorch 中被称为“Auto Grad”。PyTorch 为应用 GPU 的疾速执行提供了内置反对。这在训练模型方面至关重要。因为 Numpy 不足将其计算转移到 GPU 的能力,因而训练模型的工夫最终会变得十分大。
所有应用 PyTorch 的深度学习我的项目都从创立张量开始。让咱们看看一些必须晓得的函数,它们是任何波及构建神经网络的深度学习我的项目的支柱。
torch.tensor()
torch.sum()
torch.index_select()
torch.stack()
torch.mm()
在装置完 Pytorch 后,在代码中能够间接导入:
# Import torch and other required modules
import torch
torch.tensor()
首先,咱们定义了一个辅助函数,describe (x),它将总结张量 x 的各种属性,例如张量的类型、张量的维度和张量的内容。
# Helper function
def describe(x):
print("Type: {}".format(x.type()))
print("Shape/size: {}".format(x.shape))
print("Values: \n{}".format(x)
应用 torch.Tensor 在 PyTorch 中创立张量
PyTorch 容许咱们应用 torch 包以多种不同的形式创立张量。创立张量的一种办法是通过指定其维度来初始化一个随机张量
describe(torch.Tensor(2, 3))
应用 Python 列表以申明形式创立张量
咱们还能够应用 python 列表创立张量。咱们只须要将列表作为参数传递给函数,咱们就有了它的张量模式。
x = torch.Tensor([[1, 2, 3],[4, 5, 6]])
describe(x)
应用 NumPy 数组创立张量
咱们也能够从 NumPy 数组中创立 PyTorch 张量。张量的类型是 Double Tensor 而不是默认的 Float Tensor。这对应于 NumPy 的数据类型是 float64,如下所示。
import numpy as np
npy = np.random.rand(2, 3)
describe(torch.from_numpy(npy))
咱们不能用张量做什么?张量必须是实数或复数,不应是字符串或字符。
torch.tensor([[1, 2], [3, 4, 5]])
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-5-28787d136593> in <module>
1 # Example 3 - breaking (to illustrate when it breaks)
----> 2 torch.tensor([[1, 2], [3, 4, 5]])
ValueError: expected sequence of length 2 at dim 1 (got 3)
torch.tensor() 形成了任何 PyTorch 我的项目的外围,从字面上看,因为它就是张量。
torch.sum()
此函数返回输出张量中所有元素的总和。
describe(torch.sum(x, dim=0,keepdims=True))
如果你理解 NumPy,可能曾经留神到,对于 2D 张量,咱们将行示意为维度 0,将列示意为维度 1。torch.sum() 函数容许咱们计算行和列的总和。
咱们还为 keepdims 传递 True 以保留后果中的维度。通过定义 dim = 1 咱们通知函数按列折叠数组。
torch.sum(npy,dim=1,keepdims=True)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-17-1617bf9e8a37> in <module>()
1 # Example 3 - breaking (to illustrate when it breaks)
----> 2 torch.sum(npy,dim=1,keepdims=True)
TypeError: sum() received an invalid combination of arguments - got (numpy.ndarray, keepdims=bool, dim=int), but expected one of:
* (Tensor input, *, torch.dtype dtype)
didn't match because some of the keywords were incorrect: keepdims, dim
* (Tensor input, tuple of ints dim, bool keepdim, *, torch.dtype dtype, Tensor out)
* (Tensor input, tuple of names dim, bool keepdim, *, torch.dtype dtype, Tensor out)
该函数在计算指标和损失函数时十分有用。
torch.index_select()
这个函数返回一个新的张量,该张量应用索引中的条目(LongTensor)沿维度 dim 对输出张量进行索引。
indices = torch.LongTensor([0, 2])
describe(torch.index_select(x, dim=1, index=indices))
咱们能够将索引作为张量传递并将轴定义为 1,该函数返回一个新的张量大小
rows_of_original_tensor x length_of_indices_tensor。
indices = torch.LongTensor([0, 0])
describe(torch.index_select(x, dim=0, index=indices))
咱们能够将索引作为张量传递并将轴定义为 0,该函数返回大小为 columns_of_original_tensor x length_of_indices_tensor 的新张量。
indices = torch.FloatTensor([0, 2])
describe(torch.index_select(x, dim=1, index=indices))
此函数在张量的非间断索引这种简单索引中很有用。
torch.stack()
这将沿新维度连贯一系列张量。
describe(torch.stack([x, x, x],dim = 0))
咱们能够将咱们想要连贯的张量作为一个张量列表传递,dim 为 0,以沿着行重叠它。
describe(torch.stack([x, x, x],dim = 1))
咱们能够将咱们想要连贯的张量作为一个张量列表传递,dim 为 1,以沿着列重叠它。
y = torch.tensor([3,3])
describe(torch.stack([x, y, x],dim = 1))
--------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-37-c97227f5da5c> in <module>()
1 # Example 3 - breaking (to illustrate when it breaks)
2 y = torch.tensor([3,3])
----> 3 describe(torch.stack([x, y, x],dim = 1))
RuntimeError: stack expects each tensor to be equal size, but got [2, 3] at entry 0 and [2] at entry 1
该函数与 torch.index_select() 联合应用十分有用,能够压扁矩阵。
torch.mm()
此函数执行矩阵的矩阵乘法。
mat1 =torch.randn(3,2)
describe(torch.mm(x, mat1))
只需将矩阵作为参数传递,咱们就能够轻松地执行矩阵乘法,该函数将产生一个新的张量作为两个矩阵的乘积。
mat1 = np.random.randn(3,2)
mat1 = torch.from_numpy(mat1).to(torch.float32)
describe(torch.mm(x, mat1))
在下面的例子中,咱们定义了一个 NumPy 数组而后将其转换为 float32 类型的张量。当初咱们能够胜利地对张量执行矩阵乘法。两个张量的数据类型必须匹配能力胜利操作。
mat1 =torch.randn(2,3)
describe(torch.mm(x, mat1))
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-62-18e7760efd23> in <module>()
1 # Example 3 - breaking (to illustrate when it breaks)
2 mat1 =torch.randn(2,3)
----> 3 describe(torch.mm(x, mat1))
RuntimeError: mat1 and mat2 shapes cannot be multiplied (2x3 and 2x3)
为了执行胜利的矩阵乘法运算,矩阵 1 的列和矩阵 2 的行必须匹配。torch.mm() 函数遵循的是矩阵乘法的根本规定。即便矩阵的程序雷同,它依然不会主动与另一个矩阵的转置相乘,用户必须手动定义它。
为了在反向流传时计算导数,必须可能无效地执行矩阵乘法,这就是 torch.mm () 呈现的中央。
总结
咱们对 5 个根本 PyTorch 函数的钻研到此结束。从根本的张量创立到具备特定用例的高级和鲜为人知的函数,如 torch.index_select (),PyTorch 提供了许多这样的函数,使数据迷信爱好者的工作更轻松。
作者:Inshal Khan
最初如果你对加入 Kaggle 较量感兴趣,请私信我,邀你进入 Kaggle 较量交换群