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])