pytorch学习笔记

@pytorch学习心得

from_numpy

在 Pytroch 中,Tensor 是一种包含单一数据类型元素的多维矩阵,译作张量。熟悉 numpy 的同学对这个定义应该感到很熟悉,就像ndarray一样,***一维Tensor叫Vector,二维Tensor叫Matrix,三维及以上称为Tensor。***而 numpy 和 Tensor 确实有很多的相似之处,两者也可以互转。

from_numpy将numpy.ndarray 转换为 pytorch 的 Tensor。

基本形式:

torch.from_numpy(ndarray) → Tensor

应用示例:

# 声明一个 array,利用 from_numpy 将其转换为 tensor
np_data = np.array([1, 2, 3])
torch_data = torch.from_numpy(np_data)
输出结果:

numpy array: [1 2 3] 
torch tensor: 
 1
 2
 3
[torch.LongTensor of size 3]

返回的张量tensor和numpy的ndarray共享同一内存空间。修改一个,会导致另外一个也被修改,返回的张量不能改变大小。

应用示例:

torch_data[0] = -1
print(np_data)
输出结果:

[-1  2  3]

numpy()

numpy()将 Pytorch 的 Tensor转换为numpy.ndarray 。

基本语法:

torch.numpy()→ ndarray

应用示例:

#将torch_data由Tensor`转换为`numpy.ndarray `赋给 tensor2array
 tensor2array  = torch_data.numpy()
输出结果:

tensor to array: [1 2 3]

任务描述

本关卡主要介绍张量 tensor 创建的多种方法,要求同学们体会不同数据类型的差异。

本关任务:

一个张量tensor可以利用输入其行数和列数进行构建,也可以利用 Python 的list构建,按照程序相关的提示,创建一个32位有符号的整数张量。

相关知识

想必大家对 Python 的基本数据类型都有一定的了解,如int、float、double等,与之对应的 Pytorch 提供了多种类型的tensor,以便根据数据的特性进行相应的选择。

Pytorch 定义了七种CPU tensor类型和八种GPU tensor类型:

数据类型

在这里插入图片描述

一个张量tensor可以利用输入张量shape ,即行数和列数进行构建。数据在相应的数据类型的最大最小值之间随机生成。torch.Tensor是默认的tensor类型(torch.FloatTensor)的简称。torch.IntTensor。同学们可以尝试利用不同的语句创建tensor,看看有什么不同。

基本形式:

#创建出一个元素为32位浮点型的Tensor
torch.Tensor(shape)
应用示例:

#下面两条语句等价
t1 = torch.Tensor(2,2)
#t1 = torch.FloatTensor(2,2)
 输出结果:

 0.0000e+00  0.0000e+00
 4.3910e-29 -1.5846e+29
[torch.FloatTensor of size 2x2]

Python序列构建

一个张量tensor可以从 Python 的list或序列构建。

基本形式:

#创建出一个未初始化的Tensor
torch.Tensor(list)
应用示例:

t1 = torch.FloatTensor([[1, 2, 3], [4, 5, 6]])

 输出结果:

 1 2 3
4 5 6
[torch.FloatTensor of size 2x3]

特殊张量

Pytorch 提供了很多方法用于创建特殊的矩阵,这里只介绍几种常用的矩阵:

torch.ones(n,m):创建n*m 维的张量,其元素都被填充了标量值1;
torch.zeros(n,m): 创建n*m 维的张量,其元素都被填充了标量值0;
torch.eye(n,m):创建n*m 维的张量,其对角线为1,其余元素均为0;
torch.linspace(start, end, steps=100) :创建值start和 end之间等间距点的一维张量;
torch.rand(sizes):返回一个张量,包含了从区间[0,1)的均匀分布中抽取的一组随机数,其形状由整数序列sizes定义;
torch.randn(sizes):返回一个张量,包含了从标准正态分布(均值为0,方差为1,即高斯白噪声)中抽取一组随机数,其形状由整数序列sizes定义。
利用torch.size()可获得张量的大小,示例如下:

a = torch.randn(2,2)
print(a)
print(a.size())
输出结果:

1.5346 -0.1640
 0.7025  1.7613
[torch.FloatTensor of size 2x2]

torch.Size([2, 2])

Numpy 中提供了矩阵和数组的切片、索引等操作,使用户可以便利的对数据进行处理,而 Tensor 中也有类似的操作,赶快来看一看吧!

任务描述

本关希望同学们掌握张量的切片、索引操作,便于对数据进行处理和分析,提取出用户感兴趣的数据。

本关任务:本关声明了一个 tensor变量t,根据要求对其进行索引切片操作,实现正确输出。其中,涉及到正序索引、逆序索引,步长为3的索引操作。

