TensorFlow: как использовать «tf.data» вместо «load_csv_without_header»? - PullRequest
0 голосов
/ 30 июня 2018

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' вместо текущей функции? Как я могу использовать один и тот же dtype, в том же формате, без заголовка csv с tf.data? Я использую TF версии 1.8.0 поверх Python 3.5.

Ценю вашу помощь!

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Использование 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().

0 голосов
/ 30 июня 2018

вы можете использовать tf.TextLineReader, который имеет возможность пропустить заголовки

reader = tf.TextLineReader(skip_header_lines=1)
...