PyTorch的许多函数在使用上和Numpy几乎一样,能够平滑地结合使用,Numpy的绝大多数操作同样可以用在PyTorch中。PyTorch的特色之一是提供构建动态计算图的框架,这样网络结构不再是一成不变的了,甚至可以在运行时修正它们。在神经网络方面,PyTorch的优点还在于使用了多GPU的强大加速能力、自定义数据加载器和极简的预处理过程等。尽管PyTorch与其他框架相比还算是新秀,仍然需要完善和改进,但不否认它一出现就得到了广泛的认同和运用。
1.Tensor简介
Tensor是PyTorch中的基本对象,意思为张量,表示多维的矩阵,是PyTorch中的基本操作对象之一。与Numpy中的多维数组ndarray类似。Tensor的声明和获取大小:
>>> import torch
>>> x = torch.Tensor(5,3)
>>> x.size()
torch.Size([5, 3])
Tensor的算术运算和选取操作与Numpy一样,因此Numpy相似的运算操作都可以迁移过来:
>>> x = torch.rand(5,3)
>>> y = torch.rand(5,3)
>>> x+y
tensor([[0.9579, 1.0589, 1.3667],
[0.1667, 0.2882, 1.4379],
[0.5773, 1.1986, 0.6230],
[1.0630, 1.3136, 0.6978],
[1.3252, 1.4158, 0.3060]])
>>> x[:,1]
tensor([0.3851, 0.1678, 0.8133, 0.6530, 0.8389])
Tensor与Numpy的array还可以进行相互转换,有专门的转换函数:
>>> x = torch.rand(5,3)
>>> y = x.numpy()
>>> z = torch.from_numpy(y)
2.Variable简介
Variable是PyTorch的另一个基本对象,可以把它理解为是对Tensor的一个封装。Variable用于放入计算图中进行前向传播、反向传播和自动求导,如下图所示。在一个Variable中有三个重要属性:data、grad和creator。其中,data表示包含的Tensor数据部分;grad表示传播方向的梯度,这个属性是延迟分配的,而且仅允许进行一次;creator表示创建这个Variable的Function的引用,该引用用户回溯整个创建链路。如果是用户创建的Variable,其creator为None,同时这种Variable称为Leaf Variable,autograd只会给Leaf Variable分配梯度。
>>> from torch.autograd import variable
>>> x = tor