2017-08-29 79 views
0

我正在嘗試構建可變批量大小,可變整形和可變重量形狀的圖形。我正在使用tensorflow 1.3.0。Tensorflow可變批量大小,可變整形和權重

用下面的代碼,tf.get_variable拋出一個類型錯誤:INT()參數必須是字符串或數字,而不是「張量」pool2被定義在代碼的其他地方。

# declare placeholder for variable batch size 
images_ph = tf.placeholder(tf.float32, shape=[None, 64, 64, 1]) 
# code for 2 layers of convolution, normalization and max pooling 
# reshape to perform, one matrix multiply 
reshape = tf.reshape(pool2, [tf.shape(images_ph)[0], -1]) 
dim = tf.shape(reshape)[1] 
var = tf.get_variable('name', [dim, 384], validate_shape=False) 

我還試圖替代暗淡具有「正確的」類型如下:

dim = reshape.get_shape()[1] 

暗淡等於和拋出一個ValueError異常:的形狀一個新的變量(local3/xpto)必須被完全定義,而是(?,384)。

+0

它看起來像pool2沒有定義。 – Kamran

+0

pool2未在代碼段中定義,但在代碼的其他位置定義 – rafaelvalle

回答

0

感謝大家的努力幫助。

鑑於我將pool2的輸出展平以執行一個matmul,所以解決方案是顯式計算重塑的第二維的長度。這是在第1行和第2行計算的,其中第一行的偏移量來自可變批量大小。

我無法使用所有尺寸未指定的重塑。

pool2_shapes = pool2.get_shape().as_list()[1:] 
pool2_features_length = reduce(lambda x, y: x*y, pool2_shapes) 
reshape = tf.reshape(pool2, [tf.shape(images)[0], pool2_features_length]) 
+0

您可以將'-1'傳遞給'reshape'的任何一個維度來獲得'rest',所以只需使用'pool2 = tf.reshape(pool2,(tf.shape(images)[0],-1) )' – DomJack

+0

這不起作用,因爲tf.shape(圖像)[0]是無。這正是我的問題。 – rafaelvalle

+0

啊,在這種情況下,你可以節省查找'None'形狀,'tf.reshape(pool2,(-1,pool2_features_length))'的努力。不是很大的節約,但如果你問我,會使代碼更具可讀性。 – DomJack

1

的第二個參數get_variable取整數或字符串,但作爲錯誤說,你給它一個張[dim, 384]

參見:https://www.tensorflow.org/api_docs/python/tf/get_variable

+0

感謝您的評論。我也試過這個,但它引發了另一個錯誤。我認爲這可能是可以解決的,如果我使用validate_shape作爲False。 – rafaelvalle

+0

嘗試類似於 'var = tf.get_variable('name',tf.shape(reshape))' – Kamran

+0

這將返回一個錯誤,因爲tf.shape(reshape)[1]的類型是張量。 – rafaelvalle

0

tf.shape返回一個張量,所以在[dim, 384]昏暗是張量;這裏是一個int所需要的。

嘗試dim = reshape.get_shape().as_list()[1]#輸出爲int類型的

+0

感謝您的評論。我也試過這個,但它引發了另一個錯誤。請檢查更新的問題。 – rafaelvalle

+0

您錯過了'as_list()' – prometeu

+0

雖然as_list從Dimension更改爲None類型,但它不能解決問題。 – rafaelvalle