欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Pytorch實現(xiàn)將label變成one hot編碼的兩種方式

 更新時間:2023年02月01日 08:52:03   作者:咆哮的阿杰  
這篇文章主要介紹了Pytorch實現(xiàn)將label變成one hot編碼的兩種方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

由于Pytorch不像TensorFlow有谷歌巨頭做維護,很多功能并沒有很高級的封裝,比如說沒有tf.one_hot函數(shù)。

本篇介紹將一個mini batch的label向量變成形狀為[batch size, class numbers]的one hot編碼的兩種方法,涉及到

  • tensor.scatter_
  • tensor.index_select

前言

本文將針對全連接網(wǎng)絡(luò)和全卷積網(wǎng)絡(luò)輸出的形式不同,將one hot編碼分兩種情況。

  • 第一種針對網(wǎng)絡(luò)輸出是二維,即全連接層的輸出形式, [Batchsize, Num_class]
  • 第二種針對輸出是四維特征圖,即分割網(wǎng)絡(luò)的輸出形式,[Batchsize, Num_class, H,W]

先將第一種情況

使用scatter_獲得one hot 編碼

我相信在CSDN上找這個函數(shù)用法的人都是看不懂官方介紹的,所以我不會像其他地方那樣,搬官方教程,我也是琢磨了很久才看懂這個函數(shù),但函數(shù)聲明還是要看看的。

tensor.scatter_(dim, index, src)?
  • dim : 指定了覆蓋數(shù)據(jù)是從哪個軸作為依據(jù)。后面再詳細解釋。值的范圍是從0到 sum(tensor.shape)-1
  • index : 告訴函數(shù)要將src中對應(yīng)的值放到tensor的哪個位置。index的shape要和src一致,或者src可以通過廣播機制實現(xiàn)shape一致。
  • src : 保存了想用來覆蓋tensor的值

我們先看一個例子,例子從別的博客copy過來,但我會做更加詳細的介紹。覺得講得好請留言作為鼓勵。

>>> x = torch.rand(2, 5)
>>> x

?0.4319 ?0.6500 ?0.4080 ?0.8760 ?0.2355
?0.2609 ?0.4711 ?0.8486 ?0.8573 ?0.1029
[torch.FloatTensor of size 2x5]

>>> torch.zeros(3, 5).scatter_(0, torch.LongTensor([[0, 1, 2, 0, 0], [2, 0, 0, 1, 2]]), x)

?0.4319 ?0.4711 ?0.8486 ?0.8760 ?0.2355
?0.0000 ?0.6500 ?0.0000 ?0.8573 ?0.0000
?0.2609 ?0.0000 ?0.4080 ?0.0000 ?0.1029
[torch.FloatTensor of size 3x5]

注意到dim為0,代表以第一個維度作為依托。index是一個二維數(shù)組。

[0,1,2,0,0]
[2,0,0,1,2]

那么我們要覆蓋tensor的位置有10個,分別為

[0,0];[1,1];[2,2];[0,3];[0,4]
[2,0];[0,1];[0,2];[1,3];[2,4]

dim指定了index我們要將index的值作為哪一個軸的值。其他軸就是按照0到max shape -1變化罷了。比如說dim為0,那么index的值都作為坐標(biāo)的第一個位置的值,另一個位置從0到4變換。

你們可以驗證下,是不是這10個位置被覆蓋了。10個位置的第一個軸是index的數(shù)字,第二個數(shù)字是index中的列數(shù),從0到4。

要覆蓋的位置有了,那么用什么值覆蓋呢?別忘了我們的index的維度和src是一樣的。index中選擇什么位置的坐標(biāo),就對應(yīng)用src對應(yīng)的位置的值代替。

比如說要代替tensor中[0,0]的值,index中[0,0]就是第0行第0列對應(yīng)的位置,那我們用src第0行第0列的值代替tensor的值。大家可以去驗證一下。

