Tensors教程

目录

  • Tensors简介
  • Tensors的初始化
  • Tensors的属性
  • Tensors的操作

注:本教程主要参考官方文档。

Tensors简介

Tensors是一种和arrays和matrices非常相似的专门化数据结构。在PyTorch中,模型的输入、输出和参数都是使用Tensors数据类型。
Tensors和NumPy的ndarrays也相似,不同的是Tensors可以在GPUs或者硬件加速器上运行。通常,Tensors和Numpy向量可以共享相同的内存,不需要拷贝数据。Tensors are also optimized for automatic differentiation.

import torch
import numpy as np

Tensors的初始化

Tensors的初始化方式有很多种

  1. 将其他数据类型转换为Tensors
# 将list转为tensors
data = [[1, 2],[3, 4]]
x_data = torch.tensor(data)  

# 将NumPy array转为tensors
np_array = np.array(data)
x_np = torch.from_numpy(np_array) 
# 注意:改变NumPy中的值,tensor的值也会变化。

# 将tensors转为numpy array
np_array = x_np.numpy() 
# 注意:改变tensor中的值,NumPy array的值也会变化。
  1. 其他方式

##1、list数据输入

shape = (2,3,)
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)

print(f"Random Tensor: \n {rand_tensor} \n")
print(f"Ones Tensor: \n {ones_tensor} \n")
print(f"Zeros Tensor: \n {zeros_tensor}")

# 输出:
# Random Tensor:
#  tensor([[0.5535, 0.4351, 0.6789],
#         [0.5910, 0.4788, 0.3394]])

# Ones Tensor:
#  tensor([[1., 1., 1.],
#         [1., 1., 1.]])

# Zeros Tensor:
#  tensor([[0., 0., 0.],
#        [0., 0., 0.]])

Tensors的属性

Tensors的属性包括shape(形状)、datatype(数据类型)、device(设备)

tensor = torch.rand(3,4)

print(f"Shape of tensor: {tensor.shape}")
print(f"Datatype of tensor: {tensor.dtype}")
print(f"Device tensor is stored on: {tensor.device}")

# 输出:
# Shape of tensor: torch.Size([3, 4])
# Datatype of tensor: torch.float32
# Device tensor is stored on: cpu

Tensors的操作

Tensors的操作非常多,包括数学运算、线性代数、矩阵操作(转置、索引、切片等)、采样等等,详细见这。
这些操作可以在GPU上运行。如果使用Colab分配一个GPU,通过:Runtime > Change runtime type > GPU
默认下,Tensors在CPU上被创建。如果要直接移动tensors到GPU,可以使用.to方法(在保证GPU可用的情况下)。但需要注意,将大量tensors复制到其他设备(devices)需要花费大量时间和内存。

# 移动到GPU上,如果可用
if torch.cuda.is_available():
    tensor = tensor.to("cuda")

下面是常用操作:
1、索引和切片
和numpy的索引和切片方式相同。

tensor = torch.ones(4, 4)
print(f"第一行: {tensor[0]}")
print(f"第一列: {tensor[:, 0]}")
print(f"最后一列: {tensor[..., -1]}")
tensor[:,1] = 0  # 索引
print(tensor)

2、连接
你可以使用torch.cat沿给定维数连接tensors序列。也可以使用[torch.stack](https://pytorch.org/docs/stable/generated/torch.stack.html),和torch.cat有点不同。

# 沿着 维度1(水平方向) 连接三个tensor
t1 = torch.cat([tensor, tensor, tensor], dim=1)
print(t1)
# 输出:
tensor([[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
        [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
        [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
        [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.]])

3、数学运算

# 下面计算两个tensor的乘积。 y1, y2, y3 将会是相同的结果。
y1 = tensor @ tensor.T
y2 = tensor.matmul(tensor.T)

y3 = torch.rand_like(y1)
torch.matmul(tensor, tensor.T, out=y3)


# 下面计算元素对应相乘. z1, z2, z3 将会有相同的结果。
z1 = tensor * tensor
z2 = tensor.mul(tensor)

z3 = torch.rand_like(tensor)
torch.mul(tensor, tensor, out=z3)

单个元素的tensors,可以使用item()将其转化为Python数值。

agg = tensor.sum()
agg_item = agg.item()
print(agg_item, type(agg_item))
# 12.0 

你可能感兴趣的:(PyTorch快速入门,pytorch,python,numpy)