我使用128 x 128 x 128 ndarray作为输入到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,label])
这是网络的初始化:
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)
答案 0 :(得分:1)
在上一个问题中,您为网络提供了一个列表,其中包含一张图片:[image]。这就是为什么不需要第一维数据并且重塑为(128,128,128,1)就足够了。在最后一个示例中,提供[image]或[image1,image2,image3]。但是,现在您在没有列表的情况下提供图像:df
x1 x2 winner
1 1 1 a
2 4 0 h
3 0 0 a
4 2 1 h
5 1 1 a
6 1 1 a
7 1 1 a
8 0 0 a
>
因此第一个维度消失了,但它不起作用。
batch[0]
的整体形状为(1,128,128,128,1)并且有效
[np.reshape(image, (128, 128, 128, 1))]
的总体形状为(1,128,128,128,1)并且也有效
np.reshape(image, (1, 128, 128, 128, 1))
的整体形状为(128,128,128,1)并且不起作用。
您可以将图像放回列表中,也可以直接将图像重新整形为(1,128,128,128,1)。在这两种情况下,整体形状都是正确的。但是,如果您还计划输入多个图像,则使用该列表会更简单,并用(128,128,128,1)个形状图像填充。
就目前而言,您还可以将np.reshape(image, (128, 128, 128, 1))
用于1张图片,将batch_X = [batch[0]]
用于多张图片
答案 1 :(得分:0)
您的占位符的等级为5,因此您需要提供一个5维np数组,但您重新定义为4维np数组。因此,请在评论中指出使用data = np.reshape(data, (1, 128, 128, 128, 1))
而不是data = np.reshape(data, (128, 128, 128, 1))
。
基本上,占位符形状的None
表示此维度的大小是可变的,但维度应该仍然存在。