PyTorch官方60分钟教程笔记-TENSOR

 

注意:在观看本笔记前,你应该对Python、神经网络有基本的概念上的了解

import torch
import numpy as np

tensor初始化

  1. Python对象初始化

    data = [[1, 2], [3, 4]]
    x_data = torch.tensor(data)
    
  2. NumPy array初始化

    np_array = np.array(data)
    x_np = torch.from_numpy(np_array)
    
  3. 另一个tensor初始化

    x_ones = torch.ones_like(x_data) # 保留了x_data的属性
    print(f"Ones Tensor: \n {x_ones} \n")
    
    x_rand = torch.rand_like(x_data, dtype=torch.float) # 覆盖了x_data的dtype属性
    print(f"Random Tensor: \n {x_rand} \n")
    

    输出:

    Ones Tensor:
     tensor([[1, 1],
            [1, 1]])
    
    Random Tensor:
     tensor([[0.1047, 0.4214],
            [0.7751, 0.9202]])
    
常用初始化函数:
shape = (2, 3,) # 一个tuple,表示tensor的维度
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)

tensor属性

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

tensor操作

tensor支持超过100种操作,例如转置、索引、切片、数学操作、随机抽样等,更多描述在这里

如果可用,将tensor移至GPU上:

if torch.cuda.is_available():
  tensor = tensor.to('cuda')
  print(f"Device tensor is stored on: {tensor.device}")
类似numpy的索引和切片操作
tensor = torch.ones(4, 4)
tensor[:,1] = 0
print(tensor)

输出:

tensor([[1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.]])
Join操作
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.]])

和join类似的:stack操作

tensor乘法

元素相乘:

# 计算元素范围的乘积
print(f"tensor.mul(tensor) \n {tensor.mul(tensor)} \n")
# 另一种语法
print(f"tensor * tensor \n {tensor * tensor}")

计算矩阵乘法:

print(f"tensor.matmul(tensor.T) \n {tensor.matmul(tensor.T)} \n")
# 另一种语法
print(f"tensor @ tensor.T \n {tensor @ tensor.T}")
原位操作(会修改一个tensor本身)

有一个“_”后缀的即为原位操作

例:

tensor.add_(5)
转换为NumPy array
t = torch.ones(5)
n = t.numpy()

由ndarray转换来的tensor,ndarray变化,tensor也会变,反之亦然