pytorch和tensorflow的愛恨情仇之基本數據類型


自己一直以來都是使用的pytorch,最近打算好好的看下tensorflow,新開一個系列:pytorch和tensorflow的愛恨情仇(相愛相殺。。。)

無論學習什么框架或者是什么編程語言,最基礎的就是其基本的數據類型了,接下來我們就一一看看吧。

pytorch版本:0.4.1,准備之后換成1.x版本的。

tensorflow版本:1.15.0,雖然目前tensorflow已經出到2.x版本了,但據說2.x版本的還存在一些bug,就使用目前的1.x版本的了。

1、python基本數據類型

數字型:整型、浮點型、布爾型、復數型。

非數字型:字符串、列表、元組、字典。

使用type可以查看變量的類型:type(變量名)

2、numpy中的數據類型

名稱 描述
bool_ 布爾型數據類型(True 或者 False)
int_ 默認的整數類型(類似於 C 語言中的 long,int32 或 int64)
intc 與 C 的 int 類型一樣,一般是 int32 或 int 64
intp 用於索引的整數類型(類似於 C 的 ssize_t,一般情況下仍然是 int32 或 int64)
int8 字節(-128 to 127)
int16 整數(-32768 to 32767)
int32 整數(-2147483648 to 2147483647)
int64 整數(-9223372036854775808 to 9223372036854775807)
uint8 無符號整數(0 to 255)
uint16 無符號整數(0 to 65535)
uint32 無符號整數(0 to 4294967295)
uint64 無符號整數(0 to 18446744073709551615)
float_ float64 類型的簡寫
float16 半精度浮點數,包括:1 個符號位,5 個指數位,10 個尾數位
float32 單精度浮點數,包括:1 個符號位,8 個指數位,23 個尾數位
float64 雙精度浮點數,包括:1 個符號位,11 個指數位,52 個尾數位
complex_ complex128 類型的簡寫,即 128 位復數
complex64 復數,表示雙 32 位浮點數(實數部分和虛數部分)
complex128 復數,表示雙 64 位浮點數(實數部分和虛數部分)

numpy 的數值類型實際上是 dtype 對象的實例,並對應唯一的字符,包括 np.bool_,np.int32,np.float32,等等。

這里簡要的看下例子,一般情況下我們是這么定義一個數組的:

當然,我們也可以使用如下方式定義:先指定數組中元素的類型,再創建數組

為什么我們要這么定義呢,這么定義不是沒有第一種簡便嗎?這是因為,通過這種方式,我們可以定義自己的數據類型:

這里的i1指代的是int8,

每個內建類型都有一個唯一定義它的字符代碼,如下:

字符 對應類型
b 布爾型
i (有符號) 整型
u 無符號整型 integer
f 浮點型
c 復數浮點型
m timedelta(時間間隔)
M datetime(日期時間)
O (Python) 對象
S, a (byte-)字符串
U Unicode
V 原始數據 (void)

於是乎,請看以下例子:

說到數據類型,就不得不涉及到數據類型之間的轉換,自然而然首先想到的是通過修改dtype的類型來修改數據的類型,但是這存在一些問題,請看以下例子:

>>> a=np.array([1.1, 1.2])
>>> a.dtype
dtype('float64')
>>> a.dtype=np.int16
>>> a.dtype
dtype('int16') 
>>> a
array([-26214, -26215, -26215,  16369,  13107,  13107,  13107,  16371], dtype=int16)
#原來float64相當於4個int16的位寬,這樣強制轉換后會將他們直接拆開成4個數,
#因此原來的兩個float64成了8個int16

我們要使用astype來修改數據類型,看一下例子:

>>> a=np.array([1.1, 1.2])
>>> a.dtype
dtype('float64')
>>> a.astype(np.int16)
array([1, 1], dtype=int16)
>>> a.dtype
dtype('float64') #a的數據類型並沒有變
>>> a=a.astype(np.int16) #賦值操作后a的數據類型變化
>>> a.dtype
dtype('int16')
>>> a
array([1, 1], dtype=int16)

 參考:

https://www.runoob.com/numpy/numpy-dtype.html

https://blog.csdn.net/miao20091395/article/details/79276721

3、pytorch中的數據類型

看以下例子:默認使用的數據類型是torch.float32

當然,你也可以指定生成張量的類別,通過以下方式:

在多數情況下,我們都會使用pytorch自帶的函數建立張量,看以下例子:

通過以下兩種方式可以查看張量的數據類型:

接下來還是要看下數據類型之間的轉換,主要有三點:張量之間的數據類型的轉換、張量和numpy數組之間的轉換、cuda張量和cpu張量的轉換

(1) 不同張量之間的類型轉換

直接使用(.類型)即可:

我們還可以使用type()來進行轉換:

我們同樣可以使用type_as()將某個張量的數據類型轉換為另一個張量的相同的數據類型:

(2)張量和numpy之間的轉換

將numpy數組轉換為張量:使用from_numpy()

將張量轉換為numoy數組:使用.numpy()

(3) cuda類型和cpu類型之間的轉換

cpu類型轉換成cuda類型:

a.cuda()或者a.to(device):這里的device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

cuda類型轉換為cpu類型:

a.cpu()

這里需要提一句的是,要先將cuda類型轉換為cpu類型,才能進一步將該類型轉換為numpy類型。

3、tensorflow基本數據類型

定義一個張量:

使用tf.constant建立一個常量,注意:常量是不進行梯度更新的。

(1)張量之間的類型轉換:可以使用tf.to_類型()或者tf.cast(),不過前者將要被移除,最好使用tf.cast()

(2) 張量和numpy之間的類型轉換

numpy轉張量:使用tf.convert_to_tensor()

張量轉numpy:由Session.runeval返回的任何張量都是NumPy數組。

(3)tensorflow好像不存在什么gpu張量和cpu張量類型

 

如果有什么錯誤還請指出,有什么遺漏的還請補充,會進行相應的修改。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM