2017-04-06 19 views
1

我使用128×128×128 ndarrays作爲輸入到CNN使用:形狀失配

# input arrays 
    x = tf.placeholder(tf.float32, [None, 128, 128, 128, 1]) 

的每個ndarray沒有colur信道數據,所以就用:

data = np.reshape(data, (128, 128, 128, 1)) 

爲了得到它最初適合佔位符。但現在我得到這個錯誤:

Traceback (most recent call last): 
    File "tfvgg.py", line 287, in <module> 
    for i in range(10000 + 1): training_step(i, i % 100 == 0, i % 20 == 0) 
    File "tfvgg.py", line 277, in training_step 
    a, c = sess.run([accuracy, cross_entropy], {x: batch_X, y: batch_Y}) 
    File "/home/entelechy/tfenv/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 717, in run 
run_metadata_ptr) 
    File "/home/entelechy/tfenv/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 894, in _run 
% (np_val.shape, subfeed_t.name, str(subfeed_t.get_shape()))) 
ValueError: Cannot feed value of shape (128, 128, 128, 1) for Tensor 'Placeholder:0', which has shape '(?, 128, 128, 128, 1)' 

我感到困惑的佔位符的工作方式,因爲我認爲第一個參數是爲批量大小。通過使用None,我認爲佔位符可以使用任意數量(128,128,128,1)的輸入。因爲這是一個3d網絡,所以如果我將佔位符更改爲(128,128,128,1),則會在第一個conv3d圖層上丟失參數以引發錯誤。

我缺少關於佔位符參數傳遞的信息?

編輯: (train_data是列表的列表,每個爲[ndarray,標號])

這是網絡的初始化:

def training_step(i, update_test_data, update_train_data): 

    for a in range(len(train_data)): 

     batch = train_data[a] 
     batch_X = batch[0] 
     batch_Y = batch[1] 

     # learning rate decay 
     max_learning_rate = 0.003 
     min_learning_rate = 0.0001 
     decay_speed = 2000.0 
     learning_rate = min_learning_rate + (max_learning_rate - min_learning_rate) * math.exp(-i/decay_speed) 

     if update_train_data: 
      a, c = sess.run([accuracy, cross_entropy], {x: batch_X, y: batch_Y}) 
      print(str(i) + ": accuracy:" + str(a) + " loss: " + str(c) + " (lr:" + str(learning_rate) + ")") 


     if update_test_data: 
      a, c = sess.run([accuracy, cross_entropy], {x: test_data[0], y: test_data[1]}) 
     print(str(i) + ": ********* epoch " + " ********* test accuracy:" + str(a) + " test loss: " + str(c)) 

     sess.run(train_step, {x: batch_X, y: batch_Y, lr: learning_rate}) 

for i in range(10000 + 1): training_step(i, i % 100 == 0, i % 20 == 0) 
+1

你不應該重塑數據的大小爲'(1,128,128,128,1)' ,即批量= 1? – hbaderts

回答

1

在你最後一個問題中,你給網絡一個列表帶有一個圖像:[image]。這就是爲什麼不需要數據的第一維度,重塑(128,128,128,1)就足夠了。在最後一個例子中,Feeding [image]或[image1,image2,image3]工作。但是,現在您正在提供沒有列表的圖像:batch[0],所以第一個維度已消失,並且不起作用。

[np.reshape(image, (128, 128, 128, 1))]具有(1,128,128,128,1)和工作

np.reshape(image, (1, 128, 128, 128, 1))具有(1,128,128,128,1)和工程太

np.reshape(image, (128, 128, 128, 1))整體形狀的整體形狀沒有列表的整體形狀(128,128,128,1)並且不起作用。

您可以將圖像放回列表中或直接將其重新整形爲(1,128,128,128,1)。在這兩種情況下,整體形狀都是正確的。但是,如果您還計劃輸入多個圖像,則使用該列表更簡單,並用(128,128,128,1)形狀的圖像填充它。

在現在的方式是,也可以使用batch_X = [batch[0]] 1個圖像和batch_X = batch[0:4]爲多個圖像

0

你的佔位符有等級5,所以你需要提供一個5維np數組,但是您重新變形爲4維np數組。因此,請使用data = np.reshape(data, (1, 128, 128, 128, 1))而不是data = np.reshape(data, (128, 128, 128, 1)),正如評論中指出的那樣。

實質上,None以佔位符的形式表示該維度的大小是可變的,但維度應該仍然存在。