Introduction
- tensorflow依賴的是numpy庫
- 在tensorflow中張量(tensor)其實與numpy的陣列是差不多的
陣列(ndarray) | 矩陣 | 張量(tensor) |
---|---|---|
擁有無窮的維度 | 必須為二維 | 被封裝的陣列(亦擁有無窮維度) |
- tensor是tensorflow中基本的數據格式
- 一個類型化的N維度數組(
tf.Tensor
) - print時會包含名字,張量形狀,數據類型三部分
1
Tensor("Add:0", shape=(), dtype=int32)
- 名字指的是op類型,
:0
並無意義 - 張量形狀可表示數據維度
- 名字指的是op類型,
- 一個類型化的N維度數組(
tensor維度(階)
tensor的維度通常用階表示
階 | 數學實例 | Python | Example |
---|---|---|---|
0 | 純量 | 只有大小 | s = 483 |
1 | 向量 | 大小和方向 | v = [1.1, 2.2, 3.3] |
2 | 矩陣 | 數據表 | m = [[1,2,3],[4,5,6],[7,8,9]] |
3 | 三階張量 | 數據立體 | … |
n | n階 | … |
tensor數據類型
數據類型 | python類型 | 描述 |
---|---|---|
DT_FLOAT | tf.float32 |
32位浮點數 |
DT_DOUBLE | tf.float64 |
64位浮點數 |
DT_INT64 | tf.int64 |
64位有符號整型 |
DT_INT32 | tf.int32 |
32位有符號整型 |
DT_INT16 | tf.int16 |
16位有符號整型 |
DT_INT8 | tf.int8 |
8位有符號整型 |
DT_UINT8 | tf.uint8 |
8位無符號整型 |
DT_STRING | tf.string |
可變字節長度的字節array,每一個張量元素都是一個字節array |
DT_BOOL | tf.bool |
布爾型 |
DT_COMPLEX64 | tf.complex64 |
由兩個32位浮點數組成的複數:實數和虛數 |
DT_QINT32 | tf.qint32 |
用於量化Ops的32位有符號整型 |
DT_QINT8 | tf.qint8 |
用於量化Ops的8位有符號整型 |
DT_QUINT8 | tf.quint8 |
用於量化Ops的8位無符號整型 |
tensor屬性
創建張量後可透過以下屬性查看狀態
graph
:張量所屬的默認圖op
:張量的操作名name
:張量的字符串描述shape
:張量的形狀- 0階為
()
- 1階為
(2,)
- 2階為
(2,3)
- 要是無固定行或列則該值為
?
- 要是無固定行或列則該值為
- 3階為
(2,3,4)
- 理解成2張3行4列的表
- 0階為
tensor形狀(shape)
tensorflow中,張量具有靜態形狀和動態形狀
- 動態形狀和靜態形狀改變的差別:在於有沒有生成一個新的張量數據
- 在numpy中改變陣列的形狀使用
reshape
- 把原來的數據通過reshape直接修改
靜態形狀
若是沒有生成新的張量則稱為靜態形狀
tf.Tensor.get_shape
:獲取靜態形狀tf.Tensor.set_shape(shape)
:更新Tensor物件的靜態形狀
Example
1 | import tensorflow as tf |
- 應用場景:在讀取數據時不確定樣本數需要使用None來抓取所有數據,讀進來後需要固定形狀方便計算
- 注意:
set_shape
不能跨維度修改 set_shape
後,一旦張量固定,不能再次set_shape
改變形狀
Result
1 | Tensor("Placeholder:0", shape=(?, 2), dtype=float32) |
動態形狀
若是生成新的張量則稱為動態形狀,
- 一種描述原始張量在執行過程中的一種形狀(動態變化)
tf.reshpae(tensor,shape,name=None)
:創建一個具有不同動態形狀的新張量- 其與numpy的
reshape
效果不一樣
Example
1 | import tensorflow as tf |
- 注意:
reshape
前後的元素個數須一樣 - 跨維度
reshape
仍需注意元素數量需匹配
Result
1 | Tensor("Placeholder:0", shape=(?, 2), dtype=float32) |
- 得到新的操作名
Resahpe