相关知识

Python 中的切片非常灵活,一行代码就可以实现多行循环完成的动作。而数据中往往包含着大量的冗余信息,利用切片、索引操作对数据进行预处理,可以为后续的操作提供极大的便利。

Tensor 对象的内容,可以通过索引或切片来访问和修改,就像 Python 的内置容器对象一样。

索引

1、一维 Tensor

一维 Tensor 的索引和 Python 列表类似。

正序索引
Tensor 的索引值从0开始,范围为0到size-1。

应用示例:

import torch
t = torch.Tensor(range(5))
print(t)
print(t[1])
print(t[0:3])

当索引为单个值时,返回一个数值;当索引是一段范围时,如上式的[0:3],其范围包括上界不包括下界,即[0,3),返回三个值的新张量。

输出结果:

# t
 0
 1
 2
 3
 4
[torch.FloatTensor of size 5]
#t[1]
1.0
#t[0:3]
 0
 1
 2
[torch.FloatTensor of size 3]

逆序索引( tensor[ :,-1])

同 Python 的列表一样,Tensor 也可以选择用逆序索引。此时,最后一个值的索引为-1。

应用示例:

print("Inverted indexing :{}".format(t[:-1]))

输出结果:

Inverted indexing :
 0
 1
 2
 3
[torch.FloatTensor of size 4]

负索引(tensor[-3])
由逆序索引类推,可用-2索引到Tensor的倒数第二个值,-3索引到Tensor的倒数第三个值,依次类推……

应用示例:

print("Negative indexing :{}".format(t[-3:-1]))

这里需要同学们注意的是,注意索引值的大小,始终是小值在冒号的前面,大值在后。若写成t[-1,-3]将会报错。

输出结果:

Negative indexing :
 2
 3
[torch.FloatTensor of size 2]

2、二维 Tensor

在多维 Tensor 中,如果省略了后面的索引,则返回的对象会是一个维度低一点的Tensor。

切片

1、一维 Tensor

一维 Tensor的切片和 Python 列表类似。

如前所述,Tensor 对象中的元素遵循基于零的索引。

基本切片通过将start,stop和step参数提供给内置的slice函数来构造一个 Python slice对象。 此slice对象被传递给Tensor 来提取Tensor 的一部分。

s = slice(2,5,2) 
print("Slicing Tensor : {}".format(t[s]))
print(t[2:5:2 ])

在上面的例子中,Tensor 对象由range()函数创建。 然后,分别用起始、终止和步长值2、5和2定义切片对象。 当这个切片对象传递给Tensor 时,会对它的一部分进行切片,从索引2到5,步长为2。

通过将由冒号分隔的切片参数start:stop:step),直接提供给Tensor 对象,也可以获得相同的结果。

输出结果:

Slicing Tensor : 
 2
 4
[torch.FloatTensor of size 2]

 2
 4
[torch.FloatTensor of size 2]

2、二维 Tensor

二维Tensor也可指定 step 进行切片。

基本格式:

tensor[r1 : r2 : step, c1 : c2 : step]

应用示例:

