TensorFlow:如何使用'tf.data'代替'load_csv_without_header'?

时间:2018-06-30 10:18:30

标签: python tensorflow deep-learning pycharm tensorflow-datasets

2年前,我在TensorFlow中编写了代码,在数据加载过程中,我使用了“ load_csv_without_header”函数。 现在,当我运行代码时,我收到消息:

WARNING:tensorflow:From C:\Users\Roi\Desktop\Code_Win_Ver\code_files\Tensor_Flow\version1\build_database_tuple.py:124: load_csv_without_header (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.data instead.

如何使用“ tf.data”代替当前函数?如何在没有带有tf.data的csv标头的情况下,以相同的格式使用相同的dtype?我在Python 3.5上使用的是TF版本1.8.0。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

使用tf.data处理csv文件:

来自TensorFlow的official documentation

  

tf.data模块包含一个类的集合,这些类使您可以轻松地加载数据,对其进行处理并将其通过管道传递到模型中。

使用tf.data.Dataset这个API是与TensorFlow中的数据接口的新标准。它表示“一系列元素,其中每个元素包含一个或多个Tensor对象”。对于CSV,元素只是训练示例的单行,表示为分别对应于数据(我们的x)和标签(“目标”)的一对张量。

使用API​​来提取tensorflow数据集(tf.data.Dataset)中的每一行(或更准确地说是每个元素)的主要方法是使用Iterator,而TensorFlow具有一个名为tf.data.Iterator的API。 。要返回下一行,例如,我们可以在迭代器上调用get_next()

现在使用代码以获取csv并将其转换为我们的tensorflow数据集。

方法1:tf.data.TextLineDataset()tf.decode_csv()

使用TensorFlow的Estimator API的最新版本而不是load_csv_without_header,您将读取CSV或使用更通用的tf.data.TextLineDataset(you_train_path)。如果有标题行,可以将其与skip()链接以跳过第一行,但是在您的情况下,则没有必要。

然后,您可以使用tf.decode_csv()将CSV的每一行解码打包到其各自的字段中。

代码解决方案:

import tensorflow as tf
train_path = 'data_input/iris_training.csv'
# if no header, remove .skip()
trainset = tf.data.TextLineDataset(train_path).skip(1)

# Metadata describing the text columns
COLUMNS = ['SepalLength', 'SepalWidth',
           'PetalLength', 'PetalWidth',
           'label']
FIELD_DEFAULTS = [[0.0], [0.0], [0.0], [0.0], [0]]
def _parse_line(line):
    # Decode the line into its fields
    fields = tf.decode_csv(line, FIELD_DEFAULTS)

    # Pack the result into a dictionary
    features = dict(zip(COLUMNS,fields))

    # Separate the label from the features
    label = features.pop('label')

    return features, label

trainset = trainset.map(_parse_line)
print(trainset)

您会得到:

<MapDataset shapes: ({
    SepalLength: (), 
    SepalWidth: (), 
    PetalLength: (), 
    PetalWidth: ()}, ()), 
types: ({
    SepalLength: tf.float32, 
    SepalWidth: tf.float32, 
    PetalLength: tf.float32, 
    PetalWidth: tf.float32}, tf.int32)>

您可以验证output classes

{'PetalLength': tensorflow.python.framework.ops.Tensor,
  'PetalWidth': tensorflow.python.framework.ops.Tensor,
  'SepalLength': tensorflow.python.framework.ops.Tensor,
  'SepalWidth': tensorflow.python.framework.ops.Tensor},
 tensorflow.python.framework.ops.Tensor)

您还可以使用get_next来迭代迭代器:

x = trainset.make_one_shot_iterator()
x.next()
# Output:
({'PetalLength': <tf.Tensor: id=165, shape=(), dtype=float32, numpy=1.3>,
  'PetalWidth': <tf.Tensor: id=166, shape=(), dtype=float32, numpy=0.2>,
  'SepalLength': <tf.Tensor: id=167, shape=(), dtype=float32, numpy=4.4>,
  'SepalWidth': <tf.Tensor: id=168, shape=(), dtype=float32, numpy=3.2>},
 <tf.Tensor: id=169, shape=(), dtype=int32, numpy=0>)

方法2:from_tensor_slices()从numpy或pandas构造数据集对象

train, test = tf.keras.datasets.mnist.load_data()
mnist_x, mnist_y = train

mnist_ds = tf.data.Dataset.from_tensor_slices(mnist_x)
print(mnist_ds)
# returns: <TensorSliceDataset shapes: (28,28), types: tf.uint8>

另一个(更详细的)示例:

import pandas as pd

california_housing_dataframe = pd.read_csv("https://download.mlcc.google.com/mledu-datasets/california_housing_train.csv", sep=",")
# Define the input feature: total_rooms
my_feature = california_housing_dataframe[["total_rooms"]]

# Configure a numeric feature column for total_rooms
feature_columns = [tf.feature_column.numeric_column("total_rooms")]

# Define the label
targets = california_housing_dataframe["median_house_value"]

# Convert pandas data into a dict of np arrays.
features = {key:np.array(value) for key,value in dict(features).items()}                                           

# Construct a dataset, and configure batching/repeating.
ds = tf.data.Dataset.from_tensor_slices((features,targets))

我也强烈建议从官方文档中获取this articlethis;可以肯定地说,这将涵盖您大部分(如果不是全部)用例,并将帮助您从不推荐使用的load_csv_without_header()函数进行迁移。

答案 1 :(得分:0)

您可以使用tf.TextLineReader,该选项具有跳过标题的选项

reader = tf.TextLineReader(skip_header_lines=1)