2017-05-31 156 views
-1

以下行的回溯是「語法錯誤」。爲什麼? 我做什麼修復它?這個陳述有什麼問題?

w1=tf.Variable(tf.truncated_normal(shape=[3,3,1,20]) 
layer=tf.nn.conv2d(input=img,filter=w1,strides=[1,1,1,1],padding='SAME') 

'img'是灰度圖像(np.array),1x32x32x1。

但是,下面的行工作得很好:

def new_w(shape): 
return tf.Variable(tf.truncated_normal(shape,stddev=0.05)) 

然後:

w1=new_w(shape=[3,3,1,20]) 
    layer=tf.nn.conv2d(input=img,filter=w1,strides=[1,1,1,1],padding='SAME') 

當我說「非常好」我指的是線也是一個會話中運行,產生 一個該層的數值。這兩種表述之間有什麼區別?

回答

0

從文檔https://www.tensorflow.org/api_docs/python/tf/nn/conv2d

輸入應該是一個tensorflow.Tensor,而你說,IMG是灰度圖像(我想轉換成numpy.ndarray)。

您應該創建一個常量張量,其值爲圖像或佔位符,並將img作爲佔位符的值提供。

例如:

constant_img = tf.constant(img, shape=img.shape, dtype=tf.float32) 
layer = tf.nn.conv2d(input=constant_img, filter=w1,strides=[1,1,1,1],padding='SAME') 
在這兩種情況下

placeholder_img = tf.placeholder(dtype=tf.float32, shape=img.shape) 
layer = tf.nn.conv2d(input=placeholder_img, filter=w1,strides=[1,1,1,1],padding='SAME')  

,層將是一個tf.Tensor,所以就不會看到任何數值數據。要提取數值數據,你將不得不打開一個會話,這樣做

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 

,然後,在第一種情況下(常量)

layer_val = sess.run([layer]) 

,而在第二種情況下(佔位符)

layer_val = sess.run([layer], feed_dict={placeholder_img: img}) 
+0

請參閱我修改上面 –

+0

的一點是,tf.conv2d的輸入參數應該是一個tensorflow.Tensor,而不是numpy.ndarray –

+0

tf.conv2d運行perfectl嗯,在np.array上。正如我寫的,我檢查了它。這兩個陳述之間的唯一區別在於過濾器的定義。在第一行中,它是在一個函數之外定義的,而在另外兩行中則是在沒有函數的情況下定義的。 –