2015-12-04 37 views
10

我試圖將本教程的專家部分應用於我自己的數據,但我一直遇到維度錯誤。這是導致錯誤的代碼。如何解決TensorFlow中的尺寸錯誤?

def weight_variable(shape): 
    initial = tf.truncated_normal(shape, stddev=0.1) 
    return tf.Variable(initial) 

def bias_variable(shape): 
    initial = tf.constant(0.1, shape=shape) 
    return tf.Variable(initial) 

def conv2d(x, W): 
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') 

def max_pool_2x2(x): 
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], 
         strides=[1, 2, 2, 1], padding='SAME') 

W_conv1 = weight_variable([1, 8, 1, 4]) 
b_conv1 = bias_variable([4]) 

x_image = tf.reshape(tf_in, [-1,2,8,1]) 

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) 
h_pool1 = max_pool_2x2(h_conv1) 

,然後當我嘗試運行此命令:

W_conv2 = weight_variable([1, 4, 4, 8]) 
b_conv2 = bias_variable([8]) 

h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) 
h_pool2 = max_pool_2x2(h_conv2) 

我收到以下錯誤:

ValueError        Traceback (most recent call last) 
<ipython-input-41-7ab0d7765f8c> in <module>() 
     3 
     4 h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) 
----> 5 h_pool2 = max_pool_2x2(h_conv2) 

ValueError: ('filter must not be larger than the input: ', 'Filter: [', Dimension(2), 'x', Dimension(2), '] ', 'Input: [', Dimension(1), 'x', Dimension(4), '] ') 

只是爲了一些背景信息,我正在着手處理數據與一個CSV文件,其中每行包含10個功能和1個空列可以是1或0.我試圖得到的是空列中的概率列將等於1.

+0

什麼是'tf_in'?我假設它是原始的1x8輸入。 – erickrf

+0

'data = genfromtxt('cs-training.csv',delimiter =',')'。 'A = data.shape [1] -1'。 'tf_in = tf.placeholder(「float」,[None,A])'。 – NickTheInventor

回答

4

你必須調整輸入的形狀,使它與訓練張量和輸出兼容。如果你輸入的是長度爲1,你的輸出應該是長度爲1(長度代替尺寸)。

當你處理與 -

def conv2d(x, W): 
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') 

def max_pool_2x2(x): 
    return tf.nn.max_pool(x, ksize=[1, 1, 1, 1], 
        strides=[1, 1, 1, 1], padding='SAME') 

注意我是如何變化的步伐和ksize到[1, 1, 1, 1]。這將匹配輸出到1維輸入並防止出現錯誤。

當你確定你的體重變化(見下面的代碼) -

def weight_variable(shape): 
    initial = tf.truncated_normal(shape, stddev=0.1) 
    return tf.Variable(initial) 

def bias_variable(shape): 
    initial = tf.constant(0.1, shape=shape) 
    return tf.Variable(initial) 

你將不得不作出的第一個2號符合您正在使用訓練模型的特徵張量,最後兩個數字將是預測輸出的維數(與輸入的維數相同)。

W_conv1 = weight_variable([1, 10, 1, 1]) 
b_conv1 = bias_variable([1]) 

注意的[1, 10,中表示該特徵張量將是一個1×10的特徵張量開始;最後兩個數字1, 1]對應於輸入和輸出張量/預測變量的尺寸。

當你重塑你的x_foo張量(我稱之爲X_ [X素]),你,無論出於何種原因,都在中等來定義它像所謂

x_ = tf.reshape(x, [-1,1,10,1]) 

注意1和10 ...1,10,...。這些數字再一次對應於您的特徵張量的維數。

對於每個偏差變量,您選擇之前定義的變量的最終數字。例如,如果W_conv1 = weight_variable([1, 10, 1, 1])看起來像這樣,則可以將最終數字放入您的偏差變量中,以便它可以與輸入的尺寸相匹配。這是這樣完成的 - b_conv1 = bias_variable([1])

如果您需要更多解釋,請在下面評論。

3

您用於過濾器的尺寸與隱藏層的輸出不匹配。

讓我看看我是否理解你:你的輸入是由8個特徵組成的,你想要將它重新組合成一個2x4矩陣,對吧?

您使用weight_variable([1, 8, 1, 4])創建的權重需要在一個通道中輸入1x8,並在4個通道(或隱藏單元)中生成1x8輸出。您正在使用的濾鏡以2x2方塊掃描輸入。但是,由於權重的結果是1x8,它們將不匹配。

你應該重塑輸入作爲

x_image = tf.reshape(tf_in, [-1,2,4,1]) 

現在,您輸入實際上是2x4的,而不是1×8。然後,您需要將體重形狀更改爲(2, 4, 1, hidden_units)以處理2x4輸出。它也會產生2x4輸出,現在可以應用2x2濾波器。

之後,過濾器將匹配權重的輸出。還要注意,你將不得不改變你的第二個權重矩陣的形狀爲weight_variable([2, 4, hidden_units, hidden2_units])

+0

好,所以我做的是'W_conv1 = weight_variable([2,4,1,8])''和'b_conv1 = bias_variable([8])''。然後我做了這個'x_image = tf.reshape(tf_in,[-1,2,4,1])'。然後我找到這個,得到一個錯誤:'W_conv2 = weight_variable([2,4,4,8])'','b_conv2 = bias_variable([8])''。我不明白你最後的hidden_​​units和hidden_​​units2是什麼意思。我認爲我可以儘可能多地投入,但教程讓你看起來總是翻倍以前的數字。即使如此,我仍然得到這個錯誤 - 「ValueError:Dimensions Dimension(8)和Dimension(4)不兼容」。 – NickTheInventor

+0

哎呀,我編輯了我的答案以糾正錯誤。第二個權重的形狀必須匹配前一個的大小,所以它是'[2,4,hidden_​​units,hidden2_units]'。隱藏單位是每個隱藏層中的單元數量,即它們的大小。它們對應於您在圖像中生成的通道數量。最佳尺寸取決於問題。 – erickrf

+0

雖然我沒有使用圖像。我使用的是一個csv文件,其中每行8個特徵和一個要預測的行,或給出一個1而不是0的概率。你可以使用這些信息來澄清你的意思嗎? – NickTheInventor