一、前言

内容源于莫烦的pytorch版块,近期要做一些pytorch相关方面的工作,对pytorch进行一些探索。

代码:https://github.com/MorvanZhou/PyTorch-Tutorial/blob/master/tutorial-contents

视频可以自己找来看,b站有。

另外要指出,莫烦这人可真不赖。

二、pytorch

PyTorch是Fackbook旗下的深度学习框架,

其原型是使用Lua语言编写的Torch,Torch很好用,但是Lua不是特别流行,

所以开发团队将Torch移植到了python上,于是有了PyTorch。

PyTorch说自己是神经网络领域可以用来替代numpy的模块。

可能是这个意思(有了PyTorch,和神经网络相关的工作就用不到numpy了)

和numpy能够把数组(numpy.ndarray)放在CPU中加速运算类似,

PyTorch能够把张量(torch.Tensor)放在GPU中加速运算。

1.pytorch的下载

#1.进入官网

https://pytorch.org/

#2.拉到下方"QUICK START LOCALLY"版块

pytorch版本和python版本 pytorch和numpy版本_pytorch

选择相应的版本,复制"Run this Command"版块的代码,敲入终端即可下载。

三、PyTorch和Numpy的比较

因为Numpy很好用,我们很依赖这个库,PyTorch宣称在神经网络领域可以代替Numpy,肯定做了不少工作。

首先要保证的是PyTorch对Numpy的兼容性,这就要求二者在数据上的流通。

也就是torch.Tensor和Numpy.ndarray两种数据类型的相互转换。

1.numpy.ndarray与torch.Tensor的相互转换

(1)、初始化数据

#导包
import numpy as np
import torch
#构建两行三列的numpy数据
np_data = np.arange(6).reshape(2 , 3)
print("数据:\n" , np_data)
print("\n数据类型:\n" , type(np_data))

output:

pytorch版本和python版本 pytorch和numpy版本_数组_02

(2)、numpy数据转换成torch数据

使用torch的from_numpy()方法

tensor = torch.from_numpy(np_data)
print(
        "数据:\n" ,tensor,
        "\n数据类型:\n",type(tensor)
     )

output:

pytorch版本和python版本 pytorch和numpy版本_数组_03

(3)、torch数据转换成numpy数据

使用Tensor对象的numpy()方法

array = tensor.numpy()
array

output:

pytorch版本和python版本 pytorch和numpy版本_pytorch_04

这里需要注意的是,是张量对象(Tensor)使用方法numpy(),

而不是torch.numpy(tensor)这样的形式,这种方式是错误的。

(4)、一个小问题

不知道大家有没有注意到,(1)和(3)中的numpy数组输出有一些不同。

(1)中的输出,元素之间没有逗号隔开,(3)中的输出,元素之间是用逗号隔开的。

为什么numpy数组在输出时,数组元素之间有时候有逗号,有时候没有逗号?


上述博文指出,有逗号的时候是没有print,用print输出就没有逗号

其中可能还有一些更深层次的原因

2.比较二者的绝对值

(1)、初始化数据

data = [-1 , -2 , 1 , 2]
tensor = torch.FloatTensor(data)

这里构建的data数据,类型是python自带的list列表类型

list转换成张量(Tensor),使用torch.FloatTensor()方法

(2)、numpy.abs()和torch.abs()

print(
    "abs in numpy:\n",np.abs(data),
    "\nabs in torch:\n",torch.abs(tensor)
)

output:

pytorch版本和python版本 pytorch和numpy版本_数组_05

可以看到,这里numpy处理的数据是python自带的list,

可以推断,numpy可以同时处理两种数据:list和numpy.ndarray。

而torch只能处理张量(Tensor)数据。

(3)、张量(Tensor)对象主动调用abs方法

print(
    "张量对象主动调用abs()方法:\n",tensor.abs()
)

output:

pytorch版本和python版本 pytorch和numpy版本_数据_06

(4)、小结

#1.numpy.abs()和torch.abs()作用类似

#2.张量对象(Tensor)能够主动调用abs()方法,而列表(list)对象和数组(numpy.ndarray)对象不行

#3.numpy模块能够处理列表(list)对象和数组(numpy.ndarray)对象,而torch模块只能处理张量(Tensor)对象

3.比较二者的sin()函数

(1)、初始化数据

data = np.array([0 , np.pi / 2 , 30])
tensor = torch.from_numpy(data)
print(
    "numpy数据:\n",data,
    "\ntorch数据:\n",tensor
)

output:

pytorch版本和python版本 pytorch和numpy版本_数据_07

这里用到了pi的表达,numpy.pi

(2)、比较二者

print(
    "sin() in numpy:\n",np.sin(data),
    "\nsin() in tensor:\n",torch.sin(tensor)
)

output:

pytorch版本和python版本 pytorch和numpy版本_pytorch版本和python版本_08

(3)、小结

这里不存在特别大的区别,numpy自身的数据处理精度就高一些

另外,关闭numpy自带的科学计数法表示可输入如下代码:

np.set_printoptions(suppress=True)

4.矩阵乘法

(1)、数据初始化

data = np.array([[1 , 2] , [3 , 4]])
tensor = torch.from_numpy(data)

(2)、numpy.matmul()和torch.mm()

print(
    "numpy.matmul():\n",np.matmul(data , data),
    "\ntorch.mm():\n",torch.mm(tensor , tensor)
)

output:

pytorch版本和python版本 pytorch和numpy版本_初始化_09

(3)、tensor对象能够调用mm()方法

print(
    "tensor对象调用mm()方法:\n",tensor.mm(tensor)
)

output:

pytorch版本和python版本 pytorch和numpy版本_数组_10

(4)、两个张量之间用*连接

print(
    "the result of tensor * tensor:\n",tensor * tensor
)

output:

pytorch版本和python版本 pytorch和numpy版本_初始化_11

意味着对应位置相乘

(5)、dot()方法在torch中只能作用于一维向量

tensor_1 = torch.tensor([2 , 3])
tensor_2 = torch.tensor([3 , 5])
print(
    "dot() in torch only works for one-dimensional:\n",torch.dot(tensor_1 , tensor_2)
)

output:

pytorch版本和python版本 pytorch和numpy版本_数据_12

作用是向量点乘。

能够猜想到

tensor_1.dot(tensor_2)

output:

pytorch版本和python版本 pytorch和numpy版本_数组_13

这样的方式在torch也是可行的。

(6)、dot在numpy中能够正确进行矩阵相乘操作

print(
    "dot() in numpy works successful!\n",np.dot(data , data)
)

output:

pytorch版本和python版本 pytorch和numpy版本_数据_14

(7)、小结

#1.numpy.matmul()方法和torch.mm()方法作用类似

#2.张量(Tensor)对象能够调用mm()方法

#3.两个张量(Tensor)之间用*相连,作用是矩阵对应位置相乘

#4.dot()方法在torch中只能作用于一维向量,作用是向量点乘,而在numpy中能够正确实现矩阵相乘操作

四、小结

本文比较了numpy和PyTorch中一些主要运算,函数,

得出的结论是,PyTorch模块在大部分操作上确实能够代替numpy。