Tensorflow: создайте input_fn для предварительной обработки текста с помощью API tf.data.Dataset
Я работаю через обучение модели Tensorflow и использую tf.data.Dataset
API. Я работаю через этот урок:
Короче говоря, у меня есть панды DataFrame, df
с колонкой под названием text
и столбец под названием label
, Я хотел бы создать input_fn
который возвращает кортеж (feature, indexes), где features - это словарь Tensors, а index - это единственный тензор индексов меток.
Все, что я хотел бы сделать, это разбить мою строку на пробел, преобразовать слова в целые числа (каждое слово получает уникальное целое число) и заполнить до длины 100. Это версия учебника:
def input_fn(filenames,
num_epochs=None,
shuffle=True,
skip_header_lines=0,
batch_size=200):
"""Generates features and labels for training or evaluation.
"""
dataset = tf.data.TextLineDataset(filenames).skip(skip_header_lines).map(parse_csv)
if shuffle:
dataset = dataset.shuffle(buffer_size=batch_size * 10)
dataset = dataset.repeat(num_epochs)
dataset = dataset.batch(batch_size)
iterator = dataset.make_one_shot_iterator()
features = iterator.get_next()
return features, parse_label_column(features.pop(LABEL_COLUMN))
Я думал начать с чего-то вроде:
training_dataset = (
tf.data.Dataset.from_tensor_slices(
(
tf.cast(df["text"].values, tf.float32),
tf.cast(df["label"].values, tf.int32)
)
)
)
Но я немного не уверен, как поступить. Я думал:
def pad_or_trunc(t):
dim = tf.size(t)
return tf.cond(tf.equal(dim, k), lambda: t, lambda: tf.cond(tf.greater(dim, k), lambda: tf.slice(t, [0], [k]), lambda: tf.concat([t, tf.zeros(k-dim, dtype=tf.int32)], 0)))
training_dataset = training_dataset.map(lambda string: tf.string_split([string]).values)
training_dataset = training_dataset.map(tf.feature_column.categorical_column_with_identity('text', vocab_size=1000))
training_dataset = training_dataset.map(pad_or_trunc)
Я чувствую, что я изобретаю колесо здесь, но документы по использованию tf.data.Dataset
API с текстом довольно редки... есть идеи по поводу лучшего подхода?