一、torch.nonzero簡介
PyTorch是一個深度學習框架,torch.nonzero是其中一個常用的函數。它可以幫助我們找到一個張量中非零元素的索引。這個函數對於在深度學習任務中,尋找需要的數據的位置或者對數據進行操作非常有用。
我們來看一下它的函數定義:
torch.nonzero(input, out=None) -> Tensor
它的輸入是一個張量,輸出則是一個2列的張量,其中第i個行代表了input中第i個非零元素的索引。這個經常用來對結果進行處理。如果在輸入的張量中沒有非零元素,則結果將是一個0行2列的張量。
二、torch.nonzeros與torch.nonzero的不同之處
在深度學習的過程中,我們有時需要使用squeeze()函數將維度為1的維度去掉。不過,由於torch.squeeze()對維度為1的維度無法處理,我們需要使用torch.nonzeros()函數。
和torch.nonzero()函數不同,torch.nonzeros()函數返回的張量是一個元組,在元組中有各個小張量,這些小張量代表了非零元素的位置。
下面是一個使用torch.nonzeros()的例子:
import torch a = torch.randn(2, 2) a[1][1] = 0#隨機生成一個2x2的矩陣,第二行第二列的元素置為0 print(torch.nonzeros(a))
結果:tensor([0, 1, 1]), tensor([0, 0, 1])
當然,在許多情況下torch.nonzero也是很有用的,只需要在返回結果中使用某些特定的列,並且我們可以使用函數來找到一些特定的元素。
三、使用實例分析:
1. 找到分數最高的學生的索引
假設我們有以下數據,每個學生的成績包含下列四個元素:姓名,語文分數,數學分數,英語分數。我們可以通過torch.argmax()函數來得到最高分數的學生的索引。
import torch scores = torch.tensor([ ["Tom", 85.0, 70.0, 88.0], ["Jerry", 68.0, 90.0, 72.0], ["Mickey", 92.0, 90.0, 84.0] ]) scores[:, 1:] = scores[:, 1:].float() indices = torch.argmax(scores[:, 1:].sum(1))#返回沿着指定的軸的所有元素的總和的張量。 print(indices)
運行結果:tensor(2)
我們找到了分數最高的學生,索引為2。
2. 通過索引更改數據
假設我們有一條信息,它的每個元素都是一個數字。我們通過torch.nonzero()函數找到這個數組中的非零元素的位置。並且通過位置把它們的值全部更換為-1。
import torch data = torch.randn(10, 3, 4)#隨機生成一個10x3x4的張量 print(data) nonzero = torch.nonzero(data) data[nonzero[:, 0], nonzero[:, 1], nonzero[:, 2]] = -1 print(data)
運行結果:
tensor([[[ 0.6985, 0.6541, -0.6435, -0.8692], [-0.7543, 1.9164, -0.1396, 0.1368], [-1.3696, -0.8290, -0.6031, 0.7476]], [[ 1.1005, 0.4018, -0.5424, 0.2659], [-0.2727, -1.4804, -1.9228, -0.4452], [-0.9083, -0.8335, -1.1950, 2.8144]], [[ 0.4497, -0.1021, -1.3320, -1.3588], [-0.1672, 0.2023, -0.3156, 1.2721], [ 1.5732, 0.2276, -0.1561, 1.8255]], [[-0.7265, -0.0924, 0.4649, -0.5616], [-0.7947, 0.4614, 0.6878, -0.4110], [ 0.8458, -2.0662, -1.3018, 0.7605]], [[ 0.4411, -1.6426, 2.0690, -0.5102], [-1.9996, 0.4973, -0.8513, -0.8912], [ 0.2831, 0.0574, -0.2876, -0.9645]], [[ 0.1698, -1.1984, -0.3162, 1.5354], [-0.8763, -1.7511, -2.0049, -0.8586], [-1.6701, 0.0138, 0.4732, 0.9307]], [[ 0.2027, 0.9982, -1.4201, -0.1439], [ 0.8717, -1.1299, -0.9696, 1.0909], [-1.8889, 0.0404, -0.4895, 0.6088]], [[ 0.3395, -1.1325, -0.0518, 0.8898], [-1.4189, 0.2398, -1.8188, 1.2298], [-1.4087, -0.0418, 0.0131, 0.8699]], [[ 2.6099, 0.9482, 0.1749, 0.7233], [-0.8990, -0.3829, 0.4778, 1.8552], [ 1.3726, -0.3357, -1.4024, -1.2597]], [[ 0.0404, 0.3763, 0.3137, -0.6039], [ 0.4763, 0.1439, 0.5738, -0.4584], [-0.4458, -1.0648, 1.4215, 1.3238]]]) tensor([[[ 0.6985, 0.6541, -0.6435, -0.8692], [-1.0000, 1.9164, -0.1396, 0.1368], [-1.0000, -0.8290, -0.6031, 0.7476]], [[-1.0000, 0.4018, -0.5424, 0.2659], [-0.2727, -1.4804, -1.9228, -0.4452], [-0.9083, -0.8335, -1.1950, -1.0000]], [[ 0.4497, -0.1021, -1.3320, -1.3588], [-0.1672, 0.2023, -0.3156, 1.2721], [ 1.5732, 0.2276, -0.1561, 1.8255]], [[-0.7265, -0.0924, 0.4649, -0.5616], [-0.7947, 0.4614, 0.6878, -0.4110], [ 0.8458, -1.0000, -1.3018, 0.7605]], [[ 0.4411, -1.6426, -1.0000, -0.5102], [-1.9996, 0.4973, -0.8513, -0.8912], [ 0.2831, 0.0574, -0.2876, -0.9645]], [[ 0.1698, -1.1984, -0.3162, 1.5354], [-0.8763, -1.7511, -2.0049, -0.8586], [-1.6701, 0.0138, 0.4732, 0.9307]], [[ 0.2027, 0.9982, -1.4201, -0.1439], [ 0.8717, -1.1299, -0.9696, 1.0909], [-1.8889, 0.0404, -0.4895, 0.6088]], [[ 0.3395, -1.1325, -0.0518, 0.8898], [-1.4189, 0.2398, -1.8188, 1.2298], [-1.4087, -1.0000, 0.0131, 0.8699]], [[ 2.6099, 0.9482, 0.1749, 0.7233], [-0.8990, -0.3829, 0.4778, 1.8552], [ 1.3726, -0.3357, -1.4024, -1.2597]], [[ 0.0404, 0.3763, 0.3137, -0.6039], [ 0.4763, 0.1439, 0.5738, -0.4584], [-0.4458, -1.0648, 1.4215, 1.3238]]])
3.尋找張量中最大的值與最小的值
假設我們有一個具有六個元素的張量,其中四個元素是隨機整數,兩個元素是隨機浮點數。我們可以使用torch.max()函數和torch.min()函數來找到張量中的最大值和最小值。
import torch x = torch.randn(6)#隨機生成六個元素的張量 print(x) max_val, max_ind = torch.max(x, 0)#返回沿着指定的軸的所有元素的最大值,以及對應的索引 min_val, min_ind = torch.min(x, 0)#返回沿着指定的軸的所有元素的最小值,以及對應的索引 print(max_val, max_ind) print(min_val, min_ind)
運行結果:
tensor([ 1.0147, -0.3900, 0.5612, -1.8045, -0.1226, -0.6230]) tensor(1.0147) tensor(0) tensor(-1.8045) tensor(3)
四、總結
在本次文章中,我們詳細解析了torch.nonzero函數。我們介紹了torch.nonzero和torch.nonzeros兩個函數的不同,講解了它們的使用場景,給出了一些實例。希望讀者們能夠通過本文認識和掌握torch.nonzero這一函數,更好地應用到深度學習任務中。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/310011.html