tensor = torch.Tensor([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
print(tensor[0:3:2,:])

上式选取了行位置的起始位置为0,终止位置为3,步长为 2,即第一行和第三行,而列位置则没有进行切片,输出结果如下。

输出结果:

1  2  3
 7  8  9
[torch.FloatTensor of size 2x3]

常用函数

Pytorch 提供了许多用于切片和索引的函数,这里只介绍几种最为常见的函数:

torch.chunk(tensor, chunks, dim=0)
用途:将张量沿给定维度拆分成若干块。

参数:

参数名 参数类型 说明

tensor	Tensor	将要进行拆分的张量
chunks	int	返回的块数
dim	int	沿着那个维度进行拆分,从0开始
torch.cat(seq, dim=0, out=None) → Tensor

用途:在给定维度上连接张量的给定序列。

参数:

参数名 参数类型 说明

seq	sequence of Tensors	可以是任何相同类型的张量的 Python序列
dim	int, optional	张量连接的维数
out	Tensor, optional	输出参数
torch.unsqueeze(input, dim, out=None)

用途:返回在指定位置插入尺寸为1的新张量。

参数:

参数名 参数类型 说明

input	Tensor	输入的张量
dim	int	插入单个维度的索引
out	Tensor, optional	结果张量

应用示例:

print("chunk : {}".format(torch.chunk(tensor,2,dim=0)))
print("cat : {}".format(torch.cat((tensor,tensor),1)))

输出参数:

chunk : (
 1  2  3
 4  5  6
[torch.FloatTensor of size 2x3]
, 
  7   8   9
 10  11  12
[torch.FloatTensor of size 2x3]
)
cat : 
  1   2   3   1   2   3
  4   5   6   4   5   6
  7   8   9   7   8   9
 10  11  12  10  11  12
[torch.FloatTensor of size 4x6]

add 语句

此处 将两个同形矩阵相加有三种语法结构:

import torch
x = torch.Tensor(2, 3)
y = torch.rand(2, 3)

语法一: x + y

应用示例:

print( x+y )
#输出结果:
#0.4264  0.6078  0.7178
# 0.4083  0.1835  0.1339
#[torch.FloatTensor of size 2x3]

语法二: torch.add (x, y)

应用示例:

print( torch.add(x, y)  )
#输出结果:
#0.4264  0.6078  0.7178
# 0.4083  0.1835  0.1339
#[torch.FloatTensor of size 2x3]

语法三: y.add _(x)

应用示例:

y.add_(x)
print(y)
#输出结果:
#0.4264  0.6078  0.7178
# 0.4083  0.1835  0.1339
#[torch.FloatTensor of size 2x3]

注意: 会改变 tensor的函数操作会用一个下划线后缀来标示。

比如, y.add _(x) 会在原地求和,并返回改变后的 tensor,而 y.add (x)将会在一个新的 tensor 中计算结果, y 本身不改变。

常用函数
设有一个张量 t。

函数 描述

torch.sqrt(t)	返回一个新张量,元素为输入的元素开方后的结果
torch.round(t)	返回一个新张量,元素为输入的元素四舍五入到最接近的整数
torch.sign(t)	返回一个新张量,元素为输入的元素的符号,正为1,负为-1
torch.transpose(t)	返回一个新张量,为原来张量的转置
torch.abs(t)	返回一个新张量,元素为输入元素的绝对值
torch.ceil(t)	返回一个新张量,元素为大于输入元素最小的整数
torch.cos(t)	返回一个新张量,元素为输入元素的 cos值
torch.sin(t)	返回一个新张量,元素为输入元素的sin值

应用示例:

import torch
a = torch.randn(4)
print(a)
print(torch.ceil(a))

输出结果:

# a
-1.0305
 1.3372
 0.0820
-1.1551
[torch.FloatTensor of size 4]

# torch.ceil(a)
-1
 2
 1
-1
[torch.FloatTensor of size 4]

本关介绍了利用view() 方法,返回具有相同数据但大小不同的新张量,从而达到了 reshape 的作用;同时利用transpose ()使给定的维度dim0和dim1被交换。

本关任务

:本关声明了一个 tensor变量t,利用view()对其进行维度的转换,并在零位置插入尺寸为1的新张量,由此扩充原始张量t。

相关知识

在编程中,我们常常需要对 Tensor 进行 reshape 的操作,比如转置、扩充张量等操作。

view()

基本语法:

view(*args) → Tensor

用途:返回具有相同数据但大小不同的新张量。

参数说明:

args(torch.Size或 int … ) : 所需的大小,返回的张量共享相同的数据,并且必须具有相同数量的元素,但是可能具有不同的大小。张量必须contiguous()才能被查看。
应用示例:

y = torch.randn(5, 10, 15)
print(y.size())
print(y.view(-1, 15).size()) # Same as doing y.view(50, 15)
print(y.view(-1, 15).unsqueeze(1).size()) # Adds a dimension at index 1.
args参数中的-1表示根据另一个维度自动变换。还记得我们在第三节中提到的unsqueeze(),它将返回在指定位置插入一个维度的新张量。

输出结果:

torch.Size([5, 10, 15])
torch.Size([50, 15])
torch.Size([50, 1, 15])

转置

由下面两种转置产生的结果张量,与输入张量共享它的底层存储,所以改变其中的内容会改变另一个的内容。

x.t()

基本语法:

torch.t(input, out=None) → Tensor

用途:将输入的2D张量转置其维度0和1。

参数:

input (Tensor) :输入张量
out (Tensor, optional) : 结果张量
应用示例:

x = torch.randn(5, 10)
print(x.t().size())
输出结果:

torch.Size([10, 5])

注意: torch.t (input, out=None)只适用于 2D 张量。

x.transpose(0,1)

基本语法:

torch.transpose(input, dim0, dim1, out=None) → Tensor

用途:返回一个作为输入转置版本的张量。给定的维度dim0和dim1被交换。

参数:

input (Tensor) : 输入张量
dim0 (int) : 第一个转置的维度
dim1 (int) : 第二个转置的维度

应用示例:

print(y.transpose(0, 1).size())
print(y.transpose(1, 2).size())

输出结果:

torch.Size([10, 5, 15])
torch.Size([5, 15, 10])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值