tensorflow中tensor的靜態維度和動態維度
tf中使用張量(tensor)這種數據結構來表示所有的數據,可以把張量看成是一個具有n個維度的數組或列表,張量會在各個節點之間流動,參與計算。
張量具有靜態維度和動態維度。
在圖構建過程中定義的張量擁有的維度是靜態維度,這個維度可以被定義為不確定的,例如定義一個tensor的維度是[None,10],表示這個tensor的第一個維度是不確定的,可以是任意的,None 表示具體維度值要在圖運行過程中確定。在圖運行的時候,張量在圖中各個節點之間流動,此時張量具有的維度是動態維度,依據操作的需要,動態維度是可以動態轉變的,所以tensor的動態維度不是唯一的,但是靜態維度是唯一的(靜態維度可以是形狀不確定的)。
定義張量、設置靜態維度、查詢靜態維度
設置靜態維度使用 set_shape()
查詢靜態維度使用 tensorX.shape.as_list()
# -*- coding:utf-8 -*-
import tensorflow as tf
# 定義一個第一維度不確定的tensor
a = tf.placeholder(tf.float32, [None, 128])
b = tf.placeholder(tf.int32,[2,5,6])
# 查詢張量a的靜態維度
static_shape_a = a.shape.as_list()
static_shape_b = b.shape.as_list()
print static_shape_a,static_shape_b
# 設置張量a的靜態維度,a必須有最少一個維度上是不確定才可以設置靜態維度
a.set_shape([32, 128])
# b聲明的時候3個靜態維度已經是確定的了,再設置b的靜態維度會報錯
# b.set_shape([4,5,3])
# 查詢張量a設置靜態維度后的靜態維度
static_shape_a = a.shape.as_list()
print static_shape_a
輸出:
[None, 128] [2, 5, 6]
[32, 128]
靜態維度可以認為是tensor的原始維度,如果定義tensor時候具體指定了tensor各個維度的具體值,則tensor的靜態維度就是確定的了,不可以再更改靜態維度信息了。 只有當定義tensor的時候至少一個維度上使用了 None,tensor的靜態維度才可以
使用 set_shape()再指定。
改變和查詢動態維度
動態的改變tensor的動態維度使用 tf.reshape()
查詢tensor的動態維度使用 tf.shape()
# -*- coding:utf-8 -*-
import tensorflow as tf
# 定義一個第一維度不確定的tensor
a = tf.placeholder(tf.float32, [None, 128])
# 查詢a的動態維度
dynamic_shape = tf.shape(a)
print dynamic_shape
#改變a的動態維度
a = tf.reshape(a, [32, 64,2])
# 查詢a的動態維度
dynamic_shape = tf.shape(a)
print dynamic_shape
輸出:
Tensor("Shape:0", shape=(2,), dtype=int32)
Tensor("Shape_1:0", shape=(3,), dtype=int32)