前情提要
在上一篇文章中,我们详细介绍了如何搭建一个pytorch的环境,那么本篇文章我们即将揭开pytorch的神秘面纱,了解pytorch中的数据结构——Tensor。
概念问答
张量是什么? | 张量是一个多维数组。 |
张量与矩阵、向量、标量的关系是怎么样的呢 | 张量是标量、向量、矩阵的高维拓展 |
什么是Variable? | Variable是 torch.autograd 中的数据类型主要用于封装Tensor ,进行 自动求导 |
Variable“赋予”张量有什么功能? | 它赋予了张量一些属性(grad:数据的梯度,grad_fn:创建张量的function,requires_grad:是否需要梯度,is_leaf:是否是叶子节点(张量)) |
实操(张量的创建)
方法一:直接创建torch.tensor
import torch
import numpy as np
arr = np.ones((3, 3))
print("ndarray的数据类型:", arr.dtype)
# t = torch.tensor(arr, device='cuda')在gpu下跑
t = torch.tensor(arr)
print(t)
- 采用torch.from_numpy创建张量,并打印查看ndarray和张量数据的地址
#实验发现:从 torch.from_numpy 创建的 tensor 与原 ndarray 共享内存 ,当修
改其中一个的数据,另外一个也将会被改动
arr = np.array([[1, 2, 3], [4, 5, 6]])
t = torch.from_numpy(arr)
# print("numpy array: ", arr)
# print("tensor : ", t)
# print("\n修改arr")
# arr[0, 0] = 0
# print("numpy array: ", arr)
# print("tensor : ", t)
print("\n修改tensor")
t[0, 0] = -1
print("numpy array: ", arr)
print("tensor : ", t)
方法二:依据数值创建
方式比较多,后续会详细罗列,比如torch.zeros()
方法三:依概率分布创建张量
- 实现torch.normal()创建张量的四种模式(也就是正态分布的四种模式)
mean是标量 | std是标量 |
mean是标量 | std是张量 |
mean是张量 | std是标量 |
mean是张量 | std是张量 |
#python代码的实现
# mean:张量 std: 张量
# mean = torch.arange(1, 5, dtype=torch.float)
# std = torch.arange(1, 5, dtype=torch.float)
# t_normal = torch.normal(mean, std)
# print("mean:{}\nstd:{}".format(mean, std))
# print(t_normal)
# mean:标量 std: 标量
# t_normal = torch.normal(0., 1., size=(4,))
# print(t_normal)
# mean:张量 std: 标量
mean = torch.arange(1, 5, dtype=torch.float)
std = 1
t_normal = torch.normal(mean, std)
print("mean:{}\nstd:{}".format(mean, std))
print(t_normal)