【问题标题】:TensorFlow decode_csv shape errorTensorFlow decode_csv 形状错误
【发布时间】:2018-03-25 08:37:30
【问题描述】:

我使用tf.data.TextLineDataset 读入*.csv 文件并在其上应用map

dataset = tf.data.TextLineDataset(os.path.join(data_dir, subset, 'label.txt'))
dataset = dataset.map(lambda value: parse_record_fn(value, is_training),
                          num_parallel_calls=num_parallel_calls)

解析函数parse_record_fn如下:

def parse_record(raw_record, is_training):
    default_record = ["./", -1]
    filename, label = tf.decode_csv([raw_record], default_record)
    # do something
    return image, label

但是在解析函数中在tf.decode_csv 处引发了一个ValueError

ValueError: Shape must be rank 1 but is rank 0 for 'DecodeCSV' (op: 'DecodeCSV') with input shapes: [1], [], [].

我的*.csv 文件示例:

/data/1.png, 5
/data/2.png, 7

问题

  1. 哪里出了问题?
  2. shapes: [1], [], [] 是什么意思?

复制

这个错误可以在这段代码中重现:

import tensorflow as tf
import os

def parse_record(raw_record, is_training):
    default_record = ["./", -1]
    filename, label = tf.decode_csv([raw_record], default_record)

    # do something

    return image, label

with tf.Session() as sess:
    csv_path = './labels.txt'


    dataset = tf.data.TextLineDataset(csv_path)

    dataset = dataset.map(lambda value: parse_record(value, True))


sess.run(dataset)

【问题讨论】:

    标签: python tensorflow tensorflow-datasets


    【解决方案1】:

    查看tf.decode_csv的文档,它说的是默认记录:

    record_defaults:具有特定类型的张量对象列表。 可接受的类型是 float32、float64、int32、int64、string。一 输入记录的每列张量,具有标量默认值 该列的值,如果需要该列,则为空。

    我相信你得到的错误源于你如何定义张量default_record。您的 default_record 当然是张量对象(或可转换为张量的对象)的列表,但我认为错误消息告诉它们应该是 rank-1 张量,而不是像您的情况那样是 rank-0 张量。

    您可以通过将默认记录设置为 1 张量来解决此问题。请参阅以下玩具示例:

    import tensorflow as tf
    
    my_line = 'filename.png, 10'
    default_record_1 = [['./'], [-1]] # do this!
    default_record_2 = ['./', -1] # this is what you do now
    
    decoded_1 = tf.decode_csv(my_line, default_record_1)
    with tf.Session() as sess:
        d = sess.run(decoded_1)
        print(d)
    
    # This will cause an error
    decoded_2 = tf.decode_csv(my_line, default_record_2)
    

    最后一行产生的错误很熟悉:

    ValueError: Shape 必须是 1 级,但对于“DecodeCSV_1”是 0 级(操作: 'DecodeCSV') 输入形状:[]、[]、[]。

    在消息中,输入形状,三个括号[],指的是tf.decode_csv 的输入参数recordsrecord_defaultsfield_delim 的形状。在您的情况下,这些形状中的第一个是[1],因为您输入了[raw_record]。我同意这个案例的信息不是很丰富......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-25
      • 2017-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多