目錄
引言
多維張量數(shù)據(jù)結(jié)構(gòu)
數(shù)學(xué)運(yùn)算
序列化功能
CUDA 支持
其他實(shí)用工具
PyTorch的關(guān)鍵特性
torch相關(guān)函數(shù)演示和簡介
is_tensor
函數(shù)作用
使用技巧
使用方法和示例
展示結(jié)果
is_storage
存儲對象(Storage)簡介
函數(shù)作用
使用技巧
使用方法和示例
is_complex
函數(shù)作用
使用技巧
使用方法和示例
is_conj
函數(shù)作用
使用技巧
使用方法和示例
is_floating_point
函數(shù)作用
使用技巧
使用方法和示例
is_nonzero
函數(shù)作用
使用注意點(diǎn)
使用方法和示例
set_default_dtype
函數(shù)作用
使用注意點(diǎn)
使用方法和示例
get_default_dtype
函數(shù)作用
使用注意點(diǎn)
使用方法和示例
set_default_device
函數(shù)作用
使用注意點(diǎn)
使用方法和示例
set_default_tensor_type
函數(shù)作用
使用注意點(diǎn)
使用方法和示例
numel
函數(shù)作用
使用方法和示例
set_printoptions
函數(shù)作用
參數(shù)詳解
使用方法和示例
set_flush_denormal
函數(shù)作用
使用注意點(diǎn)
使用方法和示例
引言
torch 是一個功能豐富的庫,是 PyTorch 框架的核心,用于深度學(xué)習(xí)和張量計算。它提供了一系列工具和功能,使得科學(xué)計算和機(jī)器學(xué)習(xí)更加高效和易于操作。
torch 提供了多維張量(Tensor)的數(shù)據(jù)結(jié)構(gòu),這是其最基本的組成部分。張量在 PyTorch 中類似于 NumPy 的數(shù)組,但與此同時,它們還能在 GPU 上進(jìn)行計算以加速運(yùn)行速度。- 張量用于存儲和操作數(shù)據(jù),是深度學(xué)習(xí)模型中各種計算的基礎(chǔ)。
torch 定義了一系列的數(shù)學(xué)運(yùn)算來操作這些張量,例如加法、乘法、轉(zhuǎn)置等,以及更高級的操作,如矩陣乘法、卷積等。- 這些運(yùn)算是構(gòu)建和訓(xùn)練深度學(xué)習(xí)模型的基石,用于實(shí)現(xiàn)前向傳播和反向傳播算法。
torch 提供了有效的工具來序列化和反序列化張量數(shù)據(jù),使得數(shù)據(jù)的保存和加載變得容易。- 序列化對于模型的持久化存儲、分享和部署至關(guān)重要。
CUDA 支持
- 通過其 CUDA 對應(yīng)部分,
torch 允許張量計算在 NVIDIA GPU 上運(yùn)行,條件是 GPU 的計算能力需要大于等于 3.0。 - 使用 GPU 可以顯著加快訓(xùn)練過程,特別是在處理大型神經(jīng)網(wǎng)絡(luò)和大規(guī)模數(shù)據(jù)集時。
其他實(shí)用工具
torch 還包括其他多種實(shí)用工具,如自動微分(重要于神經(jīng)網(wǎng)絡(luò)訓(xùn)練中的反向傳播)、數(shù)據(jù)集加載和處理工具等。- 這些工具使得從數(shù)據(jù)處理到模型訓(xùn)練的整個流程更加高效和標(biāo)準(zhǔn)化。
總之,torch 包作為 PyTorch 框架的核心,為深度學(xué)習(xí)和廣泛的科學(xué)計算提供了強(qiáng)大的工具和功能。它的靈活性和易用性使得開發(fā)、訓(xùn)練和部署深度學(xué)習(xí)模型變得更加簡單和高效。
PyTorch的關(guān)鍵特性
-
張量(Tensors):PyTorch的核心是張量。張量在PyTorch中是多維數(shù)組,類似于NumPy數(shù)組,但它們具有在GPU上運(yùn)行的附加優(yōu)勢。它們是PyTorch的基礎(chǔ)構(gòu)件,用于各種操作。 -
CUDA支持:PyTorch提供對CUDA的支持,允許在NVIDIA GPU上進(jìn)行張量計算,前提是GPU的計算能力需要大于等于3.0。這意味著你可以將你的張量計算無縫遷移到GPU上,從而實(shí)現(xiàn)顯著的性能提升。
torch相關(guān)函數(shù)演示和簡介
torch.is_tensor 是 PyTorch 中的一個函數(shù),用來判斷給定的對象是否是一個 PyTorch 張量(Tensor)。這個函數(shù)非常有用,特別是在你處理多種數(shù)據(jù)類型時,需要確認(rèn)某個對象是否為PyTorch張量的情況下。
函數(shù)作用
- 目的:
torch.is_tensor 的主要目的是進(jìn)行類型檢查,即確認(rèn)一個對象是否為 PyTorch 的 Tensor 類型。 - 使用場景: 在混合不同類型數(shù)據(jù)(如列表、數(shù)組、張量等)的處理或計算中,確保進(jìn)行張量相關(guān)操作的對象確實(shí)是張量。
使用技巧
- 類型檢查: 盡管
torch.is_tensor 可以用來檢查一個對象是否為張量,但在進(jìn)行類型檢查時,使用 isinstance(obj, Tensor) 通常更推薦。這是因為 isinstance 對于類型檢查來說更加明確,且更適合于類型提示工具(如mypy)。 - 調(diào)試和驗證: 當(dāng)編寫涉及多種數(shù)據(jù)結(jié)構(gòu)的復(fù)雜代碼時,使用
torch.is_tensor 可以幫助調(diào)試和驗證數(shù)據(jù)類型,確保傳入的參數(shù)是正確的類型。
使用方法和示例
以下是一個使用 torch.is_tensor 的簡單例子:
x = torch.tensor([1, 2, 3]) # 使用torch.is_tensor來檢查x是否為張量如果是則返回true,不是則返回false print("x is not a tensor")
展示結(jié)果
在上面的代碼中,輸出將會是:
x is a tensor
這是因為變量 x 被創(chuàng)建為一個 PyTorch 張量,所以 torch.is_tensor(x) 返回 True。
torch.is_storage 是 PyTorch 庫中的一個函數(shù),用于判斷給定的對象是否是一個 PyTorch 存儲對象(Storage Object)。在深入了解其用途之前,我們首先需要明白什么是 PyTorch 的存儲對象。
存儲對象(Storage)簡介
PyTorch 中的存儲對象是一種底層數(shù)據(jù)結(jié)構(gòu),用于持有張量(Tensor)的數(shù)據(jù)。每個張量都與一個存儲對象相關(guān)聯(lián),該對象實(shí)際上包含了張量的數(shù)據(jù)。雖然多個張量可以共享相同的存儲,但它們可以有不同的視圖(比如不同的大小和步長)。
函數(shù)作用
- 目的:
torch.is_storage 的主要目的是確認(rèn)一個對象是否為 PyTorch 的存儲對象。 - 使用場景: 這個函數(shù)在底層數(shù)據(jù)操作和高級張量處理中非常有用,尤其是在你需要處理直接存儲數(shù)據(jù)或者進(jìn)行優(yōu)化和內(nèi)存管理時。
使用技巧
- 內(nèi)存和性能優(yōu)化: 在進(jìn)行內(nèi)存優(yōu)化或者性能調(diào)優(yōu)時,了解張量背后的存儲機(jī)制是非常重要的。使用
torch.is_storage 可以幫助你在調(diào)試和開發(fā)過程中確認(rèn)對象是否為存儲對象。 - 深入理解張量: 理解存儲對象可以幫助你更深入地理解張量是如何在 PyTorch 中表示和處理的。
使用方法和示例
以下是使用 torch.is_storage 的一個示例:
x = torch.tensor([1, 2, 3]) # 獲取與張量x關(guān)聯(lián)的存儲對象 # 檢查storage是否為PyTorch存儲對象 if torch.is_storage(storage): print("storage is a PyTorch storage object") print("storage is not a PyTorch storage object") ## storage is a PyTorch storage object ## 這表明變量 storage 是與張量 x 相關(guān)聯(lián)的 PyTorch 存儲對象。
torch.is_complex 是 PyTorch 中的一個函數(shù),用于判斷給定的張量是否是復(fù)數(shù)數(shù)據(jù)類型。這個函數(shù)特別有用在處理涉及復(fù)數(shù)運(yùn)算的場景中,比如信號處理或者某些特定的數(shù)學(xué)計算。
函數(shù)作用
- 目的: 確認(rèn)輸入張量的數(shù)據(jù)類型是否為復(fù)數(shù)類型。在 PyTorch 中,復(fù)數(shù)類型主要有
torch.complex64 和 torch.complex128 。 - 使用場景: 當(dāng)你的代碼涉及到復(fù)數(shù)運(yùn)算時,使用
torch.is_complex 可以確保你的輸入是合適的數(shù)據(jù)類型,從而避免類型不匹配導(dǎo)致的錯誤。
使用技巧
- 數(shù)據(jù)類型驗證: 在執(zhí)行涉及復(fù)數(shù)的操作之前,使用
torch.is_complex 來驗證數(shù)據(jù)類型可以確保代碼的正確性和穩(wěn)定性。 - 調(diào)試和開發(fā): 在開發(fā)和調(diào)試階段,特別是在進(jìn)行數(shù)學(xué)和算法的實(shí)現(xiàn)時,確認(rèn)輸入是否為復(fù)數(shù)類型非常重要。
使用方法和示例
以下是 torch.is_complex 的使用示例:
# 創(chuàng)建一個復(fù)數(shù)類型的張量 z = torch.tensor([1 + 1j, 2 + 2j], dtype=torch.complex64) # 使用torch.is_complex來檢查z是否為復(fù)數(shù)類型 is_complex = torch.is_complex(z) print(is_complex) # 輸出結(jié)果: True # 創(chuàng)建一個非復(fù)數(shù)類型的張量 x = torch.tensor([1, 2, 3]) # 再次使用torch.is_complex來檢查x is_complex_x = torch.is_complex(x) print(is_complex_x) # 輸出結(jié)果: False
在上述代碼中,torch.is_complex(z) 的結(jié)果是 True ,因為 z 是一個復(fù)數(shù)類型的張量。而 torch.is_complex(x) 的結(jié)果是 False ,因為 x 是一個實(shí)數(shù)類型的張量。
torch.is_conj 是 PyTorch 庫中的一個函數(shù),用于判斷一個張量是否為共軛張量。這個函數(shù)在處理涉及復(fù)數(shù)張量的場景,特別是在涉及共軛運(yùn)算的數(shù)學(xué)和工程計算中非常有用。
函數(shù)作用
- 目的:
torch.is_conj 的主要作用是檢查輸入的張量是否已經(jīng)被設(shè)置為共軛狀態(tài),即其共軛位是否為True。 - 使用場景: 在執(zhí)行涉及復(fù)數(shù)張量的共軛操作時,這個函數(shù)可以確保你正在處理的是正確的張量類型。這在某些算法中非常重要,比如在信號處理和復(fù)數(shù)域中的數(shù)學(xué)計算。
使用技巧
- 共軛狀態(tài)確認(rèn): 在進(jìn)行共軛操作或處理共軛數(shù)據(jù)時,使用
torch.is_conj 確認(rèn)張量的共軛狀態(tài)可以避免可能的錯誤。 - 算法實(shí)現(xiàn)與調(diào)試: 在實(shí)現(xiàn)和調(diào)試涉及復(fù)數(shù)運(yùn)算的算法時,
torch.is_conj 是一個有用的工具,可以幫助開發(fā)者理解和追蹤張量的狀態(tài)。
使用方法和示例
以下是 torch.is_conj 的使用示例:
# 創(chuàng)建一個復(fù)數(shù)張量 z = torch.tensor([1 + 1j, 2 + 2j], dtype=torch.complex64) # 假設(shè)我們對z進(jìn)行了共軛操作 # 注意:PyTorch在某些版本中可能沒有提供直接的共軛操作函數(shù) # 使用torch.is_conj來檢查z是否為共軛張量 is_conjugated = torch.is_conj(conj_z) print(is_conjugated) # 輸出結(jié)果: True 或 False,取決于是否進(jìn)行了共軛操作
在上述代碼中,由于 PyTorch 在某些版本中可能還沒有提供直接的共軛操作或共軛位的設(shè)置,所以 torch.is_conj 函數(shù)的具體使用可能受到限制。但是,其基本用途是用于檢查一個張量是否被設(shè)置為共軛狀態(tài)。
torch.is_floating_point 是 PyTorch 中的一個函數(shù),用于判斷一個張量的數(shù)據(jù)類型是否為浮點(diǎn)類型。這個函數(shù)在處理涉及浮點(diǎn)運(yùn)算的場景中非常有用,尤其是在精度和性能優(yōu)化方面。
函數(shù)作用
- 目的: 確認(rèn)輸入張量的數(shù)據(jù)類型是否為浮點(diǎn)類型。PyTorch 中的浮點(diǎn)類型包括
torch.float64 (雙精度浮點(diǎn)), torch.float32 (單精度浮點(diǎn)), torch.float16 (半精度浮點(diǎn)), 和 torch.bfloat16 。 - 使用場景: 在執(zhí)行數(shù)值計算時,尤其是涉及到精度要求或性能優(yōu)化的計算時,使用
torch.is_floating_point 可以確保輸入數(shù)據(jù)具有合適的數(shù)據(jù)類型。
使用技巧
- 精度和性能優(yōu)化: 在進(jìn)行深度學(xué)習(xí)模型的訓(xùn)練和推斷時,不同的浮點(diǎn)精度對性能和內(nèi)存占用有顯著影響。使用
torch.is_floating_point 可以幫助你確認(rèn)當(dāng)前的數(shù)據(jù)類型,從而做出相應(yīng)的優(yōu)化決策。 - 數(shù)據(jù)類型驗證: 在復(fù)雜的計算中,特別是涉及不同數(shù)據(jù)類型的操作時,使用
torch.is_floating_point 確保你的輸入數(shù)據(jù)是浮點(diǎn)類型,可以防止類型不匹配導(dǎo)致的錯誤。
使用方法和示例
以下是 torch.is_floating_point 的使用示例:
# 創(chuàng)建不同數(shù)據(jù)類型的張量 tensor_float64 = torch.tensor([1.0, 2.0, 3.0], dtype=torch.float64) tensor_int = torch.tensor([1, 2, 3]) # 檢查tensor_float64是否為浮點(diǎn)類型 print(torch.is_floating_point(tensor_float64)) # 輸出: True # 檢查tensor_int是否為浮點(diǎn)類型 print(torch.is_floating_point(tensor_int)) # 輸出: False
在上述代碼中,torch.is_floating_point(tensor_float64) 的結(jié)果是 True ,因為 tensor_float64 是一個雙精度浮點(diǎn)類型的張量。而 torch.is_floating_point(tensor_int) 的結(jié)果是 False ,因為 tensor_int 是一個整數(shù)類型的張量。
torch.is_nonzero 是 PyTorch 中的一個函數(shù),用于判斷一個單元素張量(tensor)是否非零。這個函數(shù)在進(jìn)行條件檢查和斷言時特別有用,尤其是在處理只包含一個元素的張量時。
函數(shù)作用
- 目的: 確認(rèn)輸入張量是一個單元素張量,并且這個元素的值不等于零。
- 使用場景: 通常用于條件判斷和斷言,特別是在需要驗證某個計算結(jié)果是否為非零值時。這在數(shù)學(xué)和算法編程中非常常見。
使用注意點(diǎn)
- 單元素張量:
torch.is_nonzero 只對單元素張量有效。如果輸入張量包含多于一個元素,或者是空的,函數(shù)將拋出 RuntimeError 。 - 類型轉(zhuǎn)換: 函數(shù)會根據(jù)需要進(jìn)行類型轉(zhuǎn)換。例如,布爾值
False 被視為 0 ,浮點(diǎn)數(shù)或整數(shù)中的 0 也被視為 0 。
使用方法和示例
以下是一些使用 torch.is_nonzero 的示例,包括它如何對不同的輸入做出反應(yīng):
print(torch.is_nonzero(torch.tensor([0.]))) # 輸出: False print(torch.is_nonzero(torch.tensor([1.5]))) # 輸出: True # 對于單元素布爾型張量False,返回False print(torch.is_nonzero(torch.tensor([False]))) # 輸出: False # 對于單元素整數(shù)型張量且元素不為0,返回True print(torch.is_nonzero(torch.tensor([3]))) # 輸出: True torch.is_nonzero(torch.tensor([1, 3, 5])) except RuntimeError as e: print(e) # 輸出: bool value of Tensor with more than one value is ambiguous torch.is_nonzero(torch.tensor([])) except RuntimeError as e: print(e) # 輸出: bool value of Tensor with no values is ambiguous
在這些示例中,我們可以看到 torch.is_nonzero 如何對不同類型和大小的張量做出反應(yīng)。特別需要注意的是,它只適用于單元素張量,且當(dāng)張量為空或包含多個元素時,會引發(fā)錯誤。
torch.set_default_dtype 是 PyTorch 庫中的一個函數(shù),用于設(shè)置 PyTorch 中默認(rèn)的浮點(diǎn)數(shù)據(jù)類型(dtype)。這個設(shè)置對于控制浮點(diǎn)數(shù)張量的默認(rèn)精度非常重要,特別是在創(chuàng)建新的張量時沒有明確指定數(shù)據(jù)類型的情況下。
函數(shù)作用
- 目的: 設(shè)置 PyTorch 中的默認(rèn)浮點(diǎn)數(shù)據(jù)類型。PyTorch 初始化時,默認(rèn)的浮點(diǎn)類型是
torch.float32 。torch.set_default_dtype 可以將其改為 torch.float32 或 torch.float64 。 - 使用場景: 用于控制新創(chuàng)建張量的默認(rèn)數(shù)據(jù)類型,尤其是在從 Python 的浮點(diǎn)數(shù)或復(fù)數(shù)創(chuàng)建張量時。此外,它還會影響復(fù)數(shù)張量的默認(rèn)數(shù)據(jù)類型和張量類型提升的結(jié)果。
使用注意點(diǎn)
- 支持類型: 僅支持
torch.float32 和 torch.float64 作為輸入。雖然其他數(shù)據(jù)類型可能被接受而不報錯,但它們并不受支持,且可能無法按預(yù)期工作。 - 類型推斷: 類似于 NumPy,當(dāng)設(shè)置默認(rèn)類型為
torch.float64 時,會促進(jìn)類似 NumPy 的類型推斷。 - 復(fù)數(shù)數(shù)據(jù)類型影響: 默認(rèn)的浮點(diǎn)類型也隱式?jīng)Q定了默認(rèn)的復(fù)數(shù)數(shù)據(jù)類型。例如,當(dāng)默認(rèn)浮點(diǎn)類型為
float32 時,默認(rèn)復(fù)數(shù)類型為 complex64 ;當(dāng)為 float64 時,默認(rèn)為 complex128 。
使用方法和示例
以下是 torch.set_default_dtype 的使用示例:
# 初始默認(rèn)的浮點(diǎn)類型為torch.float32 print(torch.tensor([1.2, 3]).dtype) # 輸出: torch.float32 # 初始默認(rèn)的復(fù)數(shù)類型為torch.complex64 print(torch.tensor([1.2, 3j]).dtype) # 輸出: torch.complex64 # 設(shè)置默認(rèn)的浮點(diǎn)類型為torch.float64 torch.set_default_dtype(torch.float64) # 現(xiàn)在Python浮點(diǎn)數(shù)被解釋為float64 print(torch.tensor([1.2, 3]).dtype) # 輸出: torch.float64 # 現(xiàn)在復(fù)數(shù)Python數(shù)字被解釋為complex128 print(torch.tensor([1.2, 3j]).dtype) # 輸出: torch.complex128
在這個示例中,我們可以看到在調(diào)用 torch.set_default_dtype(torch.float64) 后,新創(chuàng)建的浮點(diǎn)數(shù)和復(fù)數(shù)張量的數(shù)據(jù)類型分別變?yōu)?torch.float64 和 torch.complex128 。
torch.get_default_dtype 是 PyTorch 庫中的一個函數(shù),它用于獲取當(dāng)前設(shè)置的默認(rèn)浮點(diǎn)數(shù)據(jù)類型(dtype)。這個函數(shù)在需要確認(rèn)或記錄當(dāng)前環(huán)境的默認(rèn)浮點(diǎn)數(shù)據(jù)類型時非常有用,尤其是在進(jìn)行多種數(shù)據(jù)處理任務(wù)時,了解當(dāng)前的默認(rèn)數(shù)據(jù)類型有助于保持代碼的一致性和準(zhǔn)確性。
函數(shù)作用
- 目的: 獲取當(dāng)前 PyTorch 環(huán)境中的默認(rèn)浮點(diǎn)數(shù)據(jù)類型。
- 使用場景: 在需要根據(jù)當(dāng)前的默認(rèn)數(shù)據(jù)類型調(diào)整算法行為或者在進(jìn)行數(shù)據(jù)類型敏感的操作之前,使用此函數(shù)可以確保你了解當(dāng)前的默認(rèn)設(shè)置。
使用注意點(diǎn)
- 與
set_default_dtype 配合使用: torch.get_default_dtype 和 torch.set_default_dtype 通常一起使用,前者用于獲取當(dāng)前默認(rèn)的浮點(diǎn)類型,后者用于設(shè)置默認(rèn)的浮點(diǎn)類型。 - 受其他設(shè)置影響: 設(shè)置默認(rèn)張量類型(如通過
torch.set_default_tensor_type )也會影響默認(rèn)的浮點(diǎn)數(shù)據(jù)類型,因為不同的張量類型可能有不同的默認(rèn)數(shù)據(jù)類型。
使用方法和示例
以下是使用 torch.get_default_dtype 的示例:
# 獲取初始默認(rèn)的浮點(diǎn)數(shù)據(jù)類型 print(torch.get_default_dtype()) # 輸出: torch.float32,初始默認(rèn)的浮點(diǎn)類型 # 設(shè)置默認(rèn)的浮點(diǎn)數(shù)據(jù)類型為torch.float64 torch.set_default_dtype(torch.float64) # 獲取更改后的默認(rèn)數(shù)據(jù)類型 print(torch.get_default_dtype()) # 輸出: torch.float64 # 設(shè)置默認(rèn)的張量類型為torch.FloatTensor torch.set_default_tensor_type(torch.FloatTensor) # 再次獲取默認(rèn)的浮點(diǎn)數(shù)據(jù)類型 print(torch.get_default_dtype()) # 輸出: torch.float32,因為torch.FloatTensor的默認(rèn)類型是torch.float32
在這個示例中,我們首先獲取了初始的默認(rèn)浮點(diǎn)數(shù)據(jù)類型(torch.float32 ),然后將其更改為 torch.float64 ,并驗證了這一更改。隨后,我們改變了默認(rèn)的張量類型為 torch.FloatTensor ,這也導(dǎo)致默認(rèn)的浮點(diǎn)數(shù)據(jù)類型變回 torch.float32 。
torch.set_default_device 是 PyTorch 庫中的一個函數(shù),用于設(shè)置默認(rèn)的設(shè)備,以便在未明確指定設(shè)備時,新創(chuàng)建的 torch.Tensor 將被分配到該設(shè)備上。這個函數(shù)在需要統(tǒng)一管理張量分配位置的場景中非常有用,尤其是在進(jìn)行多設(shè)備計算時。
函數(shù)作用
- 目的: 設(shè)置 PyTorch 張量默認(rèn)的分配設(shè)備。這對于優(yōu)化代碼,使其在特定設(shè)備(如 GPU)上運(yùn)行非常有用。
- 使用場景: 在需要將大部分張量操作默認(rèn)在特定設(shè)備上執(zhí)行的情況下,如在 GPU 上進(jìn)行深度學(xué)習(xí)模型訓(xùn)練時。
使用注意點(diǎn)
- 初始默認(rèn)設(shè)備: 初始情況下,PyTorch 的默認(rèn)設(shè)備是 CPU。使用
torch.set_default_device 可以將其更改為 GPU 或其他設(shè)備。 - 不影響顯式指定的設(shè)備調(diào)用: 如果使用工廠函數(shù)(如
torch.tensor )并顯式指定了設(shè)備,這個設(shè)置不會影響那些調(diào)用。 - 性能成本: 使用此函數(shù)會在每次調(diào)用 PyTorch API 時帶來輕微的性能成本。
- 臨時更改設(shè)備: 如果只想臨時更改默認(rèn)設(shè)備,建議使用
with torch.device(device): 上下文管理器。
使用方法和示例
以下是 torch.set_default_device 的使用示例:
# 檢查一個新創(chuàng)建的張量默認(rèn)分配到哪個設(shè)備 print(torch.tensor([1.2, 3]).device) # 輸出: device(type='cpu') # 將默認(rèn)設(shè)備設(shè)置為 CUDA 設(shè)備 0 torch.set_default_device('cuda') # 再次檢查新創(chuàng)建的張量默認(rèn)分配到哪個設(shè)備 print(torch.tensor([1.2, 3]).device) # 輸出: device(type='cuda', index=0) # 將默認(rèn)設(shè)備設(shè)置為 CUDA 設(shè)備 1 多個顯卡這么搞 torch.set_default_device('cuda:1') # 再次檢查新創(chuàng)建的張量默認(rèn)分配到哪個設(shè)備 print(torch.tensor([1.2, 3]).device) # 輸出: device(type='cuda', index=1)
在這個示例中,我們首先檢查了新創(chuàng)建的張量默認(rèn)分配到 CPU。然后,我們將默認(rèn)設(shè)備更改為 CUDA 設(shè)備 0 和 CUDA 設(shè)備 1,并觀察到新創(chuàng)建的張量隨之分配到相應(yīng)的設(shè)備。
torch.set_default_tensor_type 是 PyTorch 庫中的一個函數(shù),用于設(shè)置默認(rèn)的 torch.Tensor 類型。特別地,這個設(shè)置影響浮點(diǎn)張量的默認(rèn)類型,也用于 torch.tensor() 函數(shù)中的類型推斷。
函數(shù)作用
- 目的: 設(shè)置默認(rèn)的
torch.Tensor 類型,特別是浮點(diǎn)張量的類型。這對于控制新創(chuàng)建的張量的數(shù)據(jù)類型非常重要。 - 使用場景: 當(dāng)你希望改變 PyTorch 中新創(chuàng)建的浮點(diǎn)張量的默認(rèn)類型時,這個函數(shù)非常有用。例如,如果你想要默認(rèn)所有新的浮點(diǎn)張量都是雙精度(
torch.float64 ),就可以使用這個函數(shù)來實(shí)現(xiàn)。
使用注意點(diǎn)
- 默認(rèn)類型: 初始情況下,PyTorch 的默認(rèn)浮點(diǎn)張量類型是
torch.FloatTensor ,即 torch.float32 。 - 類型設(shè)置: 該函數(shù)接受一個類型或其名稱作為參數(shù),用于設(shè)置默認(rèn)的張量類型。
- 類型推斷影響: 設(shè)置的默認(rèn)類型也會用于
torch.tensor() 中的類型推斷。例如,如果設(shè)置了 torch.DoubleTensor (即 torch.float64 ),那么在使用 torch.tensor() 創(chuàng)建張量時,沒有顯式指定類型的浮點(diǎn)數(shù)將默認(rèn)為 torch.float64 。
使用方法和示例
以下是 torch.set_default_tensor_type 的使用示例:
# 檢查一個新創(chuàng)建的浮點(diǎn)張量的默認(rèn)類型 print(torch.tensor([1.2, 3]).dtype) # 輸出: torch.float32 # 將默認(rèn)的浮點(diǎn)張量類型設(shè)置為雙精度浮點(diǎn)類型(torch.float64) torch.set_default_tensor_type(torch.DoubleTensor) # 再次檢查新創(chuàng)建的浮點(diǎn)張量的類型 print(torch.tensor([1.2, 3]).dtype) # 輸出: torch.float64
在這個示例中,我們首先檢查了新創(chuàng)建的浮點(diǎn)張量的默認(rèn)類型是 torch.float32 。然后,我們將默認(rèn)的浮點(diǎn)張量類型設(shè)置為 torch.DoubleTensor (即 torch.float64 ),并觀察到新創(chuàng)建的浮點(diǎn)張量類型隨之變?yōu)?torch.float64 。
torch.numel 是 PyTorch 庫中的一個函數(shù),用于返回輸入張量中的元素總數(shù)。這個函數(shù)在處理張量時非常有用,特別是當(dāng)你需要了解張量的大小或者在進(jìn)行形狀變換操作之前。
函數(shù)作用
- 目的: 計算并返回一個張量中的元素總數(shù)。
- 使用場景: 當(dāng)需要知道張量中包含多少個元素時,比如在分配內(nèi)存、調(diào)整張量形狀或在進(jìn)行某些特定的數(shù)學(xué)運(yùn)算之前,了解張量的總元素數(shù)量是非常重要的。
使用方法和示例
以下是 torch.numel 的使用示例:
# 創(chuàng)建一個隨機(jī)張量,形狀為1x2x3x4x5 a = torch.randn(1, 2, 3, 4, 5) # 使用torch.numel獲取張量a的元素總數(shù) print(torch.numel(a)) # 輸出: 120 # 使用torch.numel獲取張量b的元素總數(shù) print(torch.numel(b)) # 輸出: 16
在這個示例中,我們首先創(chuàng)建了一個形狀為 1x2x3x4x5 的張量 a ,它有 120 個元素。隨后,我們創(chuàng)建了一個 4x4 的零張量 b ,它有 16 個元素。使用 torch.numel 函數(shù),我們能夠快速得到這些張量中的元素數(shù)量。
torch.set_printoptions 是 PyTorch 庫中的一個函數(shù),用于設(shè)置張量打印時的格式選項。這個函數(shù)借鑒了 NumPy 的打印選項,使得在控制臺或日志文件中輸出的張量更易于閱讀和理解。
函數(shù)作用
- 目的: 自定義張量在打印時的顯示格式,包括浮點(diǎn)數(shù)精度、元素的顯示數(shù)量、每行的寬度等。
- 使用場景: 當(dāng)你需要在控制臺輸出或記錄較大張量時,適當(dāng)設(shè)置打印選項可以使輸出更加清晰和有助于理解。這在調(diào)試和展示數(shù)據(jù)時特別有用。
參數(shù)詳解
precision : 浮點(diǎn)數(shù)輸出的數(shù)字精度(默認(rèn)值為4)。threshold : 觸發(fā)摘要顯示而非完整顯示的元素總數(shù)(默認(rèn)值為1000)。edgeitems : 摘要顯示時,在每個維度的開始和結(jié)束顯示的元素數(shù)量(默認(rèn)值為3)。linewidth : 每行的字符數(shù),用于插入換行符(默認(rèn)值為80)。超過閾值的矩陣會忽略這個參數(shù)。profile : 美化打印的默認(rèn)設(shè)置??梢允褂蒙鲜鋈魏芜x項進(jìn)行覆蓋(可選值包括'default', 'short', 'full')。sci_mode : 啟用(True)或禁用(False)科學(xué)計數(shù)法。如果指定為None(默認(rèn)),則值由內(nèi)部的格式化設(shè)置決定。
使用方法和示例
以下是 torch.set_printoptions 的使用示例:
torch.set_printoptions(precision=2) print(torch.tensor([1.12345])) # 輸出: tensor([1.12]) torch.set_printoptions(threshold=5) print(torch.arange(10)) # 輸出: tensor([0, 1, 2, ..., 7, 8, 9]) torch.set_printoptions(profile='default') print(torch.tensor([1.12345])) # 輸出: tensor([1.1235]) print(torch.arange(10)) # 輸出: tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
在這個示例中,我們首先設(shè)置了浮點(diǎn)數(shù)的精度,然后設(shè)置了觸發(fā)摘要顯示的元素數(shù)量閾值。最后,我們使用 'default' 配置文件恢復(fù)了默認(rèn)的打印設(shè)置。
torch.set_flush_denormal 是 PyTorch 庫中的一個函數(shù),用于在 CPU 上禁用非正規(guī)化(denormal)浮點(diǎn)數(shù)。這個功能主要用于優(yōu)化性能,因為處理非正規(guī)化浮點(diǎn)數(shù)在某些情況下可能會導(dǎo)致顯著的性能下降。
函數(shù)作用
- 目的: 禁用 CPU 上的非正規(guī)化浮點(diǎn)數(shù)。非正規(guī)化數(shù)是非常接近于零的小數(shù),在浮點(diǎn)數(shù)運(yùn)算中它們可能導(dǎo)致性能問題。
- 使用場景: 當(dāng)你遇到由于處理非正規(guī)化浮點(diǎn)數(shù)而導(dǎo)致的性能問題時,使用這個函數(shù)可以幫助提升性能。它特別適用于深度學(xué)習(xí)或高性能計算場景。
使用注意點(diǎn)
- 系統(tǒng)支持:
torch.set_flush_denormal 僅在支持 SSE3 指令集的 x86 架構(gòu)上受支持。 - 返回值: 如果系統(tǒng)支持刷新非正規(guī)化數(shù)并且成功配置了刷新非正規(guī)化模式,則返回
True 。
使用方法和示例
以下是 torch.set_flush_denormal 的使用示例:
result = torch.set_flush_denormal(True) print(result) # 輸出: True,表示設(shè)置成功 # 創(chuàng)建一個非常小的浮點(diǎn)數(shù)張量,看其如何被處理 print(torch.tensor([1e-323], dtype=torch.float64)) # 輸出: tensor([ 0.], dtype=torch.float64) result = torch.set_flush_denormal(False) print(result) # 輸出: True,表示設(shè)置成功 # 再次創(chuàng)建同樣的浮點(diǎn)數(shù)張量,看其如何被處理 print(torch.tensor([1e-323], dtype=torch.float64)) # 輸出: tensor([9.88131e-324], dtype=torch.float64)
在這個示例中,我們首先啟用了刷新非正規(guī)化模式,然后創(chuàng)建了一個非常小的浮點(diǎn)數(shù)張量。由于刷新非正規(guī)化模式處于啟用狀態(tài),這個非常小的數(shù)被處理為零。隨后,我們禁用了該模式,再次創(chuàng)建同樣的張量時,這次這個小數(shù)沒有被處理為零。
總結(jié)
這篇博客全面而詳細(xì)地介紹了 PyTorch 框架及其核心組件 torch 的多種關(guān)鍵功能和使用場景。從基本的多維張量數(shù)據(jù)結(jié)構(gòu)和數(shù)學(xué)運(yùn)算,到高級功能如序列化、CUDA 支持以及各種實(shí)用工具,每個方面都進(jìn)行了深入的探討。特別地,博客還詳細(xì)演示了一系列 torch 相關(guān)函數(shù)(如 is_tensor , is_storage , is_complex , is_conj , is_floating_point , is_nonzero , set_default_dtype , get_default_dtype , set_default_device , set_default_tensor_type , numel , set_printoptions , set_flush_denormal )的用途、應(yīng)用場景和示例使用方法。通過這些內(nèi)容,讀者可以獲得對 PyTorch 功能的全面理解,明白如何在實(shí)際項目中有效地應(yīng)用這些工具,以優(yōu)化深度學(xué)習(xí)和科學(xué)計算的流程。
|