tensorflow中n維張量(矩陣)維度解析

2021-10-02 18:59:54 字數 4293 閱讀 2533

這幾天在看一些tensorflow如何建立神經網路**,對張量的維數問題產生了一些困惑,在查閱了資料後將自己的理解和感悟寫下。

更新:如何判斷張量的shape

比如:

img1 = tf.constant(value=[[[[1],[2],[3],[4]],[[1],[2],[3],[4]],[[1],[2],[3],[4]],[[1],[2],[3],[4]]]],dtype=tf.float32)
它的shape是什麼呢?

我的理解如下:

首先先看最裡面的括號,它表示一位張量,看裡面的元素的個數,上面**最裡面括號裡有1個元素。

接著看倒數第二層括號,倒數第二層括號裡面有4個元素。

同理倒數第三層括號裡有4個元素。

最外側括號裡有1個3維張量。

因此它的shape為:[1 4 4 1]

首先一維矩陣是很好理解的

a = tf.ones([2])

sess = tf.session()

sess.run(tf.global_variables_initializer())

print(sess.run(a))

產生1行2列的矩陣

a = tf.ones([2,3])

sess = tf.session()

sess.run(tf.global_variables_initializer())

print(sess.run(a))

2行3列的矩陣

三維矩陣就不能用簡單的行列式來理解了,它產生了2*3*3個1,先看最右邊的3,代表最內層矩陣有3個1(我覺得可以理解成矩陣的列),接著中間的3代表第二層矩陣,它有3行,最左邊的2表示最外層矩陣,有2行。我們如果給它填充些數字

它產生的結果如上圖,為什麼是這麼填充的呢?

首先執行最右邊的3,表示最內層矩陣a有3個元素:[1. 2. 3.]

接著執行中間的3,表示中間層b有3個最內層矩陣a:

[[1. 2. 3.]

[4. 5. 6.]

[7. 8. 9.]]

最後執行最左邊的2,表示最外層有2個中間層b,因為並有個18個數字,所以剩下的9個數字都是最後的9:

[[[1. 2. 3.]

[4. 5. 6.]

[7. 8. 9.]]

[[9. 9. 9.]

[9. 9. 9.]

[9. 9. 9.]]]

四維矩陣類似於三維矩陣

tf.reduce_mean這個函式是對矩陣求平均值

reduce_mean( input_tensor, axis=none, keep_dims=false, name=none, reduction_indices=none )

計算tensor各個維度元素的均值。這個方法根據輸入引數axis的維度上減少輸入input_tensor的維度。

舉個例子:

x = tf.constant([[1., 1.], [2., 2.]])

tf.reduce_mean(x) # 1.5

tf.reduce_mean(x, 0) # [1.5, 1.5]

tf.reduce_mean(x, 1) # [1., 2.]

x是二維陣列[[1.0,1.0],[2.0, 2.0]]

axis引數取預設值時,計算整個陣列的均值:(1.+1.+2.+2.)/4=1.5

axis取0,意味著對列取均值:[1.5, 1.5]

axis取1,意味著對行取均值:[1.0, 2.0]

如是三維陣列,則結果如下:

a = tf.constant([1.,1,2,2,3,3,4,4],shape=[2,2,2])

sess = tf.session()

sess.run(tf.global_variables_initializer())

print("初始矩陣:")

發現,當axis引數為null時,依然計算整個陣列的均值:(float)(1+2+3+4+1+2+3+4)/8=2.5

axis取0,計算方式是:

[[(1+3)/2, (1+3)/2],

[(2+4)/2, (2+4)/2]]

axis取1,計算方式是:

[[(1+2)/2, (1+2)/2],

[(3+4)/2, (3+4)/2]]

axis取2,計算方式是:

[[(1+1)/2, (2+2)/2],

[(3+3)/2, (4+4)/2]]

為什麼呢??總結的公式如下:

規律:對於k維的,如k=3.

tf.reduce_mean(x, axis=k-1)的結果是對最裡面一維所有元素進行求平均數。

tf.reduce_mean(x, axis=k-2)是對倒數第二層裡的向量對應的元素求平均數。

tf.reduce_mean(x, axis=k-3)把倒數第三層的每個向量對應元素求平均數。 

因此,當k=3,axis=2時,對最裡面的所有一維元素求平均數,我們的最內層就是(1,1),(2,2),(3,3),(4,4),第乙個數字為(1+1)/2=1;

當k=3,axis=1時,對倒數第二層的向量所對應的元素求平均數,([1,1],[2,2])和([3, 3],[4, 4]),第乙個數字為(1+2)/2=1.5;

當k=3,axis=2時,對倒數第三層的向量所對應的元素求平均數,([[1, 1], [2, 2]])([[3, 3], [4, 4]]),第乙個數字為(1+3)/2=2;

四維矩陣也是類似的自己可以嘗試算一下,加深理解。

參考:附加:關於類似於tf.reshape(input,[-1,28,28,1])這樣的函式:

是將原來的input這個張量的shape變成[-1,28,28,1]這個維數,其中的-1表示系統自動計算出在最層的維度。

tensorflow中張量的理解

自己通過網上查詢的有關張量的解釋,稍作整理。tensorflow用張量這種資料結構來表示所有的資料.你可以把乙個張量想象成乙個n維的陣列或列表.乙個張量有乙個靜態型別和動態型別的維數.張量可以在圖中的節點之間流通.在tensorflow系統中,張量的維數來被描述為階.但是張量的階和矩陣的階並不是同乙...

tensorflow中張量的理解

自己通過網上查詢的有關張量的解釋,稍作整理。tensorflow用張量這種資料結構來表示所有的資料.你可以把乙個張量想象成乙個n維的陣列或列表.乙個張量有乙個靜態型別和動態型別的維數.張量可以在圖中的節點之間流通.在tensorflow系統中,張量的維數來被描述為階.但是張量的階和矩陣的階並不是同乙...

tensorflow中張量的理解

自己通過網上查詢的有關張量的解釋,稍作整理。tensorflow用張量這種資料結構來表示所有的資料.你可以把乙個張量想象成乙個n維的陣列或列表.乙個張量有乙個靜態型別和動態型別的維數.張量可以在圖中的節點之間流通.階在tensorflow系統中,張量的維數來被描述為階.但是張量的階和矩陣的階並不是同...