栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

PyTorch学习笔记(2):循着PyTorch的官方辅导课,看我走的弯路之一

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PyTorch学习笔记(2):循着PyTorch的官方辅导课,看我走的弯路之一

之所以要学习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同步更新,敬请关注)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/283789.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号