Hike News
Hike News

深度學習-tensorflow基礎-張量(tensor)

Introduction

  • tensorflow依賴的是numpy庫
  • 在tensorflow中張量(tensor)其實與numpy的陣列是差不多的
陣列(ndarray) 矩陣 張量(tensor)
擁有無窮的維度 必須為二維 被封裝的陣列(亦擁有無窮維度)
  • tensor是tensorflow中基本的數據格式
    • 一個類型化的N維度數組(tf.Tensor)
    • print時會包含名字張量形狀數據類型三部分
      1
      Tensor("Add:0", shape=(), dtype=int32)
      • 名字指的是op類型,:0並無意義
      • 張量形狀可表示數據維度

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列的表

tensor形狀(shape)

tensorflow中,張量具有靜態形狀動態形狀

  • 動態形狀和靜態形狀改變的差別:在於有沒有生成一個新的張量數據
  • 在numpy中改變陣列的形狀使用reshape
    • 把原來的數據通過reshape直接修改

靜態形狀

若是沒有生成新的張量則稱為靜態形狀

  • tf.Tensor.get_shape:獲取靜態形狀
  • tf.Tensor.set_shape(shape):更新Tensor物件的靜態形狀

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import tensorflow as tf

# 創建一個形狀不固定的placeholder
plt = tf.placeholder(tf.float32,shape=[None,2])

print(plt)

# 固定形狀時使用 靜態形狀 設定
# 不固定的行列(None)才能修改
plt.set_shape(shape=[3,2]) # 沒有返回值接收,因此沒有產生新的張量

print(plt)

with tf.Session() as sess:
pass
  • 應用場景:在讀取數據時不確定樣本數需要使用None來抓取所有數據,讀進來後需要固定形狀方便計算
  • 注意:set_shape不能跨維度修改
  • set_shape後,一旦張量固定,不能再次set_shape改變形狀

Result

1
2
Tensor("Placeholder:0", shape=(?, 2), dtype=float32)
Tensor("Placeholder:0", shape=(3, 2), dtype=float32)

動態形狀

若是生成新的張量則稱為動態形狀,

  • 一種描述原始張量在執行過程中的一種形狀(動態變化)
    • tf.reshpae(tensor,shape,name=None):創建一個具有不同動態形狀的新張量
    • 其與numpy的reshape效果不一樣

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import tensorflow as tf

plt = tf.placeholder(tf.float32,shape=[None,2])

print(plt)

plt.set_shape(shape=[3,2])

# 透過reshape動態形狀修改,接收返回值得到新張量
new_plt = tf.reshape(plt,[2,3])

print(new_plt)

with tf.Session() as sess:
pass
  • 注意:reshape前後的元素個數須一樣
  • 跨維度reshape仍需注意元素數量需匹配

Result

1
2
Tensor("Placeholder:0", shape=(?, 2), dtype=float32)
Tensor("Reshape:0", shape=(2, 3), dtype=float32)
  • 得到新的操作名Resahpe