pytorch学习(六)

PyTorch 基础 : 张量

在第一章中我们已经通过官方的入门教程对PyTorch有了一定的了解,这一章会详细介绍PyTorch 里面的基础知识。 全部掌握了这些基础知识,在后面的应用中才能更加快速进阶,如果你已经对PyTorch有一定的了解,可以跳过此章

# 首先要引入相关的包
import torch
import numpy as np
#打印一下版本
torch.__version__

张量(Tensor)
张量的英文是Tensor,它是PyTorch里面基础的运算单位,与Numpy的ndarray相同都表示的是一个多维的矩阵。 与ndarray的最大区别就是,PyTorch的Tensor可以在 GPU 上运行,而 numpy 的 ndarray 只能在 CPU 上运行,在GPU上运行大大加快了运算速度。

下面我们生成一个简单的张量

x = torch.rand(2, 3)
x

以上生成了一个,2行3列的的矩阵,我们看一下他的大小:

# 可以使用与numpy相同的shape属性查看
print(x.shape)
# 也可以使用size()函数,返回的结果都是相同的
print(x.size())

张量(Tensor)是一个定义在一些向量空间和一些对偶空间的笛卡儿积上的多重线性映射,其坐标是|n|维空间内,有|n|个分量的一种量, 其中每个分量都是坐标的函数, 而在坐标变换时,这些分量也依照某些规则作线性变换。r称为该张量的秩或阶(与矩阵的秩和阶均无关系)。
下面我们来生成一些多维的张量:

y=torch.rand(2,3,4,5)
print(y.size())
y

在同构的意义下,第零阶张量 (r = 0) 为标量 (Scalar),第一阶张量 (r = 1) 为向量 (Vector), 第二阶张量 (r = 2) 则成为矩阵 (Matrix),第三阶以上的统称为多维张量。

其中要特别注意的就是标量,我们先生成一个标量:

scalar =torch.tensor(3.1433223)
print(scalar)
#打印标量的大小
scalar.size()

对于标量,我们可以直接使用 .item() 从中取出其对应的python对象的数值

scalar.item()

特别的:如果张量中只有一个元素的tensor也可以调用tensor.item方法

tensor = torch.tensor([3.1433223]) 
print(tensor)
tensor.size()
tensor.item()

基本类型
Tensor的基本数据类型有五种:

32位浮点型:torch.FloatTensor。 (默认)
64位整型:torch.LongTensor。
32位整型:torch.IntTensor。
16位整型:torch.ShortTensor。
64位浮点型:torch.DoubleTensor。
除以上数字类型外,还有 byte和chart型

long=tensor.long()
long
half=tensor.half()
half
int_t=tensor.int()
int_t
flo = tensor.float()
flo
short = tensor.short()
short
ch = tensor.char()
ch
bt = tensor.byte()
bt

Numpy转换
使用numpy方法将Tensor转为ndarray

a = torch.randn((3, 2))
# tensor转化为numpy
numpy_a = a.numpy()
print(numpy_a)

numpy转化为Tensor

torch_a = torch.from_numpy(numpy_a)
torch_a

Tensor和numpy对象共享内存,所以他们之间的转换很快,而且几乎不会消耗什么资源。但这也意味着,如果其中一个变了,另外一个也会随之改变。
设备间转换
一般情况下可以使用.cuda方法将tensor移动到gpu,这步操作需要cuda设备支持

cpu_a=torch.rand(4, 3)
cpu_a.type()
gpu_a=cpu_a.cuda()
gpu_a.type()
cpu_b=gpu_a.cpu()
cpu_b.type()
#使用torch.cuda.is_available()来确定是否有cuda设备
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(device)
#将tensor传送到设备
gpu_b=cpu_b.to(device)
gpu_b.type()

初始化
Pytorch中有许多默认的初始化方法可以使用

# 使用[0,1]均匀分布随机初始化二维数组
rnd = torch.rand(5, 3)
rnd
##初始化,使用1填充
one = torch.ones(2, 2)
one
##初始化,使用0填充
zero=torch.zeros(2,2)
zero
#初始化一个单位矩阵,即对角线为1 其他为0
eye=torch.eye(2,2)
eye

常用方法
PyTorch中对张量的操作api 和 NumPy 非常相似,如果熟悉 NumPy 中的操作,那么他们二者基本是一致的:

x = torch.randn(3, 3)
print(x)
# 沿着行取最大值
max_value, max_idx = torch.max(x, dim=1)
print(max_value, max_idx)
# 每行 x 求和
sum_x = torch.sum(x, dim=1)
print(sum_x)
y=torch.randn(3, 3)
z = x + y
print(z)

正如官方60分钟教程中所说,以_为结尾的,均会改变调用值

# add 完成后x的值改变了
x.add_(y)
print(x)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值