我們看看下面的的情況,如果dim為1呢。

>>> z = torch.zeros(2, 4).scatter_(1, torch.LongTensor([[2], [3]]), 1.23)
>>> z

先分析一下

dim為1,那么index的值都作為坐標(biāo)的第2個位置的值,第一個位置的值應(yīng)該從0到1變化。

所以要被代替的位置有

[0,2];[1,3]

而[0,2]的位置要填入的值為1.23,[1,3]要填入的值為1.23。(廣播機制將1.23這個標(biāo)量擴展到了shape為(2,1))

好的,函數(shù)用法知道了。我們現(xiàn)在看看如何用該函數(shù)將label編碼為one hot編碼。

首先設(shè)想一個batch size為8的label。有10類,所以label中的數(shù)字應(yīng)該是從0到9的。

import torch as t
import numpy as np

batch_size = 8
class_num = 10
label = np.random.randint(0,class_num,size=(batch_size,1))
label = t.LongTensor(label)

我們就獲得了一個label,shape是(8,1),必須是2維。如果是(8,)下面的內(nèi)容會報錯的。

y_one_hot = t.zeros(batch_size,class_num).scatter_(1,label,1)
print(y_one_hot)

'''
tensor([[0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
? ? ? ? [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
? ? ? ? [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
? ? ? ? [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
? ? ? ? [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
? ? ? ? [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
? ? ? ? [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
? ? ? ? [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.]])
'''

搞定。下面我們看下面一種方法。

使用tensor.index_select獲得one hot編碼

還是先看下index_select的用法。

tensor.index_select( dim, index, out=None)
  • dim: 指定按什么維度取tensor中的向量
  • index: 是一個一維的張量。描述了按照dim維度取出tensor對應(yīng)的index值的向量。

我們不看例子了,直接看方法,以此為例。

ones = torch.sparse.torch.eye(class_num)
return ones.index_select(0,label)

這里的label是一維的向量,不是二維的。因為index制定了必須是一維的

先生成一個單位矩陣,尺寸是[class_num, class_num]。

dim為0,以為這按照行來取tensor的向量。具體取哪一行呢,就是label中的值了。

這時我們應(yīng)該也明白為啥這兩行代碼能實現(xiàn)one hot編碼了吧。

如果label是[ 1,3,0],有四類。那我們得到就是

[0,1,0,0]
[0,0,0,1]
[1,0,0,0]

第二種針對分割網(wǎng)絡(luò)的one_hot編碼

對于分割類任務(wù),網(wǎng)絡(luò)的GT肯定是二維數(shù)組,而不是像分類任務(wù)那樣的一維數(shù)組了。而對于分割任務(wù),我們將其視作很多個像素值的分類任務(wù),將ground truth 直接 reshape為向量形式,然后用上面的方法轉(zhuǎn)為one hot編碼,然后再reshape回來。核心是不變的。

下面舉個例子。

import torch
import numpy as np

gt = np.random.randint(0,5, size=[15,15]) ?#先生成一個15*15的label,值在5以內(nèi),意思是5類分割任務(wù)
gt = torch.LongTensor(gt)

def get_one_hot(label, N):
? ? size = list(label.size())
? ? label = label.view(-1) ? # reshape 為向量
? ? ones = torch.sparse.torch.eye(N)
? ? ones = ones.index_select(0, label) ? # 用上面的辦法轉(zhuǎn)為換one hot
? ? size.append(N) ?# 把類別輸目添到size的尾后,準(zhǔn)備reshape回原來的尺寸
? ? return ones.view(*size)


gt_one_hot = get_one_hot(gt, 5)
print(gt_one_hot)
print(gt_one_hot.shape)

print(gt_one_hot.argmax(-1) == gt) ?# 判斷one hot 轉(zhuǎn)換方式是否正確,全是1就是正確的

