Tensorflow:使用tf.data.Dataset API

时间:2018-10-23 04:13:56

标签: python tensorflow tensorflow-datasets

我正在通过训练Tensorflow模型进行工作,并且正在使用tf.data.Dataset API。我正在完成本教程:

https://nbviewer.jupyter.org/github/amygdala/code-snippets/blob/master/ml/census_train_and_eval/using_tf.estimator.train_and_evaluate.ipynb#Define-input-functions-(using-Datasets)

简而言之,我有一个熊猫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与文本一起使用的文档非常稀少...有更好的方法的任何想法吗?

0 个答案:

没有答案