从零开始深度学习Pytorch笔记(2)——张量的创建(上)

小黄用python

共 3392字,需浏览 7分钟

 · 2019-12-17

ec5d34d59a31b5794f339957e22e2c8c.webp


87a85e4700b71db3dfad4f2c7e74fdac.webp

在该系列的上一篇文章中,我们完整实现了Pytorch的cpu和gpu版本的安装,如果你还没有安装Pytorch,戳这里:从零开始深度学习Pytorch笔记(1)——安装Pytorch

本文我们正式开始学习Pytorch,说起Pytorch,我们首先要聊到他的基本数据类型——张量(Tensor),就像我们聊到Numpy一定是先学习他的数据类型ndarray一样。

那张量到底是什么呢?

张量类似于Numpy中的ndarray,我们都知道深度学习的基础是神经网络结构,而在Pytorch中,张量是构建神经网络的基础。

比较重要的一点是张量可以在GPU上进行计算。

所以从本质上来说,PyTorch 是一个处理张量的库。一个张量是一个数字、向量、矩阵或任何 n 维数组。

下图分别展示了1维张量,2维张量和3维张量:

03b42b5dc52477dfd7cb6407292fdc18.webp

接下来我们看看如何创建张量。

我们导入pytorch和numpy

import torch
import numpy as np

我们可以看看张量的相关参数:

torch.tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False)

其中:

data: 数据,可以是list,numpy的ndarray

dtype: 数据类型,默认与data的类型一致

device: 所在设备,gpu/cpu

requires_grad: 是否需要梯度,因为神经网络结构经常会要求梯度

pin_memory: 是否存于锁页内存

使用Numpy创建张量

通过np创建ndarray,然后转化为张量,数据类型默认与data一致,这里是创建了一个3*3的全1张量:

arr = np.ones((3,3))
print("数据类型为:",arr.dtype)
t = torch.tensor(arr)
print(t)

cd3aacbf898876d846dced9b20b5d0a7.webp

如果你已经搭建了GPU环境,可以通过如下代码将张量创建在GPU上(创建需要几秒的等待时间):

arr = np.ones((3,3))
print("数据类型为:",arr.dtype)
t = torch.tensor(arr,device='cuda')
print(t)

0ee3e90db8d0116b188f8934117ad800.webp

还有一种通过Numpy创建张量的方法,是使用torch.from_numpy(ndarray)。

torch.from_numpy(ndarray)

我们可以看到,它只需要接受一个ndarray即可。

arr = np.array([[1,2,3],[4,5,6]])
t = torch.from_numpy(arr)
print(arr)
print(t)

0ee8fc2f385340ad94b14e96e96484ea.webp

但是要注意的一点是:从torch.from_numpy创建的tensor和ndarray共享内存,当修改其中一个的数据,另外一个也会被修改。

例如我们修改array的内容:

arr = np.array([[1,2,3],[4,5,6]])
t = torch.from_numpy(arr)

#修改array内容
arr[0,0] = 999

print(arr)
print(t)

c46107ac3f450f41b70641be4e30700d.webp

或是我们修改张量的内容:

arr = np.array([[1,2,3],[4,5,6]])
t = torch.from_numpy(arr)

#修改tensor内容
t[0,0] = -888

print(arr)
print(t)

059932bf327bb2b80bd94f4da9ec74f1.webp

创建全0张量

我们可以通过torch.zeros()来创建全0张量:

zeros(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

其中:

size:为张量的形状

out:输出的张量

dtype: 数据类型

layout:内存中的布局形式,有strided,sparse_coo等

device:所在设备,gpu/cpu

requires_grad:是否需要梯度

t1 = torch.tensor([1,2,3])#创建一个t1张量,赋一个初始值
t = torch.zeros((2,3),out=t1)#将创建的t张量输出到t1
print(t,'\n',t1)
print(id(t),id(t1),id(t)==id(t1))

3e774242af02431d635fa95bcabaf7b5.webp

我们通过上面显示的id发现,t和t1的id相同,所以t和t1在内存中指向的内存块相同。通过torch.zeros_like()也可以创建全0张量:
torch.zeros_like(input, dtype=None, layout=None, device=None, requires_grad=False)
会根据input形状创建全0张量,例如我们创建一个3*5的全0张量:

input = torch.empty(35)
t = torch.zeros_like(input)
print(t)

ac6ed9790777e4fffc901214bb0cdfb6.webp

创建全1张量

全1张量的创建和全0张量的创建方式基本一致,使用如下方式创建:

torch.ones()

torch.ones_like()

根据数值创建张量

torch.full

torch.full(size, fill_value, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

其中的新出现参数:

fill_value: 填充的值

例如创建一个2*2的元素都是8的张量:

t = torch.full((2,2),8)
print(t)

9b12cf9d93f331850f53962d32cbfd71.webp

torch.full_like()

torch.full_like(input, fill_value, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

input = torch.empty(35)
t = torch.full_like(input,8)
print(t)

f75bacf0b5232950960b240964bcdd14.webp

上面是根据input的形状创建了一个元素都为8的张量。

创建等差的1维张量

可以通过torch.arange()创建等差的一维张量:

arange(start=0, end, step=1, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

其中:

start:数列的起始值

end:数列的结束值,取不到,只能取到 end-1

step:公差(步长),默认为 1

t = torch.arange(1,9,2)
print(t)

080c9bd1c8dd4652bf926915f015c533.webp

创建等间距(均分)的1维张量

torch.linspace()

linspace(start, end, steps=100, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

其中:

steps:创建出的一维张量的元素个数

end:结束位置可以取到

t = torch.linspace(1,9,5)
print(t)

537f1859c1459f2ee862b57bf1ad77ce.webp

t = torch.linspace(1,9,7)
print(t)

f5c94a9067498d9aac8cb9c0b0c331af.webp创建对数均分的1维张量

torch.logspace()

logspace(start, end, steps=100, base=10.0, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

参数:

base: 对数函数的底,默认为10

t = torch.logspace(start=-5, end=10,steps=4)
print(t)

864090dc92ad9fc644b7617a03a597c6.webp

创建单位对角矩阵(2维张量)

torch.eye()

torch.eye(n, m=None, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

参数:

m:矩阵行数

n:矩阵列数

t = torch.eye(4)
print(t)

77a81e30f42419a8430c599366b810c7.webp

默认为方阵。

这些张量创建的方式你记住了么?


df2c6c47e91377d883c924ff2b0d9bdf.webp你点的每个在看,我都认真当成了喜欢
浏览 55
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报