我正在通过训练Tensorflow模型进行工作,并且正在使用tf.data.Dataset
API。我正在完成本教程:
简而言之,我有一个熊猫DataFrame df
,其中一个列名为text
,一个列名为label
。我想创建一个input_fn
返回一个(特征,索引)元组,其中特征是张量的字典,索引是标签索引的单个张量。
我要做的就是在空白处分割字符串,将单词转换为整数(每个单词获取一个唯一的整数),并填充到长度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与文本一起使用的文档非常稀少...有更好的方法的任何想法吗?