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

Pytorch 實(shí)現(xiàn)變量類型轉(zhuǎn)換

 更新時(shí)間:2021年05月17日 08:54:38   投稿:jingxian  
這篇文章主要介紹了Pytorch 實(shí)現(xiàn)變量類型轉(zhuǎn)換操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Pytorch的數(shù)據(jù)類型為各式各樣的Tensor,Tensor可以理解為高維矩陣。

與Numpy中的Array類似。Pytorch中的tensor又包括CPU上的數(shù)據(jù)類型和GPU上的數(shù)據(jù)類型,一般GPU上的Tensor是CPU上的Tensor加cuda()函數(shù)得到。通過使用Type函數(shù)可以查看變量類型。

一般系統(tǒng)默認(rèn)是torch.FloatTensor類型。

例如data = torch.Tensor(2,3)是一個(gè)2*3的張量,類型為FloatTensor; data.cuda()就轉(zhuǎn)換為GPU的張量類型,torch.cuda.FloatTensor類型。

下面簡單介紹一下Pytorch中變量之間的相互轉(zhuǎn)換

(1)CPU或GPU張量之間的轉(zhuǎn)換

一般只要在Tensor后加long(), int(), double(),float(),byte()等函數(shù)就能將Tensor進(jìn)行類型轉(zhuǎn)換;

例如:Torch.LongTensor--->Torch.FloatTensor, 直接使用data.float()即可

還可以使用type()函數(shù),data為Tensor數(shù)據(jù)類型,data.type()為給出data的類型,如果使用data.type(torch.FloatTensor)則強(qiáng)制轉(zhuǎn)換為torch.FloatTensor類型張量。

當(dāng)你不知道要轉(zhuǎn)換為什么類型時(shí),但需要求a1,a2兩個(gè)張量的乘積,可以使用a1.type_as(a2)將a1轉(zhuǎn)換為a2同類型。

(2)CPU張量 ----> GPU張量, 使用data.cuda()

(3)GPU張量 ----> CPU張量 使用data.cpu()

(4)Variable變量轉(zhuǎn)換成普通的Tensor,其實(shí)可以理解Variable為一個(gè)Wrapper,里頭的data就是Tensor. 如果Var是Variable變量,使用Var.data獲得Tensor變量

(5)Tensor與Numpy Array之間的轉(zhuǎn)換

Tensor---->Numpy 可以使用 data.numpy(),data為Tensor變量

Numpy ----> Tensor 可以使用torch.from_numpy(data),data為numpy變量

補(bǔ)充:Numpy/Pytorch之?dāng)?shù)據(jù)類型與強(qiáng)制類型轉(zhuǎn)換

1.數(shù)據(jù)類型簡介

Numpy

NumPy 支持比 Python 更多種類的數(shù)值類型。 下表顯示了 NumPy 中定義的不同標(biāo)量數(shù)據(jù)類型。

序號(hào) 數(shù)據(jù)類型及描述
1. bool_存儲(chǔ)為一個(gè)字節(jié)的布爾值(真或假)
2. int_默認(rèn)整數(shù),相當(dāng)于 C 的long,通常為int32或int64
3. intc相當(dāng)于 C 的int,通常為int32或int64
4. intp用于索引的整數(shù),相當(dāng)于 C 的size_t,通常為int32或int64
5. int8字節(jié)(-128 ~ 127)
6. int1616 位整數(shù)(-32768 ~ 32767)
7. int3232 位整數(shù)(-2147483648 ~ 2147483647)
8. int6464 位整數(shù)(-9223372036854775808 ~ 9223372036854775807)
9. uint88 位無符號(hào)整數(shù)(0 ~ 255)
10. uint1616 位無符號(hào)整數(shù)(0 ~ 65535)
11. uint3232 位無符號(hào)整數(shù)(0 ~ 4294967295)
12. uint6464 位無符號(hào)整數(shù)(0 ~ 18446744073709551615)
13. float_float64的簡寫
14. float16半精度浮點(diǎn):符號(hào)位,5 位指數(shù),10 位尾數(shù)
15. float32單精度浮點(diǎn):符號(hào)位,8 位指數(shù),23 位尾數(shù)
16. float64雙精度浮點(diǎn):符號(hào)位,11 位指數(shù),52 位尾數(shù)
17. complex_complex128的簡寫
18. complex64復(fù)數(shù),由兩個(gè) 32 位浮點(diǎn)表示(實(shí)部和虛部)
19.

