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)


免責聲明!

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



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