Использование tf.data
для работы с csv
файлом:
Из официальной документации TensorFlow :
Модуль tf.data содержит коллекцию классов, которая позволяет вам легко загружать данные, манипулировать ими и передавать их в вашу модель.
Используя API, tf.data.Dataset
задуман как новый стандарт взаимодействия с данными в TensorFlow. Он представляет собой «последовательность элементов, в которой каждый элемент содержит один или несколько объектов Tensor». Для CSV элемент - это всего лишь одна строка обучающего примера, представленная в виде пары тензоров, которые соответствуют данным (нашим x
) и метке («цели») соответственно.
Используя API, основной метод извлечения каждой строки (или каждого элемента более точно) в наборе данных тензорного потока (tf.data.Dataset
) заключается в использовании Iterator, и TensorFlow имеет для этого API с именем tf.data.Iterator
. Чтобы вернуть следующую строку, мы можем вызвать get_next()
для Итератора, например.
Теперь перейдем к коду, чтобы взять csv
и преобразовать его в наш набор данных tenorflow.
Метод 1: tf.data.TextLineDataset()
и tf.decode_csv()
С более свежими версиями Estimator API TensorFlow вместо 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))
Я также настоятельно рекомендую эту статью и эту , обе из официальной документации; Можно с уверенностью сказать, что это должно охватывать большинство, если не все ваши варианты использования, и поможет вам перейти от устаревшей функции load_csv_without_header()
.