complex128復(fù)數(shù),由兩個(gè) 64 位浮點(diǎn)表示(實(shí)部和虛部)

直接使用類型名很可能會(huì)報(bào)錯(cuò),正確的使用方式是np.調(diào)用,eg, np.uint8

Pytorch

Torch定義了七種CPU張量類型和八種GPU張量類型,這里我們就只講解一下CPU中的,其實(shí)GPU中只是中間加一個(gè)cuda即可,如torch.cuda.FloatTensor:

torch.FloatTensor(2,3) 構(gòu)建一個(gè)2*3 Float類型的張量

torch.DoubleTensor(2,3) 構(gòu)建一個(gè)2*3 Double類型的張量

torch.ByteTensor(2,3) 構(gòu)建一個(gè)2*3 Byte類型的張量

torch.CharTensor(2,3) 構(gòu)建一個(gè)2*3 Char類型的張量

torch.ShortTensor(2,3) 構(gòu)建一個(gè)2*3 Short類型的張量

torch.IntTensor(2,3) 構(gòu)建一個(gè)2*3 Int類型的張量

torch.LongTensor(2,3) 構(gòu)建一個(gè)2*3 Long類型的張量

同樣,直接使用類型名很可能會(huì)報(bào)錯(cuò),正確的使用方式是torch.調(diào)用,eg,torch.FloatTensor()

2.Python的type()函數(shù)

type函數(shù)可以由變量調(diào)用,或者把變量作為參數(shù)傳入。

返回的是該變量的類型,而非數(shù)據(jù)類型。

data = np.random.randint(0, 255, 300)
print(type(data))

輸出

<class 'numpy.ndarray'>

3.Numpy/Pytorch的dtype屬性

返回值為變量的數(shù)據(jù)類型

t_out = torch.Tensor(1,2,3)
print(t_out.dtype)

輸出

torch.float32

t_out = torch.Tensor(1,2,3)

print(t_out.numpy().dtype)

輸出

float32

4.Numpy中的類型轉(zhuǎn)換

先聊聊我為什么會(huì)用到這個(gè)函數(shù)(不看跳過)

為了實(shí)施trochvision.transforms.ToPILImage()函數(shù)

于是我想從numpy的ndarray類型轉(zhuǎn)成PILImage類型

我做了以下嘗試

data = np.random.randint(0, 255, 300)
n_out = data.reshape(10,10,3)
print(n_out.dtype)
img = transforms.ToPILImage()(n_out)
img.show()

但是很遺憾,報(bào)錯(cuò)了

raise TypeError('Input type {} is not supported'.format(npimg.dtype))

TypeError: Input type int32 is not supported

因?yàn)橐獙darray轉(zhuǎn)成PILImage要求ndarray是uint8類型的。

于是我認(rèn)輸了。。。

使用了

n_out = np.linspace(0,255,300,dtype=np.uint8)
n_out = n_out.reshape(10,10,3)
print(n_out.dtype)
img = torchvision.transforms.ToPILImage()(n_out)
img.show()

得到了輸出

uint8

嗯,顯示了一張圖片

但是呢,就很憋屈,和想要的隨機(jī)數(shù)效果不一樣。

于是我用了astype函數(shù)

astype()函數(shù)

由變量調(diào)用,但是直接調(diào)用不會(huì)改變?cè)兞康臄?shù)據(jù)類型,是返回值是改變類型后的新變量,所以要賦值回去。

n_out = n_out.astype(np.uint8)
#初始化隨機(jī)數(shù)種子
np.random.seed(0)
 
data = np.random.randint(0, 255, 300)
print(data.dtype)
n_out = data.reshape(10,10,3)
 
#強(qiáng)制類型轉(zhuǎn)換
n_out = n_out.astype(np.uint8)
print(n_out.dtype)
 
img = transforms.ToPILImage()(n_out)
img.show()

輸出

int32

uint8

5.Pytorch中的類型轉(zhuǎn)換

pytorch中沒有astype函數(shù),正確的轉(zhuǎn)換方法是

Way1 : 變量直接調(diào)用類型

tensor = torch.Tensor(3, 5)

torch.long() 將tensor投射為long類型

newtensor = tensor.long()

torch.half()將tensor投射為半精度浮點(diǎn)類型

newtensor = tensor.half()

