一、前言
内容源于莫烦的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.进入官网
#2.拉到下方"QUICK START LOCALLY"版块
选择相应的版本,复制"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:
(2)、numpy数据转换成torch数据
使用torch的from_numpy()方法
tensor = torch.from_numpy(np_data)
print(
"数据:\n" ,tensor,
"\n数据类型:\n",type(tensor)
)
output:
(3)、torch数据转换成numpy数据
使用Tensor对象的numpy()方法
array = tensor.numpy()
array
output:
这里需要注意的是,是张量对象(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:
可以看到,这里numpy处理的数据是python自带的list,
可以推断,numpy可以同时处理两种数据:list和numpy.ndarray。
而torch只能处理张量(Tensor)数据。
(3)、张量(Tensor)对象主动调用abs方法
print(
"张量对象主动调用abs()方法:\n",tensor.abs()
)
output:
(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:
这里用到了pi的表达,numpy.pi
(2)、比较二者
print(
"sin() in numpy:\n",np.sin(data),
"\nsin() in tensor:\n",torch.sin(tensor)
)
output:
(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:
(3)、tensor对象能够调用mm()方法
print(
"tensor对象调用mm()方法:\n",tensor.mm(tensor)
)
output:
(4)、两个张量之间用*连接
print(
"the result of tensor * tensor:\n",tensor * tensor
)
output:
意味着对应位置相乘
(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:
作用是向量点乘。
能够猜想到
tensor_1.dot(tensor_2)
output:
这样的方式在torch也是可行的。
(6)、dot在numpy中能够正确进行矩阵相乘操作
print(
"dot() in numpy works successful!\n",np.dot(data , data)
)
output:
(7)、小结
#1.numpy.matmul()方法和torch.mm()方法作用类似
#2.张量(Tensor)对象能够调用mm()方法
#3.两个张量(Tensor)之间用*相连,作用是矩阵对应位置相乘
#4.dot()方法在torch中只能作用于一维向量,作用是向量点乘,而在numpy中能够正确实现矩阵相乘操作
四、小结
本文比较了numpy和PyTorch中一些主要运算,函数,
得出的结论是,PyTorch模块在大部分操作上确实能够代替numpy。