pytorch基础(一)
因为前一段时间刚好在做一个项目的时候进行了TensorFlow到pytorch代码的转换,因此基本上从零开始学习了两个机器学习库,所以接下来这几篇博客将会简单介绍pytorch和TensorFlow如何进行机器学习,然后介绍一下如何在这两者之间进行代码的转换。
1.引入
首先,要明确我们为什么需要使用pytorch库或是TensorFlow库,这肯定是为了简化机器学习的代码。而相比较而言,pytorch比TensorFlow更加简单,因此上手也更加容易。以下部分主要结合pytorch官网上的DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ教程与个人对pytorch的认识对pytorch的基础知识进行简要讲解。
pytorch官网教程如下:https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html
2.pytorch基础知识
2.1 tensor
张量是一种特殊的数据结构,与数组和矩阵非常相似。在 PyTorch 中,我们使用张量对模型的输入和输出以及模型的参数进行编码。 张量类似于 NumPy 的 ndarray,不同之处在于张量可以在 GPU 或其他专用硬件上运行以加速计算。简单来说其实tensor可以简单地理解成矩阵,对于tensor的操作事实上就是对于矩阵的操作(这里如有不对请批评指正),因此对于tensor存在初始化、加减乘等基本操作,基本与矩阵操作对应,具体示例代码如下:
初始化:
import torch
import numpy as np
#-------------------初始化-----------------#
#直接初始化
data = [[1, 2],[3, 4]]
x_data = torch.tensor(data)#tensor
#从ndarry到tensor
np_array = np.array(data)
x_np = torch.from_numpy(np_array)
#从tensor到tensor
x_ones = torch.ones_like(x_data) # retains the properties of x_data
print(f"Ones Tensor: \n {x_ones} \n")
x_rand = torch.rand_like(x_data, dtype=torch.float) # overrides the datatype of x_data
print(f"Random Tensor: \n {x_rand} \n")
##输出:
# Ones Tensor:
# tensor([[1, 1],
# [1, 1]])
#
# Random Tensor:
# tensor([[0.6009, 0.6299],
# [0.5992, 0.6752]])
#一些常见初始化命令
shape = (2,3,)
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)
print(f"Random Tensor: \n {rand_tensor} \n")
print(f"Ones Tensor: \n {ones_tensor} \n")
print(f"Zeros Tensor: \n {zeros_tensor}")
#输出
# Random Tensor:
# tensor([[0.6660, 0.4187, 0.9762],
# [0.7766, 0.8118, 0.1959]])
#
# Ones Tensor:
# tensor([[1., 1., 1.],
# [1., 1., 1.]])
#
# Zeros Tensor:
# tensor([[0., 0., 0.],
# [0., 0., 0.]])
2.2 tensor运算
tensor的运算可以分为加减乘运算,具体如下:
2.2.1 pytorch转换为GPU运行命令:
if torch.cuda.is_available():
tensor = tensor.to('cuda')
配置GPU版pytorch教程可见网上教程,过几天如果我有时间可以写一篇教程。
2.2.2 tensor加法
直接用+号相连两个tensor即可,示例代码如下:
x=ones_tensor+ones_tensor
print(x)
输出结果如下:
tensor([[2., 2., 2.],
[2., 2., 2.]])
减法也类似,不再赘述。
2.2.3 tensor乘法
tensor的乘法有两种形式,一个是按位相乘,一个是按照矩阵运算规则运算,分别展示如下:
# 按位相乘
print(f"tensor.mul(tensor) \n {ones_tensor.mul(ones_tensor)} \n")
# Alternative syntax:
print(f"tensor * tensor \n {ones_tensor * ones_tensor}")
# 矩阵乘法法则
print(f"tensor.mm(tensor) \n {ones_tensor.mm(ones_tensor.t())} \n")
输出结果如下:
tensor.mul(tensor)
tensor([[1., 1., 1.],
[1., 1., 1.]])
tensor * tensor
tensor([[1., 1., 1.],
[1., 1., 1.]])
tensor.mm(tensor)
tensor([[3., 3.],
[3., 3.]])
也就是说,torch.mul是按位相乘,x[i][j]=tensor1[i][j]*tensor2[i][j];
而torch的乘法则满足矩阵乘法规则,需要前一个tensor的列数等于后一个tensor的行数。
2.2.4 tensor的连接
使用的函数是torch.cat,其中的dim参数如果设置为0,则几个tensor按行连接,如果设置为1,则几个tensor按列连接,具体如下
#按列连接
x=torch.cat([ones_tensor,ones_tensor,ones_tensor],dim=1)
print(x)
输出结果:
tensor([[1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1.]])
#按行连接
x=torch.cat([ones_tensor,ones_tensor,ones_tensor],dim=0)
print(x)
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
tensor的一些基本操作就是上述操作,下一个博客将会介绍如何使用pytorch搭建一个简单的神经网络。