torch.int()將該tensor投射為int類型

newtensor = tensor.int()

torch.double()將該tensor投射為double類型

newtensor = tensor.double()

torch.float()將該tensor投射為float類型

newtensor = tensor.float()

torch.char()將該tensor投射為char類型

newtensor = tensor.char()

torch.byte()將該tensor投射為byte類型

newtensor = tensor.byte()

torch.short()將該tensor投射為short類型

newtensor = tensor.short()

同樣,和numpy中的astype函數(shù)一樣,是返回值才是改變類型后的結(jié)果,調(diào)用的變量類型不變

Way2 : 變量調(diào)用pytorch中的type函數(shù)

type(new_type=None, async=False)如果未提供new_type,則返回類型,否則將此對(duì)象轉(zhuǎn)換為指定的類型。 如果已經(jīng)是正確的類型,則不會(huì)執(zhí)行且返回原對(duì)象。

用法如下:

self = torch.LongTensor(3, 5)
# 轉(zhuǎn)換為其他類型
print self.type(torch.FloatTensor)

Way3 : 變量調(diào)用pytorch中的type_as函數(shù)

如果張量已經(jīng)是正確的類型,則不會(huì)執(zhí)行操作。具體操作方法如下:

self = torch.Tensor(3, 5)
tesnor = torch.IntTensor(2,3)
print self.type_as(tesnor)

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

相關(guān)文章

  • 使用python+pygame開發(fā)消消樂游戲附完整源碼

    使用python+pygame開發(fā)消消樂游戲附完整源碼

    消消樂小游戲相信大家都玩過,大人小孩都喜歡玩的一款小游戲,那么基于程序是如何實(shí)現(xiàn)的呢?今天帶大家,用python+pygame來實(shí)現(xiàn)一下這個(gè)花里胡哨的消消樂小游戲功能,感興趣的朋友一起看看吧
    2021-06-06
  • python 日期操作類代碼

    python 日期操作類代碼

    這篇文章主要介紹了python 日期操作類代碼,里面涉及了python日期操作的一些基礎(chǔ)知識(shí),需要的朋友可以參考下
    2018-05-05
  • pyqt5 QScrollArea設(shè)置在自定義側(cè)(任何位置)

    pyqt5 QScrollArea設(shè)置在自定義側(cè)(任何位置)

    這篇文章主要介紹了pyqt5 QScrollArea設(shè)置在自定義側(cè)(任何位置),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Pandas 合并多個(gè)Dataframe(merge,concat)的方法

    Pandas 合并多個(gè)Dataframe(merge,concat)的方法

    今天小編就為大家分享一篇Pandas 合并多個(gè)Dataframe(merge,concat)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • OpenCV立體圖像深度圖Depth Map基礎(chǔ)

    OpenCV立體圖像深度圖Depth Map基礎(chǔ)

    這篇文章主要為大家介紹了OpenCV立體圖像深度圖Depth Map基礎(chǔ)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Python全局變量global關(guān)鍵字詳解

    Python全局變量global關(guān)鍵字詳解

    這篇文章主要介紹了Python全局變量global關(guān)鍵字詳解,需要的朋友可以參考下
    2021-04-04
  • 處理python中多線程與多進(jìn)程中的數(shù)據(jù)共享問題

    處理python中多線程與多進(jìn)程中的數(shù)據(jù)共享問題

    這篇文章主要介紹了python中多線程與多進(jìn)程中的數(shù)據(jù)共享問題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • python中的mock接口開發(fā)示例詳解

    python中的mock接口開發(fā)示例詳解

    這篇文章主要介紹了python中的mock接口開發(fā),Mock接口就是用一些合理的手段構(gòu)造對(duì)象去模擬真實(shí)接口,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • python傳參時(shí)一個(gè)星號(hào)和兩個(gè)星號(hào)的區(qū)別小結(jié)

    python傳參時(shí)一個(gè)星號(hào)和兩個(gè)星號(hào)的區(qū)別小結(jié)

    在Python中,一個(gè)星號(hào)(*)和兩個(gè)星號(hào)(**)用于函數(shù)定義中的參數(shù)傳遞,本文主要介紹了python傳參時(shí)一個(gè)星號(hào)和兩個(gè)星號(hào)的區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • python實(shí)現(xiàn)批量命名照片

    python實(shí)現(xiàn)批量命名照片

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)批量命名照片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06

最新評(píng)論