TFRecord 读取数据图像数据维度问题

在制作自己的数据集时采用了 TFRecord 形式但是在读取时出现了问题

def read_tfRecord (tfRecord_path):
    filename_queue = tf.train.string_input_producer ([tfRecord_path], shuffle=True)
    reader = tf.TFRecordReader ()
    _, serialized_example = reader.read (filename_queue) 
    features = tf.parse_single_example (serialized_example,
                                       features={
                                        'label': tf.FixedLenFeature ([], tf.string),
                                        'image_raw': tf.FixedLenFeature ([], tf.string),
                                        'height': tf.FixedLenFeature ([], tf.int64),
                                        'width': tf.FixedLenFeature ([], tf.int64),
                                        'channel': tf.FixedLenFeature ([], tf.int64)                                        
                                        })
    
    img = tf.decode_raw (features ['image_raw'], tf.uint8)
    label = tf.decode_raw (features ['label'], tf.float32)
    
    height = tf.cast (features ['height'], tf.int32)
    width = tf.cast (features ['width'], tf.int32)
    channel = tf.cast (features ['channel'], tf.int32)
    
    
    image = tf.reshape (img, [height, width, channel])
    groundtruth = tf.reshape (label, [height, width])
    
    

    
    print (height)
    print (image)
    print (groundtruth)
    

    return image, groundtruth 
      
def get_tfrecord (num, isTrain=True):
    if isTrain:
        tfRecord_path = tfRecord_train
    else:
        tfRecord_path = tfRecord_test
    img, label = read_tfRecord (tfRecord_path)
    
    
    img_batch, label_batch = tf.train.shuffle_batch ([img, label],
                                                    batch_size = num,
                                                    num_threads = 2,
                                                    capacity = 10,
                                                    min_after_dequeue = 7)
    
    return img, label

代码如图中所示,我在制作 tfrecord 文件的时候保存了图像维度信息,然后在解码以后重新用 tf.reshape () 恢复,但是在用 tf.train.shuffle_batch () 时,报错出现
ValueError: All shapes must be fully defined: [TensorShape ([Dimension (None), Dimension (None), Dimension (None)]), TensorShape ([Dimension (None), Dimension (None)])]

这就很困惑了,我已经 reshape 了但是为什么他说我没有定义!!!!!
求解!!!!


唐青枫, 发表于 2018-8-21 14:51:10

魇餍, 2018-8-21 15:41:38
tensor.set_shape ([height, width, 1])
手动设置一下就可以了

唐青枫: 我试过了 image.set_shape () 但是还是有问题吧,set_shape () 要求参数不能是 tensor,而我从 tfrecord 解码出来的 height 和 width 都是 tensor~~哎
2018-8-21 15:59

魇餍: 就不要使用解析之后的宽高,自己定义一个全局变量 IMAGE_HIGHT,IMAGE_WITH
2018-8-21 18:47

唐青枫: 回复 魇餍 :问题在于我数据集中的图片尺寸是不定的~~难点在于这一点,如果尺寸都一样反而容易了
2018-8-21 19:04

魇餍: 载数据增强中先对数据进行随机裁剪一样大小的图片,distorted_image1 = tf.random_crop (image1, [height, width, 3]),在 set_shape ()
2018-8-22 15:04


2018-8-21

对了~在这里再说明一下:我采用的数据集图像尺寸是不一样的!!!而网上大多是图像尺寸固定的方式


唐青枫 发表于 2018-8-21 19:08:00