问题
I am able to create the tfrecords file by using the below code.
def _int64_feature(value):
return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))
def _bytes_feature(value):
return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
def convert_to_tfrecord(images,labels,file_name):
# images is a numpy array of shape (num_images,channel,rows,column)
# labels is a numpy array of shape (num_images,)
num_labels = np.shape(labels)
(num_images,depth,rows,cols) = np.shape(images)
writer = tf.python_io.TFRecordWriter(file_name)
for index in range(num_images):
image_raw = images[index]
image_raw = image_raw.astype(np.float32)
image_raw = image_raw.tostring()
example = tf.train.Example(features=tf.train.Features(feature={
'height': _int64_feature(rows),
'width': _int64_feature(cols),
'depth': _int64_feature(depth),
'label': _int64_feature(int(labels[index])),
'image_raw': _bytes_feature(image_raw)}))
writer.write(example.SerializeToString())
writer.close()
But, while reading data from the tfrecord file by using the below function
def read_and_decode(filename_queue):
reader = tf.TFRecordReader()
_, serialized_example = reader.read(filename_queue)
img_features = tf.parse_single_example(
serialized_example,
features={
'height': tf.FixedLenFeature([], tf.int64),
'width': tf.FixedLenFeature([], tf.int64),
'depth': tf.FixedLenFeature([], tf.int64),
'image_raw': tf.FixedLenFeature([], tf.string),
'label': tf.FixedLenFeature([], tf.int64),
})
image = tf.decode_raw(img_features['image_raw'], tf.float32)
label = tf.cast(img_features['label'], tf.int32)
height = tf.cast(img_features['height'], tf.int32)
width = tf.cast(img_features['width'], tf.int32)
depth = tf.cast(img_features['depth'], tf.int32)
image_shape = tf.stack([depth,height, width])
image = tf.reshape(image, image_shape)
return image,label
def inputs(batch_size, num_epochs):
filename = ['set1.tfrecords']
# dir_path is a global variable
file_path = dir_path + 'set1.tfrecords'
filename_queue = tf.train.string_input_producer([file_path], num_epochs=1)
image,label = read_and_decode(filename_queue)
images, sparse_labels = tf.train.shuffle_batch(
[image, label], batch_size=batch_size, num_threads=2,
capacity=1000 + 3 * batch_size, min_after_dequeue=1000)
return images, sparse_labels
I am getting the following error constantly
images, labels = tf.train.shuffle_batch([image, label], batch_size=10, capacity=30, num_threads=1, min_after_dequeue=10)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/input.py", line 1225, in shuffle_batch
name=name)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/input.py", line 781, in _shuffle_batch
dtypes=types, shapes=shapes, shared_name=shared_name)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/data_flow_ops.py", line 641, in __init__
shapes = _as_shape_list(shapes, dtypes)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/data_flow_ops.py", line 77, in _as_shape_list
raise ValueError("All shapes must be fully defined: %s" % shapes)
ValueError: All shapes must be fully defined: [TensorShape([Dimension(None)]), TensorShape([])]
What is the reason for the above error and how to overcome this? I am able to read the tfrecords file by iterating over the file by using tf.python_io.tf_record_iterator(path=filename)
.
回答1:
The error is raised because tf.train.shuffle_batch
needs to know the shape of your tensors to be able to batch them (items in a batch must have all the same shape).
In principle, however, raw data can have different sizes, so tf.decode_raw
doesn't set any shape for your tensor.
In the comments, you mention that all your images have shape (192,81,2)
, so you only need to set that shape in the image tensor before returning from read_and_decode
:
def read_and_decode(filename_queue):
# rest of your code here
image_shape = [height, width, depth]
image = tf.reshape(image, image_shape)
image.set_shape(image_shape) #<<<<<<<<<<<<<<<
return image,label
来源:https://stackoverflow.com/questions/47809776/unable-to-read-from-tensorflow-tfrecord-file