目錄
- 一、torch.manual_seed(seed)
- 二、torch.cuda.manual_seed(seed)
- 三、torch.rand(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
- 四、給大家寫一個常用的自動選擇電腦cuda 或者cpu 的小技巧
- 五、torch.version.cuda;torch.backends.cudnn.version();打印cuda、cudnn版本
- 六、torch.autograd.grad()自動求梯度
我就基本的解釋一下吧,!
一、torch.manual_seed(seed)
功能: 用于手動設置 PyTorch 的隨機數生成器的種子。當你設置了一個特定的種子后,后續所有依賴隨機數生成的操作都會產生可重復的結果。
參數: seed 是一個整數,取值范圍通常是 32 位整數范圍(-2147483648 到 2147483647)。
示例代碼如下:
import torch# 設置隨機種子
torch.manual_seed(42)
# 生成隨機張量
tensor1 = torch.randn(2, 2)
print(tensor1)# 再次設置相同的種子
torch.manual_seed(42)
tensor2 = torch.randn(2, 2)
print(tensor2)# 驗證兩次生成的張量是否相同
print(torch.allclose(tensor1, tensor2)) # 輸出 True
運行結果如下圖:
(一般還有個torch.seed()但是被棄用了,因為每次都是隨機的結果,在科研啥的,一般都手動指定隨機數種子,)
先解釋一下,什么是隨機數種子:
PyTorch 中隨機數種子的作用原理
隨機數種子就像是隨機數生成器的起始狀態標識。在 PyTorch 里,隨機數生成器是基于特定的算法(如 Mersenne Twister 算法)來工作的。當你設置一個隨機數種子時,實際上是將隨機數生成器初始化為一個特定的狀態。
從這個特定狀態開始,隨機數生成器會按照
固定的算法規則
生成一系列隨機數。只要種子不變,每次從這個狀態開始生成的隨機數序列都是相同的。這就保證了在相同的代碼和相同的種子設置下,每次運行代碼時,所有依賴隨機數生成的操作(如初始化模型權重、打亂數據集等)都會產生相同的結果,從而實現實驗的可重復性。
例如,在神經網絡訓練中,我們通常會隨機初始化模型的權重。如果不設置隨機數種子,每次運行代碼時權重的初始化值都不同,那么模型的訓練結果也會有差異,不利于實驗結果的對比和分析。而通過設置固定的隨機數種子,我們可以確保每次運行代碼時模型的初始權重是相同的,這樣就可以更準確地評估不同訓練參數或方法對模型性能的影響。
二、torch.cuda.manual_seed(seed)
功能: 專門為 CUDA 設備(即 GPU)設置隨機數種子。如果你的代碼在 GPU 上運行,使用這個函數可以確保在 GPU 上的隨機操作具有可重復性。
參數: seed 同樣是一個整數。
import torchif torch.cuda.is_available():# 為 CUDA 設備設置隨機種子torch.cuda.manual_seed(42)# 在 GPU 上生成隨機張量device = torch.device("cuda")tensor = torch.randn(2, 2).to(device)print(tensor)
注意:沒有CUDA的就別跑了,會報錯的。
三、torch.rand(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
功能: 生成指定形狀的服從均勻分布的隨機數張量,取值范圍是 [0, 1)。
參數:
*size: 張量的形狀,例如 (2, 3) 表示生成一個 2 行 3 列的張量。
out: 可選參數,用于指定輸出張量。
dtype: 張量的數據類型。
layout: 張量的布局,一般使用默認的 torch.strided。
device: 張量存儲的設備,如 ‘cpu’ 或 ‘cuda’。
requires_grad: 是否需要計算梯度。
import torch# 生成一個 2 行 3 列的隨機張量
random_tensor = torch.rand(2, 3)
print(random_tensor)
示例結果:
四、給大家寫一個常用的自動選擇電腦cuda 或者cpu 的小技巧
import torch# 判斷 CUDA 是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Using device: {device}")
五、torch.version.cuda;torch.backends.cudnn.version();打印cuda、cudnn版本
import torch# 判斷 CUDA 是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")print(f"Using device: {device}")print(torch.cuda.is_available()) #查看是否有cuda
print(torch.backends.cudnn.is_available()) #查看是否有cudnn
print(torch.version.cuda) #打印cuda的版本
print(torch.backends.cudnn.version()) #打印cudnn的版本
我的運行結果如下:
大家如果有安裝環境有問題的也可以私信我哦~
六、torch.autograd.grad()自動求梯度
torch.autograd.grad()用于求取梯度;
函數原型:
torch.autograd.grad(outputs, inputs, grad_outputs=None, retain_graph=None, create_graph=False, only_inputs=True, allow_unused=False)
outputs:
類型:Tensor 或 Tensor 列表
描述:目標張量,即需要計算梯度的張量。
inputs:
類型:Tensor 或 Tensor 列表
描述:輸入張量,用于計算梯度的張量。
grad_outputs(可選):
類型:Tensor 或 Tensor 列表
描述:目標張量對應的梯度。如果outputs 是一個標量,則 grad_outputs 不需要指定;如果 outputs 是一個張量或張量列表,需要指定 grad_outputs 的形狀與之對應。
retain_graph(可選,默認值:None):
類型:布爾值
描述:是否保留計算圖。在默認情況下,計算圖在反向傳播后會被釋放以節省內存。如果需要多次反向傳播同一個計算圖,可以設置為 True。
create_graph(可選,默認值:False):
類型:布爾值
描述:是否創建新的計算圖。如果設置為 True,梯度計算將被跟蹤,生成的梯度張量將保留計算圖,從而允許進行高階導數的計算。
only_inputs(可選,默認值:True):
類型:布爾值
描述:是否只計算輸入張量的梯度。如果設置為 True,僅輸入張量的梯度會被計算。
allow_unused(可選,默認值:False):
類型:布爾值
描述:是否允許輸入張量未被使用。如果某些輸入張量未被 outputs 使用,并且沒有被計算梯度,則會拋出錯誤。如果設置為 True,這些未使用的輸入張量的梯度將返回為 None。
返回值
類型:Tensor 或 Tensor 列表
返回對應輸入張量的梯度。
outputs:是你希望對其進行求導的標量
import torch# 創建兩個張量,requires_grad=True 表示需要計算梯度
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = torch.tensor([4.0, 5.0, 6.0], requires_grad=True)# 定義一個函數 z = x * y
z = x * y# 使用 torch.autograd.grad() 計算梯度
grad_z_x = torch.autograd.grad(outputs=z, inputs=x, grad_outputs=torch.ones_like(z))print("梯度 dz/dx:", grad_z_x)
后面如果還有什么用到的,我會在這繼續更新…ing!