Pytorch笔记——Tensor

Tensors基础

基本定义

张量(Tensors)是pytorch中一种特殊的数据结构,类似于NumPy中的ndarrays,此外,Tensors可以用GPU进行计算
在高中和线性代数基本内容的学习中,我们对于标量(Scalar),向量(Vector),矩阵(Matrix)等有了比较深的认识。而张量,个人以为,其维数变化更加自由。
下面一张图来自于《Deep Learning with Pytorch》
在这里插入图片描述PyTorch中的Tensor与NumPy中的arrays非常相似,但PyTorch可以在GPU上或CPU上并行运算,并记录跟踪计算过程,这是Tensor的一大优势。

在Python中,常常用List来处理向量。下面是List与Tensor的对比

print("下面是对List的操作")
a = [1.0,1.0,1.0]
print(a[0])
a[2] = 3.0
print(a)

print("下面是对Tensor的操作")
b = torch.ones(3)
print(b)
print(b[1])
print(float(b[1]))
b[2] = 2.0
print(b)

输出结果如下
在这里插入图片描述
看起来,这两者区别不大
但在底层实现上,这两种方法却有明显的区别
Python中List和Tuple里,每个元素是一个Python对象,在内存中松散排列(下图中左部),相较之下,Tensor和Arrays中,使用了一个连续的内存块,每个元素为C数据类型,而非Python对象。

在这里插入图片描述
至于面对高维向量,List固然也能表示,但比较繁琐。相对而言,还是Tensor更香。下面用Tensor表示一个三角形

points = torch.tensor([[1.0,4.0],[2.0,1.0],[3.0,5.0]])
print(points)
print("points.shape:",points.shape)

下图是输出
在这里插入图片描述
TIPS

  • 可以先用Zeros填充每个元素,创造一个shape符合我们要求的张量,然后再改相应的值
  • torch.Size([3,2])是一个元组,所以torch.Size([3,2])支持左右的元组操作。

Tensors与Storages

上文提过,Tensor使用了一个连续的内存块。事实上,一块连续的内存(storage),可以对应多个不同的Tensor,而每一个Tensor,就是对这一块内存的一种view方法,就好像对于一串汉字,用不同的断句方式会产生不同的意思。
在这里插入图片描述从而,view方法成了改变Tensor的shape的一种很好的方法。在之后的操作部分会有介绍。

关于指向storage的方法,有几个量可以进行描述:size(shape),storage offset,strides

  • size:是一个tuple,表示每个维度有多少个元素
  • storate offset:表示在storage中,跳过几个元素再开始读(偏移量)。也可以认为是数据在storage中的索引
  • stride:步长,也是一个tuple。storage中对应于tensor的相邻维度间第一个索引的跨度

转置操作是非常常见的,那么在Tensor中,就是把stride的两个数调换位置
在这里插入图片描述在这里插入图片描述

数据类型

在这里插入图片描述

这些数据类型在之后的Tensor创建中都可以使用。

一些创建Tensor的方法

import torch
x = torch.empty(5,3)   #这是构建了一个未初始化的5*3矩阵
print(x)

输出见下图
在这里插入图片描述如果要初始化,则应为x=torch.rand(5,3)
定义矩阵中每个元素的数据类型,就需要加上dtype=torch.
x = torch.zeros(5,3,dtype=torch.long)
现在有了张量X,就可以根据已有的张量创建新的张量

x = x.new_ones(5, 3, dtype=torch.double)
x = torch.randn_like(x, dtype=torch.float)

相关操作

基本运算

x = torch.rand(5, 3)
y = torch.rand(5, 3)
x + y #直接使用+号
torch.add(x, y)
torch.add(x, y, out=result)#提供了一个输出张量作为参数
y.add_(x) #这一句是把x加到y上

#获得只有一个元素的Tensor的值
x = torch.randn(1)
x.item()

改变大小

x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)

从Tensor中取数据的方法

points[1:] #只去掉第一行
points[1:, :] 
points[1:, 0]#只去第一行,只取第一列

与NumPy交互

points = torch.ones(3, 4)
points_np = points.numpy()

如果这个Tensor在GPU上,在转到NumPy后,会分到CPU上

保存与加载Tensor

#save
torch.save(points, '../data/p1ch3/ourpoints.t')

#或者

with open('../data/p1ch3/ourpoints.t','wb') as f:
torch.save(points, f)

#load
points = torch.load('../data/p1ch3/ourpoints.t')

#或者

with open('../data/p1ch3/ourpoints.t','rb') as f:
points = torch.load(f)

GPU加速

points_gpu = torch.tensor([[1.0,4.0],[2.0,1.0],[3.0,5.0]],device='cuda') #这里用device='cuda'
points_gpu = points_gpu+4
print(points_gpu)

ngpu= 1
# Decide which device we want to run on
device = torch.device("cuda:0" if (torch.cuda.is_available() and ngpu > 0) else "cpu")
print(device)
print(torch.cuda.get_device_name(0))
print(torch.rand(3,3).cuda()) #使用.cuda()更为快捷,也可以用.cuda(0)或.cuda(1)来指定设备

在这里插入图片描述

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值