2017-04-06 21 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以占位符的形式表示该维度的大小是可变的,但维度应该仍然存在。