對輸入或輸出而言:dom
一個張量的形狀爲a x b x c x d,實際寫出這個張量時:spa
最外層括號[…]表示這個是一個張量,無別的意義!code
次外層括號有a個,表示這個張量裏有a個樣本orm
再往內的括號有b個,表示每一個樣本的長blog
再往內的括號有c個,表示每一個樣本的寬class
再往內沒有括號,也就是最內層的括號裏的數有d個,表示每一個樣本的深度爲d方法
tf.nn.conv2d(), tf.reshape()等都是這樣表示filter
給一個具體的張量,求這個張量的a,b,c,d值時,首先忽略最外層的括號,再數次外層括號個數(a),再往內(b),再往內(c),最後看最裏層的括號內有幾個數(d)(各數表明各深度層的值)。di
如:ant
Tensor = tf.constant([[[[1],[2],[ 3]],[[4],[5],[6 ]],[[ 7],[8],[9]]]]) # 也能夠不寫逗號
# Tensor.shape = (1, 3, 3, 1)
形狀爲(1, 3, 3, 1)
(看着容易眼花,因此通常豎着寫)
Tensor2 = tf.constant([[[[1],[2],[ 3]],[[4],[5],[6 ]],[[ 7],[8],[9]]], [[[1],[2],[ 3]],[[4],[5],[6 ]],[[ 7],[8],[9]]]])
# Tensor2.shape = (2, 3, 3, 1)
形狀爲(2, 3, 3, 1)
相似的還有tf.ones(), tf.zeros()
注意!!!
對卷積核來講,a,b,c,d對應的括號形式雖然相同,但a,b,c,d表明的含義和輸入不同!!分別表明長,寬,深,個數!!因此書寫時要注意括號的形式!!好比我要寫一個長寬分別爲2,2,深度爲1,個數爲1的kernel張量,則它的形狀應爲(2,2,1,1),而不是(1,2,2,1),用相似tf.random.normal的方法來初始化kernel或weights時也是(長,寬,深,個數)
好比:
filter = tf.constant([[[[1]], [[2]]], [[[ 3]], [[4]]]])
我想多是和矩陣的乘法(左矩陣和右矩陣的位置)有關
池化層的池化窗口大小ksize形狀爲[1, height, width, 1]
使用tensor.reshape(-1, a, b, c)時,-1表明不指定這一維的大小,由於張量裏的元素個數是必定的,其餘維的大小肯定後,這一維的大小也隨之肯定,但不能在2各維度上使用-1(能夠想象爲解一元方程組,有一個未知數時方程有特解,有兩個未知數時方程的解不定)