Pytorch中一些函数的功能和参数(tensor.view()、nn.Sequential()、torch.stack())

论文代码使用到的函数

文章目录

  • 论文代码使用到的函数
    • tensor.view()
    • nn.Sequential()
    • tensor.transpose()
    • torch.mm()
    • torch.stack()
    • @staticmethod

最近在看别人的论文,也没有怎么使用过Pytorch,遇到一些关键的函数,不太明白函数的功能和参数,在这里做一个记录,方便后面查看。

tensor.view()

有条件的可以直接查看英文的文档。下面给出一些翻译和我的理解:

view(*shape) → Tensor

返回与该张量具有相同数据但形状不同的新张量。
返回的张量具有相同的数据,并且必须具有相同数量的元素,但可能具有不同的大小。对于要查看的张量,新视图大小必须与其原始大小和跨距兼容,即每个新视图维度必须是原始维度的子空间,或者仅跨原始维度 d 、 d + 1 、 … 、 d + k d、d+1、\dots、d+k dd+1d+k,满足以下类似于连续性的条件,即所有 ∀ i = 0 、 … 、 k − 1 ∀i=0、\dots、k-1 i=0k1,有:
s t r i d e [ i ] = s t r i d e [ i + 1 ] × s i z e [ i + 1 ] stride[i]=stride[i+1]×size[i+1] stride[i]=stride[i+1]×size[i+1]
如果不满足这个条件,我们还要在使用这个函数之前用别的函数使得他满足这个条件。
函数传入的参数为 s h a p e ( t o r c h . S i z e o r i n t . . . ) shape (torch.Size or int...) shape(torch.Sizeorint...),即我们想使用到的形状,或者说从函数名字来理解就是得到我们想看到的数据的视角。
数据本身是没变的,但是展现给我们的视角(view)变了
使用例子

>>> x = torch.randn(4, 4)
>>> x.size()
torch.Size([4, 4])
>>> y = x.view(16)
>>> y.size()
torch.Size([16])
>>> z = x.view(-1, 8)  # the size -1 is inferred from other dimensions
>>> z.size()
torch.Size([2, 8])

>>> a = torch.randn(1, 2, 3, 4)
>>> a.size()
torch.Size([1, 2, 3, 4])
>>> b = a.transpose(1, 2)  # Swaps 2nd and 3rd dimension
>>> b.size()
torch.Size([1, 3, 2, 4])
>>> c = a.view(1, 3, 2, 4)  # Does not change tensor layout in memory
>>> c.size()
torch.Size([1, 3, 2, 4])
>>> torch.equal(b, c)
False

nn.Sequential()

一个连续的容器。模块将按在构造函数中传递的顺序添加到其中。或者,模块的有序模块序列也可以传入。
为了更容易理解,下面是一个小例子:

# Example of using Sequential
model = nn.Sequential(
          nn.Conv2d(1,20,5),
          nn.ReLU(),
          nn.Conv2d(20,64,5),
          nn.ReLU()
        )
# Example of using Sequential with OrderedDict
model = nn.Sequential(OrderedDict([
          ('conv1', nn.Conv2d(1,20,5)),
          ('relu1', nn.ReLU()),
          ('conv2', nn.Conv2d(20,64,5)),
          ('relu2', nn.ReLU())
        ]))

从开发者的角度来看就是pytorch已经帮你把你想要搭建的网络的容器给做好了,就等着你往这容器里一层一层添加东西,加好了,你的网络结构就搭建好了。感觉很是实用啊!

tensor.transpose()

torch.transpose(input, dim0, dim1) → Tensor
# 或者input.transpose(dim0, dim1)

该函数返回一个张量,它是输入的转置版本。将交换给定的尺寸标注dim0和dim1。其中dim0和dim1是两个要交换的维度。
生成的输出张量与输入张量共享其底层存储,因此更改一个张量的内容将更改另一个张量的内容。

>>> x = torch.randn(2, 3)
>>> x
tensor([[ 1.0028, -0.9893,  0.5809],
        [-0.1669,  0.7299,  0.4942]])
>>> torch.transpose(x, 0, 1)
tensor([[ 1.0028, -0.1669],
        [-0.9893,  0.7299],
        [ 0.5809,  0.4942]])

torch.mm()

用法:

torch.mm(input, mat2, out=None) → Tensor

执行矩阵输入与mat2的矩阵乘法。
如果输入是 n × m n\times m n×m的张量,mat2是 m × p m \times p m×p的张量,则输出是 n × p n \times p n×p的张量。我们可以理解为这是pytorch中给出的矩阵乘法。值得注意的是这个乘法不能在网络中传播,如果需要能够传播,需要用到matmul()函数。

>>> mat1 = torch.randn(2, 3)
>>> mat2 = torch.randn(3, 3)
>>> torch.mm(mat1, mat2)
tensor([[ 0.4851,  0.5037, -0.3633],
        [-0.0760, -3.6705,  2.4784]])

torch.stack()

torch.stack(tensors, dim=0, out=None) → Tensor

该函数沿新维度连接张量序列。所有的张量必须是相同的大小。
其中,tensors(张量序列)–要连接的张量序列
dim(int)–要插入的尺寸。必须介于0和连接张量(包括)的维数之间
out(张量,可选)–输出张量。

@staticmethod

这个其实就是一个staticmethod函数,前面的@是修饰器的用法。前面Python的基础部分专门写过修饰器的用法。
staticmethod函数返回函数的静态方法。
该方法不强制要求传递参数,如下声明一个静态方法:参考菜鸟教程

class C(object):
    @staticmethod
    def f(arg1, arg2, ...):
        ...

以上实例声明了静态方法 f,从而可以实现实例化使用 C().f(),当然也可以不实例化调用该方法 C.f()。
总结就是使用了静态方法的函数不需要实例化就可以使用。

你可能感兴趣的:(Python,pytorch)