Tensorflow从CSV创建tfrecords文件

15

我正在尝试将一个包含浮点数的csv文件写入tfrecords文件,然后再读取出来。所有我看到的示例都是将csv列打包,然后直接将它们馈送到sess.run()中,但我不知道如何将特征列和标签列写入tfrecord。我该怎么做呢?


1
我的回答解决了你的问题吗? - standy
是的,抱歉让你久等了,最近我非常忙。感谢你的帮助! - Nitro
3个回答

41

您需要一份单独的脚本将您的CSV文件转换为TFRecords。

假设您有一个包含以下标题的CSV:

feature_1, feature_2, ..., feature_n, label

您需要使用类似于pandas的工具读取CSV文件,手动构建tf.train.Example,然后使用TFRecordWriter将其写入文件。

csv = pandas.read_csv("your.csv").values
with tf.python_io.TFRecordWriter("csv.tfrecords") as writer:
    for row in csv:
        features, label = row[:-1], row[-1]
        example = tf.train.Example()
        example.features.feature["features"].float_list.value.extend(features)
        example.features.feature["label"].int64_list.value.append(label)
        writer.write(example.SerializeToString())

看起来这段代码只能添加浮点特征。你需要一种方法来调整代码以支持Int64特征,或者特别是分类的ByteList特征。 - krishnab
为什么在标签中只有一个值而不是列表时要使用 int64_list? - azerty
3
对于TF 2.0,请使用tf.io.TFRecordWriter()代替。 - Badger Titan

6
以下解决方案在我的情况下无效。另一种读取csv文件并创建tfRecord的方法如下所示:
特征集列名称为:Sl.No:, Time, Height, Width, Mean, Std, Variance, Non-homogeneity, PixelCount, contourCount, Class。
从dataset.csv中获得的样本特征如下所示:
Features= [5, 'D', 268, 497, 13.706, 863.4939, 29.385, 0.0427, 39675, 10]
标签:medium
import pandas as pd
import tensorflow as tf

def create_tf_example(features, label):

    tf_example = tf.train.Example(features=tf.train.Features(feature={
        'Time': tf.train.Feature(bytes_list=tf.train.BytesList(value=[features[1].encode('utf-8')])),
        'Height':tf.train.Feature(int64_list=tf.train.Int64List(value=[features[2]])),
        'Width':tf.train.Feature(int64_list=tf.train.Int64List(value=[features[3]])),
        'Mean':tf.train.Feature(float_list=tf.train.FloatList(value=[features[4]])),
        'Std':tf.train.Feature(float_list=tf.train.FloatList(value=[features[5]])),
        'Variance':tf.train.Feature(float_list=tf.train.FloatList(value=[features[6]])),
        'Non-homogeneity':tf.train.Feature(float_list=tf.train.FloatList(value=[features[7]])),
        'PixelCount':tf.train.Feature(int64_list=tf.train.Int64List(value=[features[8]])),
        'contourCount':tf.train.Feature(int64_list=tf.train.Int64List(value=[features[9]])),
        'Class':tf.train.Feature(bytes_list=tf.train.BytesList(value=[label.encode('utf-8')])),
    }))
    return tf_example

csv = pd.read_csv("dataset.csv").values
with tf.python_io.TFRecordWriter("dataset.tfrecords") as writer:
  for row in csv:
     features, label = row[:-1], row[-1]
     print features, label
     example = create_tf_example(features, label)
     writer.write(example.SerializeToString())
writer.close()

更多详细信息请点击这里。这对我很有效,希望对你也有帮助。


1
感谢提供示例。在TF 2.x中,TFRecordWriter已经被移动到tf.io.TFRecordWriter - Nitin

1
def convert_to():
filename = os.path.join(wdir, 'ml-100k' + '.tfrecords')
print('Writing', filename)
with tf.python_io.TFRecordWriter(filename) as writer:
    with open("/Users/shishir/Documents/botconnect_Playground/tfRecords/ml-100k.train.rating", "r") as f:
        line = f.readline()
        while line != None and line != "":
            arr = line.split("\t")
            u, i, l  = int(arr[0]), int(arr[1]), int(arr[2])
            u_arr = np.reshape(u,[1]).astype('int64')
            i_arr = np.reshape(i,[1]).astype('int64')
            l_arr = np.reshape(l,[1]).astype('int64')
            example = tf.train.Example()
            example.features.feature["user"].int64_list.value.extend(u_arr)
            example.features.feature["item"].int64_list.value.extend(i_arr)
            example.features.feature["label"].int64_list.value.append(int(l_arr))
            writer.write(example.SerializeToString())
            line = f.readline()

那就是我的解决方案,它有效!希望这有所帮助。干杯。

感谢您提供这段代码片段,它可能为一些短期帮助提供了一定限制。通过展示为什么这是一个好的解决方案,适当的解释将极大地提高其长期价值,并使其对未来有类似问题的读者更加有用。请[编辑]您的答案并添加一些解释,包括您所做出的假设。 - Toby Speight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接