前情提要
在上一篇文章中,我們詳細介紹瞭如何搭建一個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)