本身一直以來都是使用的pytorch,最近打算好好的看下tensorflow,新開一個系列:pytorch和tensorflow的愛恨情仇(相愛相殺。。。)html
不管學習什麼框架或者是什麼編程語言,最基礎的就是其基本的數據類型了,接下來咱們就一一看看吧。python
pytorch版本:0.4.1,準備以後換成1.x版本的。編程
tensorflow版本:1.15.0,雖然目前tensorflow已經出到2.x版本了,但聽說2.x版本的還存在一些bug,就使用目前的1.x版本的了。數組
一、python基本數據類型框架
數字型:整型、浮點型、布爾型、複數型。編程語言
非數字型:字符串、列表、元組、字典。函數
使用type能夠查看變量的類型:type(變量名)學習
二、numpy中的數據類型ui
名稱 | 描述 |
---|---|
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,等等。spa
這裏簡要的看下例子,通常狀況下咱們是這麼定義一個數組的:
固然,咱們也可使用以下方式定義:先指定數組中元素的類型,再建立數組
爲何咱們要這麼定義呢,這麼定義不是沒有第一種簡便嗎?這是由於,經過這種方式,咱們能夠定義本身的數據類型:
這裏的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
三、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類型。
三、tensorflow基本數據類型
定義一個張量:
使用tf.constant創建一個常量,注意:常量是不進行梯度更新的。
(1)張量之間的類型轉換:可使用tf.to_類型()或者tf.cast(),不過前者將要被移除,最好使用tf.cast()
(2) 張量和numpy之間的類型轉換
numpy轉張量:使用tf.convert_to_tensor()
張量轉numpy:由Session.run
或eval
返回的任何張量都是NumPy數組。
(3)tensorflow好像不存在什麼gpu張量和cpu張量類型
若是有什麼錯誤還請指出,有什麼遺漏的還請補充,會進行相應的修改。