最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中的torch常用tensor處理函數(shù)示例詳解

 更新時(shí)間:2023年07月13日 10:19:49   作者:山頂夕景  
這篇文章主要介紹了python中的torch常用tensor處理函數(shù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

note 

一、tensor的創(chuàng)建

  • torch.tensor會(huì)復(fù)制data,不想復(fù)制可以使用torch.Tensor.detach()。
  • 如果是獲得numpy數(shù)組數(shù)據(jù),可以使用torch.from_numpy(),共享內(nèi)存
# 1. tensor
torch.tensor(data, dtype=None, device=None,requires_grad=False)
data - 可以是list, tuple, numpy array, scalar或其他類型
dtype - 可以返回想要的tensor類型
device - 可以指定返回的設(shè)備
requires_grad - 可以指定是否進(jìn)行記錄圖的操作,默認(rèn)為False
# example 1
torch.tensor([[0.1, 1.2], [2.2, 3.1], [4.9, 5.2]])
tensor([[ 0.1000,  1.2000],
[ 2.2000,  3.1000],
[ 4.9000,  5.2000]])
# example 2
torch.tensor([0, 1]) # Type inference on data
tensor([ 0, 1])
# example 3
torch.tensor([[0.11111, 0.222222, 0.3333333]],
dtype=torch.float64,
device=torch.device(‘cuda:0')) # creates a torch.cuda.DoubleTensor
tensor([[ 0.1111, 0.2222, 0.3333]], dtype=torch.float64, device=‘cuda:0')
torch.tensor(3.14159) # Create a scalar (zero-dimensional tensor)
tensor(3.1416)
torch.tensor([]) # Create an empty tensor (of size (0,))
tensor([])
# 2. 從numpy中獲得數(shù)據(jù)
torch.from_numpy(ndarry)
# 3. 創(chuàng)建特定數(shù)值的tensor
torch.zeros(*sizes, out=None, …)# 返回大小為sizes的零矩陣
1
torch.zeros_like(input, …) # 返回與input相同size的零矩陣
torch.ones(*sizes, out=None, …) #f返回大小為sizes的單位矩陣
torch.ones_like(input, …) #返回與input相同size的單位矩陣
torch.full(size, fill_value, …) #返回大小為sizes,單位值為fill_value的矩陣
torch.full_like(input, fill_value, …) 返回與input相同size,單位值為fill_value的矩陣
torch.arange(start=0, end, step=1, …) #返回從start到end, 單位步長為step的1-d tensor.
torch.linspace(start, end, steps=100, …) #返回從start到end, 間隔中的插值數(shù)目為steps的1-d tensor
torch.logspace(start, end, steps=100, …) #返回1-d tensor ,從10start到10end的steps個(gè)對(duì)數(shù)間隔
# 4. 隨機(jī)生成
torch.normal(mean, std, out=None)
torch.rand(*size, out=None, dtype=None, …) #返回[0,1]之間均勻分布的隨機(jī)數(shù)值
torch.rand_like(input, dtype=None, …) #返回與input相同size的tensor, 填充均勻分布的隨機(jī)數(shù)值
torch.randint(low=0, high, size,…) #返回均勻分布的[low,high]之間的整數(shù)隨機(jī)值
torch.randint_like(input, low=0, high, dtype=None, …) #
torch.randn(*sizes, out=None, …) #返回大小為size,由均值為0,方差為1的正態(tài)分布的隨機(jī)數(shù)值
torch.randn_like(input, dtype=None, …)
torch.randperm(n, out=None, dtype=torch.int64) # 返回0到n-1的數(shù)列的隨機(jī)排列

二、tensor的加減乘除

  • torch.mm : 用于兩個(gè)矩陣(不包括向量)的乘法。如維度為(l,m)和(m,n)相乘
  • torch.bmm : 用于帶batch的三維向量的乘法。如維度為(b,l,m)和(b,m,n)相乘
  • torch.mul : 用于兩個(gè)同維度矩陣的逐像素點(diǎn)相乘(點(diǎn)乘)。如維度為(l,m)和(l,m)相乘
  • torch.mv: 用于矩陣和向量之間的乘法(矩陣在前,向量在后)。如維度為(l,m)和(m)相乘,結(jié)果的維度為(l)。
  • torch.matmul : 用于兩個(gè)張量(后兩維滿足矩陣乘法的維度)相乘或者是矩陣與向量間的乘法,因?yàn)槠渚哂袕V播機(jī)制(broadcasting,自動(dòng)補(bǔ)充維度)。如維度為(b,l,m)和(b,m,n);(l,m)和(b,m,n);(b,c,l,m)和(b,c,m,n);(l,m)和(m)相乘等?!酒渥饔冒瑃orch.mm、torch.bmm和torch.mv】
  • @運(yùn)算符 : 其作用類似于torch.matmul
  • *運(yùn)算符 : 其作用類似于torch.mul
  • einsum(Einstein summation convention,即愛因斯坦求和約定)的用法:
  • c i k = ∑ j a i j b j k c_{i k}=\sum_j a_{i j} b_{j k} cik?=∑j?aij?bjk? 的寫法如下:
c = np.dot(a, b)                 # 常規(guī)
c = np.einsum('ij,jk->ik', a, b) # einsum
  • 再比如 c k l = ∑ i ∑ j a i j k b i j l c_{\mathrm{kl}}=\sum_{\mathrm{i}} \sum_{\mathrm{j}} \mathrm{a}_{\mathrm{ijk}} \mathrm_{\mathrm{ijl}} ckl?=∑i?∑j?aijk?bijl? : c = np.einsum('ijk,jkl->kl', a, b)
# 對(duì)數(shù)運(yùn)算
torch.log(input, out=None)  # y_i=log_e(x_i)
torch.log1p(input, out=None)  #y_i=log_e(x_i+1)
torch.log2(input, out=None)   #y_i=log_2(x_i)
torch.log10(input,out=None)  #y_i=log_10(x_i)
# 冪函數(shù)
torch.pow(input, exponent, out=None)  # y_i=input^(exponent)
# 指數(shù)運(yùn)算
torch.exp(tensor, out=None)    #y_i=e^(x_i)
torch.expm1(tensor, out=None)   #y_i=e^(x_i) -1

三、torch.argmax()函數(shù)

  • (1)torch.argmax(input, dim=None, keepdim=False)返回指定維度最大值的序號(hào);
  • (2)dim給定的定義是:the demention to reduce.也就是把dim這個(gè)維度的,變成這個(gè)維度的最大值的index。
import torch
a=torch.tensor([
              [
                  [1, 5, 5, 2],
                  [9, -6, 2, 8],
                  [-3, 7, -9, 1]
              ],
              [
                  [-1, 7, -5, 2],
                  [9, 6, 2, 8],
                  [3, 7, 9, 1]
              ]])
b=torch.argmax(a,dim=1)
print(a)
print(a.shape)
print(b)

(1)這個(gè)例子,tensor(2, 3, 4),因?yàn)槭?code>dim=1,即將第二維度去掉,變成tensor(2, 4),將每一個(gè)3x4數(shù)組,變成1x4數(shù)組。

[1, 5, 5, 2],
[9, -6, 2, 8],
[-3, 7, -9, 1]

如上所示的3×4矩陣,取每一列的最大值對(duì)應(yīng)的下標(biāo),a[0]中第一列的最大值的行標(biāo)為1, 第二列的最大值的行標(biāo)為2,第三列的最大值行標(biāo)為0,第4列的最大值行標(biāo)為1,所以最后輸出[1, 2, 0, 1],取每一列的最大值,結(jié)果為:

tensor([[[ 1,  5,  5,  2],
         [ 9, -6,  2,  8],
         [-3,  7, -9,  1]],
        [[-1,  7, -5,  2],
         [ 9,  6,  2,  8],
         [ 3,  7,  9,  1]]])
torch.Size([2, 3, 4])
tensor([[1, 2, 0, 1],
        [1, 0, 2, 1]])

(1)如果改成dim=2,即將第三維去掉,即取每一行的最大值對(duì)應(yīng)的下標(biāo),結(jié)果為tensor(2, 3)

import torch
a=torch.tensor([
              [
                  [1, 5, 5, 2],
                  [9, -6, 2, 8],
                  [-3, 7, -9, 1]
              ],
              [
                  [-1, 7, -5, 2],
                  [9, 6, 2, 8],
                  [3, 7, 9, 1]
              ]])
b=torch.argmax(a,dim=2)
print(b)
print(a.shape)
"""
tensor([[2, 0, 1],
        [1, 0, 2]])
torch.Size([2, 3, 4])
"""

四、gathter函數(shù)

torch.gather(input, dim, index, *, sparse_grad=False, out=None) → Tensor

torch.gather()函數(shù):利用index來索引input特定位置的數(shù)值dim = 1表示橫向。

對(duì)于三維張量,其output是:

out[i][j][k] = input[index[i][j][k]][j][k]  # if dim == 0
out[i][j][k] = input[i][index[i][j][k]][k]  # if dim == 1
out[i][j][k] = input[i][j][index[i][j][k]]  # if dim == 2

小栗子1

比如現(xiàn)在有4個(gè)句子(句子長度不一),現(xiàn)在的序列標(biāo)注問題需要給每個(gè)單詞都標(biāo)上一個(gè)標(biāo)簽,標(biāo)簽如下:

input = [
    [2, 3, 4, 5],
    [1, 4, 3],
    [4, 2, 2, 5, 7],
    [1]
]

長度分別為4,3,5,1,其中第一個(gè)句子的標(biāo)簽為2,3,4,5。在NLP中,一般需要對(duì)不同長度的句子進(jìn)行padding到相同長度(用0進(jìn)行padding),所以padding后的結(jié)果:

input = [
    [2, 3, 4, 5, 0, 0],
    [1, 4, 3, 0, 0, 0],
    [4, 2, 2, 5, 7, 0],
    [1, 0, 0, 0, 0, 0]
]

import torch
input = [
    [2, 3, 4, 5, 0, 0],
    [1, 4, 3, 0, 0, 0],
    [4, 2, 2, 5, 7, 0],
    [1, 0, 0, 0, 0, 0]
]
input = torch.tensor(input)
length = torch.LongTensor([[4], [3], [5], [1]])
# index之所以減1,是因?yàn)樾蛄芯S度從0開始計(jì)算的
out = torch.gather(input, 1, length - 1)
print(out)

out的結(jié)果為如下,比如length的第一行是[4],即找出input的第一行的第4個(gè)元素為5(這里length-1后就是下標(biāo)從1開始計(jì)算了)。

tensor([[5],
        [3],
        [7],
        [1]])

小栗子2:如果每行需要索引多個(gè)元素:

>>> t = torch.Tensor([[1,2],[3,4]])
1  2
3  4
>>> torch.gather(t,1,torch.LongTensor([[0,0],[1,0]])
1  1
4  3
[torch.FloatTensor of size 2x2]

五、針對(duì)某一維度的操作

  • mean
  • softmax
  • BN
  • LN

六、改變維度、拼接、堆疊等操作

import torch
x = torch.arange(12)
# tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
x1 = x.reshape(3, 4)  # 改變維度
x2 = x.reshape(-1, 4)
x3 = torch.zeros((2, 3, 4))
x4 = torch.ones((2, 3, 4)) # 所有元素都為1
# 正態(tài)分布
x5 = torch.randn(3, 4)
x6 = torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
# 都是按元素操作,注意**是求冪運(yùn)算
print(x + y, x - y, x * y, x / y, x ** y)
X = torch.arange(12, dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
# 每行(上下)拼接, dim=1為左右拼接
print(torch.cat((X, Y), dim=0), "\n", torch.cat((X, Y), dim=1))
# 判斷每個(gè)位置是否相同
X == Y
# 廣播機(jī)制, 兩個(gè)矩陣維度不同(數(shù)學(xué)上不能按元素相加),通過廣播(a賦值列,b賦值行)后相加
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
print(a + b)
# 切片和索引, 和numpy差不多
X[-1], X[1:3]
X[1, 2]
X[0:2, :] = 12  # 賦值

view改變維度,可以在其中一個(gè)維度傳參為-1,會(huì)自動(dòng)計(jì)算。

import torch
a = torch.arange(1, 7)
print(a)
b = a.view(2, 3)
print(b)
c = a.view(3, -1)
print(c)

flatten壓平操作

input1 = torch.tensor(range(2*3*4*5)).view(2, 3, 4, 5)
# input1.shape
torch.flatten(input1, start_dim = 1, end_dim=2).shape
# torch.Size([2, 12, 5])

repeat_interleave是將張量中的元素沿某一維度復(fù)制n次

import torch
x = torch.tensor([[1, 2, 3],[4,5,6]])
x1 = x.repeat_interleave(3,0)
print("x1:\n", x1)
x2 = x.repeat_interleave(3,1)
print("x2:\n",x2)
x1:
 tensor([[1, 2, 3],
        [1, 2, 3],
        [1, 2, 3],
        [4, 5, 6],
        [4, 5, 6],
        [4, 5, 6]])
x2:
 tensor([[1, 1, 1, 2, 2, 2, 3, 3, 3],
        [4, 4, 4, 5, 5, 5, 6, 6, 6]])
Process finished with exit code 0

其他函數(shù):

torch.lerp(star, end, weight) : 返回結(jié)果是out= star t+ (end-start) * weight
torch.rsqrt(input) : 返回平方根的倒數(shù)
torch.mean(input) : 返回平均值
torch.std(input) : 返回標(biāo)準(zhǔn)偏差
torch.prod(input) : 返回所有元素的乘積
torch.sum(input) : 返回所有元素的之和
torch.var(input) : 返回所有元素的方差
torch.tanh(input) :返回元素雙正切的結(jié)果
torch.equal(torch.Tensor(a), torch.Tensor(b)) :兩個(gè)張量進(jìn)行比較,如果相等返回true
torch.max(input): 返回輸入元素的最大值
torch.min(input) : 返回輸入元素的最小值
element_size() :返回單個(gè)元素的字節(jié)
torch.from_numpy(obj),利用一個(gè)numpy的array創(chuàng)建Tensor。注意,若obj原來是1列或者1行,無論obj是否為2維,所生成的Tensor都是一階的,若需要2階的Tensor,需要利用view()函數(shù)進(jìn)行轉(zhuǎn)換。
torch.numel(obj),返回Tensor對(duì)象中的元素總數(shù)。
torch.ones_like(input),返回一個(gè)全1的Tensor,其維度與input相一致
torch.cat(seq, dim),在給定維度上對(duì)輸入的張量序列進(jìn)行連接操作
torch.chunk(input, chunks, dim)在給定維度(軸)上將輸入張量進(jìn)行分塊
torch.squeeze(input),將input中維度數(shù)值為1的維度去除??梢灾付骋痪S度。共享input的內(nèi)存
torch.unsqeeze(input, dim),在input目前的dim維度上增加一維
torch.clamp(input, min, max),將input的值約束在min和max之間
torch.trunc(input),將input的小數(shù)部分舍去

在這里插入圖片描述

Reference

[1] 透徹理解torch.tensor中對(duì)某一維度的操作們(mean,Softmax,batch norm, layer norm)

到此這篇關(guān)于python中的torch常用tensor處理函數(shù)的文章就介紹到這了,更多相關(guān)torch常用tensor處理函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python 如何獲取目錄下的文件列表,并自然排序

    Python 如何獲取目錄下的文件列表,并自然排序

    這篇文章主要介紹了Python 如何獲取目錄下的文件列表,并自然排序的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python?中的?return?解析

    python?中的?return?解析

    這篇文章主要介紹了python?中的?return?解析,return?語句用于退出函數(shù),向調(diào)用方返回一個(gè)表達(dá)式。執(zhí)行到?return?語句時(shí),會(huì)退出函數(shù),return?之后的語句不再執(zhí),下文下邊就利用舉例給大家講解該內(nèi)容得相關(guān)資料,需要的小伙伴可以參考一下
    2022-02-02
  • Python中利用原始套接字進(jìn)行網(wǎng)絡(luò)編程的示例

    Python中利用原始套接字進(jìn)行網(wǎng)絡(luò)編程的示例

    這篇文章主要介紹了Python中利用原始套接字進(jìn)行網(wǎng)絡(luò)編程的示例,使用sock_raw接受和發(fā)送數(shù)據(jù)包可以避開網(wǎng)絡(luò)協(xié)議的諸多限制,需要的朋友可以參考下
    2015-05-05
  • 淺析Python中MySQLdb的事務(wù)處理功能

    淺析Python中MySQLdb的事務(wù)處理功能

    這篇文章給大家介紹了Python中MySQLdb的事務(wù)處理功能,對(duì)大家學(xué)習(xí)python操作數(shù)據(jù)具有一定參考借鑒價(jià)值,有需要的朋友們可以參考借鑒。
    2016-09-09
  • python如何判斷文件存在方式

    python如何判斷文件存在方式

    這篇文章主要介紹了python判斷文件存在方式,判斷文件是否存在在實(shí)際應(yīng)用中用的非常多,下面我們來歸納一下檢查文件、文件夾是否存在的各種操作,需要的朋友可以參考下
    2022-09-09
  • 教你用 Python 發(fā)送告警通知到微信的操作過程

    教你用 Python 發(fā)送告警通知到微信的操作過程

    大家都知道常見的告警方式有:郵件,電話,短信,微信,今天通過本文給大家介紹下Python 發(fā)送告警通知到微信的操作過程,感興趣的朋友一起看看吧
    2022-01-01
  • python教程之生成器和匿名函數(shù)

    python教程之生成器和匿名函數(shù)

    這篇文章主要為大家介紹了python生成器和匿名函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Python之tkinter文字區(qū)域Text使用及說明

    Python之tkinter文字區(qū)域Text使用及說明

    這篇文章主要介紹了Python之tkinter文字區(qū)域Text使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 使用Python進(jìn)行視頻相似度比較實(shí)例

    使用Python進(jìn)行視頻相似度比較實(shí)例

    這篇文章主要介紹了使用Python進(jìn)行視頻相似度比較實(shí)例,本文通過漢明距離算法與圖片比較等方法對(duì)比兩個(gè)視頻流的相似度,文中提供了部分實(shí)現(xiàn)代碼與解決思路,需要的朋友可以參考下
    2023-07-07
  • Python3實(shí)現(xiàn)的騰訊微博自動(dòng)發(fā)帖小工具

    Python3實(shí)現(xiàn)的騰訊微博自動(dòng)發(fā)帖小工具

    這篇文章主要為大家分享下騰訊微博自動(dòng)發(fā)帖的Python3代碼,需要的朋友可以參考下
    2013-11-11

最新評(píng)論

克东县| 湟中县| 尖扎县| 高淳县| 平定县| 崇文区| 讷河市| 南宫市| 漳浦县| 安仁县| 平潭县| 永泰县| 万全县| 图木舒克市| 毕节市| 楚雄市| 嫩江县| 澜沧| 衡南县| 蕲春县| 泗阳县| 潞西市| 凤台县| 会泽县| 同江市| 霍城县| 荣昌县| 枣强县| 贺州市| 云和县| 祁连县| 怀仁县| 永和县| 台州市| 康乐县| 淮北市| 谷城县| 额敏县| 久治县| 孝义市| 马龙县|