Python Tensorflow 错误“形状 Tensorshape() 必须为 1”
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/35673874/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Tensorflow error "shape Tensorshape() must have rank 1"
提问by Tanvir
import tensorflow as tf
import numpy as np
import os
from PIL import Image
cur_dir = os.getcwd()
def modify_image(image):
#resized = tf.image.resize_images(image, 180, 180, 3)
image.set_shape([32,32,3])
flipped_images = tf.image.flip_up_down(image)
return flipped_images
def read_image(filename_queue):
reader = tf.WholeFileReader()
key,value = reader.read(filename_queue)
image = tf.image.decode_jpeg(value)
return key,image
def inputs():
filenames = ['standard_1.jpg', 'standard_2.jpg' ]
filename_queue = tf.train.string_input_producer(filenames)
filename,read_input = read_image(filename_queue)
reshaped_image = modify_image(read_input)
reshaped_image = tf.cast(reshaped_image, tf.float32)
label=tf.constant([1])
return reshaped_image,label
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')
x = tf.placeholder(tf.float32, shape=[None,32,32,3])
y_ = tf.placeholder(tf.float32, shape=[None, 1])
image,label=inputs()
image=tf.reshape(image,[-1,32,32,3])
label=tf.reshape(label,[-1,1])
image_batch=tf.train.batch([image],batch_size=2)
label_batch=tf.train.batch([label],batch_size=2)
W_conv1 = weight_variable([5, 5, 3, 32])
b_conv1 = bias_variable([32])
image_4d=x_image = tf.reshape(image, [-1,32,32,3])
h_conv1 = tf.nn.relu(conv2d(image_4d, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)
W_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)
W_fc1 = weight_variable([8 * 8 * 64, 1024])
b_fc1 = bias_variable([1024])
h_pool2_flat = tf.reshape(h_pool2, [-1, 8*8*64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
W_fc2 = weight_variable([1024, 2])
b_fc2 = bias_variable([2])
y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
cross_entropy= -tf.reduce_sum(tf.cast(image_batch[1],tf.float32)*tf.log(y_conv))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
for i in range(20000):
sess.run(train_step,feed_dict={x:image_batch[0:1],y_:label_batch[0:1]})
I am trying to run the tensorflow convolutional model over my own images of dimension of[32x32x3] images. The images are being read properly and are being assigned to the placeholder, during training. The problem arises during running the train_step op. When I execute the graph I get the following error.
我正在尝试在我自己的 [32x32x3] 图像尺寸的图像上运行 tensorflow 卷积模型。在训练期间,图像被正确读取并被分配给占位符。在运行 train_step 操作期间出现问题。当我执行图表时,我收到以下错误。
TensorShape([Dimension(2), Dimension(1), Dimension(32), Dimension(32), Dimension(3)]) must have rank 1
But when I see the example here, the images are in the form of [batch_size,height,width,depth] tensors only. And this example works fine. Am I missing anything?
但是当我在这里看到示例时,图像仅采用 [batch_size,height,width,depth] 张量的形式。这个例子工作正常。我错过了什么吗?
回答by mrry
I think the error is coming from this line:
我认为错误来自这一行:
cross_entropy= -tf.reduce_sum(tf.cast(image_batch[1],tf.float32)*tf.log(y_conv))
image_batch
is a 5-D tensor, with shape [2, 1, 32, 32, 3]
, where 2 is the batch_size
argument to tf.train.batch()
, and the 1 was added by the earlier image = tf.reshape(image, [-1, 32, 32, 3])
. (N.B.This reshape is unnecessary, since tf.train.batch()
already adds a batch dimension, and you end up having to undothe effect of the reshape when you later construct image_4d
).
image_batch
是一个 5-D 张量,形状为[2, 1, 32, 32, 3]
,其中 2 是 的batch_size
参数tf.train.batch()
,而 1 是由较早的image = tf.reshape(image, [-1, 32, 32, 3])
. (注意,这种重塑是不必要的,因为tf.train.batch()
已经添加了一个批次维度,并且您最终必须在以后构造时撤消重塑的效果image_4d
)。
In TensorFlow, the slicing operation (i.e. image_batch[1]
) is slightly less flexible than in NumPy. The number of dimensions specified in the slice must be equal to the rank of the tensor: i.e. you must specify all five dimensions for this to work. You could specify image_batch[1, :, :, :, :]
to get a 4-D slice of image_batch
.
在 TensorFlow 中,切片操作(即image_batch[1]
)的灵活性略低于 NumPy。切片中指定的维度数必须等于张量的等级:即您必须指定所有五个维度才能使其工作。您可以指定image_batch[1, :, :, :, :]
获取image_batch
.
I noticed a few other issues in your program, however:
但是,我注意到您的程序中存在其他一些问题:
The
cross_entropy
calculation seems strange. Typically this uses a predicted label and compares it to the known label, as opposed to the image data.The feed on the training step seems to have no effect, because placeholders
x
andy_
are unused in your program. Furthermore, you appear to be feeding atf.Tensor
(indeed, an illegal slice ofimage_batch
), so this will fail when you execute that statement. If you intend to use feeding, you should feed in NumPy arrays holding the input data.If you're not using feeding—i.e. using the
tf.WholeFileReader
as shown in your program—you will need to calltf.train.start_queue_runners()
to get started. Otherwise your program will hang, waiting for input.
该
cross_entropy
计算似乎很奇怪。通常,这使用预测标签并将其与已知标签进行比较,而不是图像数据。训练步骤的提要似乎没有效果,因为占位符
x
和y_
未在您的程序中使用。此外,您似乎正在提供一个tf.Tensor
(实际上,非法切片image_batch
),因此当您执行该语句时这将失败。如果您打算使用馈送,则应输入保存输入数据的 NumPy 数组。如果您不使用喂食(即使用
tf.WholeFileReader
程序中所示的),则需要致电tf.train.start_queue_runners()
以开始使用。否则你的程序将挂起,等待输入。