另外注意,在Pytorch中,如果要和網(wǎng)絡(luò)輸出的特征圖一起計算loss,還要把上面輸出的one hot編碼的最后一個維度使用permute轉(zhuǎn)到通道維度上。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 100?個?Python?小例子(練習(xí)題四)

    100?個?Python?小例子(練習(xí)題四)

    這篇文章主要給大家分享100?個?Python?小例子,前文分享了一二三,本文的四十最后一篇了,這篇就把100道python小練習(xí)全分享完了,感興趣的小伙伴也可以去練習(xí)前幾期內(nèi)容,洗碗給這幾篇文章給你的學(xué)習(xí)帶來幫助
    2022-01-01
  • Python實現(xiàn)重建二叉樹的三種方法詳解

    Python實現(xiàn)重建二叉樹的三種方法詳解

    這篇文章主要介紹了Python實現(xiàn)重建二叉樹的三種方法,結(jié)合實例形式分析了Python重建二叉樹的實現(xiàn)方法、操作技巧與注意事項,需要的朋友可以參考下
    2018-06-06
  • Python實現(xiàn)大樂透號碼隨機生成

    Python實現(xiàn)大樂透號碼隨機生成

    全國有很多彩民,其中購買最多的彩種分別是體彩大樂透和福彩雙色球。本篇文章將介紹Python實現(xiàn)彩票自由的全流程:隨機選取號碼+查看是否中獎,需要的可以參考一下
    2022-05-05
  • Python使用PySimpleGUI打造輕量級計算器

    Python使用PySimpleGUI打造輕量級計算器

    PySimpleGUI是一個跨平臺的Python GUI庫,它支持Windows、Mac和Linux等多種操作系統(tǒng),本文將利用PySimpleGUI打造一個輕量級計算器,希望對大家有所幫助
    2024-03-03
  • Python簡單實現(xiàn)TCP包發(fā)送十六進制數(shù)據(jù)的方法

    Python簡單實現(xiàn)TCP包發(fā)送十六進制數(shù)據(jù)的方法

    這篇文章主要介紹了Python簡單實現(xiàn)TCP包發(fā)送十六進制數(shù)據(jù)的方法,結(jié)合實例形式簡單分析了Python實現(xiàn)TCP數(shù)據(jù)傳輸及發(fā)送十六進制數(shù)據(jù)包的相關(guān)技巧,需要的朋友可以參考下
    2016-04-04
  • Python虛擬環(huán)境conda的安裝使用教程

    Python虛擬環(huán)境conda的安裝使用教程

    在性能和資源占用方面,venv?通常更適合輕量級項目、純Python應(yīng)用以及對資源敏感的場景,其簡單快速的特點使得環(huán)境創(chuàng)建和管理更為高效,這篇文章主要介紹了Python虛擬環(huán)境conda的安裝使用教程,需要的朋友可以參考下
    2024-03-03
  • Python導(dǎo)入模塊的3種方式超級詳細講解

    Python導(dǎo)入模塊的3種方式超級詳細講解

    這篇文章主要給大家介紹了關(guān)于Python導(dǎo)入模塊的3種方式,本文介紹了在Python中使用模塊的概念和不同的導(dǎo)入方式,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • python的繼承詳解

    python的繼承詳解

    這篇文章主要介紹了Python中繼承的的相關(guān)資料,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2021-10-10
  • Anaconda+vscode+pytorch環(huán)境搭建過程詳解

    Anaconda+vscode+pytorch環(huán)境搭建過程詳解

    這篇文章主要介紹了Anaconda+vscode+pytorch環(huán)境搭建過程詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • Python的pytest測試框架中fixture的使用詳解

    Python的pytest測試框架中fixture的使用詳解

    這篇文章主要介紹了pytest中fixture的使用詳解,pytest是一個非常成熟的全功能的Python測試框架,能夠支持簡單的單元測試和復(fù)雜的功能測試,還可以用來做selenium/appnium等自動化測試、接口自動化測試,需要的朋友可以參考下
    2023-07-07

最新評論