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。
感谢您的帮助!
答案 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数据集。
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>)
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 article和this;可以肯定地说,这将涵盖您大部分(如果不是全部)用例,并将帮助您从不推荐使用的load_csv_without_header()
函数进行迁移。
答案 1 :(得分:0)
您可以使用tf.TextLineReader,该选项具有跳过标题的选项
reader = tf.TextLineReader(skip_header_lines=1)