之所以要学习PyTorch,很简单的一个原因:科研需要。
先了解一下PyTorch是什么吧。简而言之,PyTorch就是建立在Python基础上的机器学习框架。要想学会,首先要树立一个基础,那就是要理解机器学习模型的构建基础。
学习PyTorch,按照官方的介绍,目标有三个:
- 学习建立机器学习模型的主要概念
- 如何建立机器视觉模型
- 利用PyTorch API建模
如果想要学会,就需要理解Python的基础知识,同时要知道如何用Jupyter笔记本的基础知识。
我突然发现,这两个知识都不会啊。这不就挂掉了?
算了算了,就先这么循序渐进,如果需要了再补充吧。
2.1 了解什么是Tensors
Tensor是用来编码一个模型的输入和输出,以及模型的参数。
与Numpy中的ndarrays相似。Tensors和NumPy的arrays都依靠同样的内存。在官方辅导中,他们建议最好熟悉ndarrays。看来逃不过了。
等等,什么叫做NumPy?这个需要后续了解一下。
不管了,看代码。
import torch import numpy as np
这两句是设置运行环境的代码。我原以为只学会一个
import torch
就足够了。但是看来,还是小儿科。
2.2 初始化Tensor
2.2.1 直接从数据创建
data = [[1, 2],[3, 4]] x_data = torch.tensor(data)
这两句是什么意思?
2.2.2 从一个NumPy array建立
果不其然,这里就来一个NumPy。先记下来。
np_array = np.array(data) x_np = torch.from_numpy(np_array)
2.2.3 带有随机值或常值:
shape 是一个tensor维度
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.4533, 0.2957, 0.8064],
[0.6645, 0.5265, 0.8369]])
ones Tensor:
tensor([[1., 1., 1.],
[1., 1., 1.]])
Zeros Tensor:
tensor([[0., 0., 0.],
[0., 0., 0.]])
2.3 Tensor的属性
Tensor的属性包括了他们的大小、数据类型和计算设备
比如说,像我执行下面这段代码:
tensor = torch.rand(3,4)
print(f"Shape of tensor: {tensor.shape}")
print(f"Datatype of tensor: {tensor.dtype}")
print(f"Device tensor is stored on: {tensor.device}")
提示的是
Shape of tensor: torch.Size([3, 4]) Datatype of tensor: torch.float32 Device tensor is stored on: cpu
等等,我突然发现这和我之前编写C++和C有所不同,这些代码没有一个要加分号。怪不得看的这么别扭。需要改一下自己的习惯了。
2.4 Tensor的运算
Tensor有100多种运算,包括了算术运算、线性代数、矩阵运算(转置、指数、模)。具体的内容在PyTorch网站上有详细说明。但是我准备先把第一部分弄完。
Tensor默认在CPU上创建,但是需要用.to方法转移到GPU上运行。跨处理器的运算在时间和内存上消耗非常大。
这让我有种感觉,可能在CPU上更保险吧。
#如果可能,我们将tensor转移到GPU上
if torch.cuda.is_available()
tensor = tensor.to('cuda')
这段代码在Microsoft上面运行长达24秒,可见耗时之长。
如果熟悉NumPy API,就能用Tensor API进行更高级的计算。
2.4.1 标准的numpy-like索引与slicing:
tensor = torch.ones(5, 5)
print('First row: ',tensor[0])
print('First column: ', tensor[:, 0])
print('Last column:', tensor[..., -1])
tensor[:,1] = 0
print(tensor)
执行结果如下:
First row: tensor([1., 1., 1., 1., 1.])
First column: tensor([1., 1., 1., 1., 1.])
Last column: tensor([1., 1., 1., 1., 1.])
tensor([[1., 0., 1., 1., 1.],
[1., 0., 1., 1., 1.],
[1., 0., 1., 1., 1.],
[1., 0., 1., 1., 1.],
[1., 0., 1., 1., 1.]])
但如果我讲torch.ones中的参数调整为非方阵,会出现什么结果?
tensor = torch.ones(5, 4)
print('First row: ',tensor[0])
print('First column: ', tensor[:, 0])
print('Last column:', tensor[..., -1])
tensor[:,1] = 0
print(tensor)
结果很显然,是能够做出来的:它建立的是一个5行4列的矩阵。第一个数字代表行,第二个数字代表列。这怎么和我之前用的某个编程软件又不一样了?看来确实需要牢记很多东西。
First row: tensor([1., 1., 1., 1.])
First column: tensor([1., 1., 1., 1., 1.])
Last column: tensor([1., 1., 1., 1., 1.])
tensor([[1., 0., 1., 1.],
[1., 0., 1., 1.],
[1., 0., 1., 1.],
[1., 0., 1., 1.],
[1., 0., 1., 1.]])
2.4.2 Joining tensors
什么叫做Joiningtensors。还让我用torch.cat来concatenate一个tensors
t1 = torch.cat([tensor, tensor, tensor], dim=1) print(t1)
不到1秒的运行时间,会生成什么?
tensor([[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.]])
好吧,文章写到这么多,网页居然崩了。那就在下篇文章中,再写一些吧。
(本文章同步在我的博客www.im-zu.cn同步更新,敬请关注)



