Keras Estimator + tf.data API

Posted

技术标签:

【中文标题】Keras Estimator + tf.data API【英文标题】: 【发布时间】:2019-05-03 03:48:53 【问题描述】:

TF 1.12:

尝试使用 tf.keras.layers 将 Pre-canned estimator 转换为 Keras:

estimator = tf.estimator.DNNClassifier(
        model_dir='/tmp/keras',
        feature_columns=deep_columns,
        hidden_units = [100, 75, 50, 25],
        config=run_config)

使用 tf.keras.layers 到 Keras 模型:

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(100, activation=tf.nn.relu, input_shape=(14,)))
model.add(tf.keras.layers.Dense(75))
model.add(tf.keras.layers.Dense(50))
model.add(tf.keras.layers.Dense(25))
model.add(tf.keras.layers.Dense(1, activation=tf.nn.sigmoid))
model.compile(optimizer=tf.keras.optimizers.RMSprop(), loss=tf.keras.losses.binary_crossentropy, metrics=['accuracy'])
model.summary()
estimator = tf.keras.estimator.model_to_estimator(model, model_dir='/tmp/keras', config=run_config)

当我运行 Keras 模型时,我得到:

for n in range(40 // 2):
    estimator.train(input_fn=train_input_fn)
    results = estimator.evaluate(input_fn=eval_input_fn)

    # Display evaluation metrics
    tf.logging.info('Results at epoch %d / %d', (n + 1) * 2, 40)
    tf.logging.info('-' * 60)

当我训练它时,我得到了这个错误:

主代码:https://github.com/tensorflow/models/blob/master/official/wide_deep/census_main.py

KeyError: "传入特征的字典没有 keras 模型中定义的预期输入键。\n\t预期键: 'dense_50_input'\n\t 特征键:'workclass', 'occupation', 'hours_per_week'、'marital_status'、'关系'、'种族'、'fnlwgt'、 “教育”、“性别”、“资本损失”、“资本增益”、“年龄”、 'education_num', 'native_country'\n\t差异:'workclass', “职业”、“每星期小时数”、“婚姻状况”、“关系”、 “dense_50_input”、“种族”、“fnlwgt”、“教育”、“性别”、 'capital_loss', 'capital_gain', '年龄', 'education_num', 'native_country'"

这是我的 input_fn:

def input_fn(data_file, num_epochs, shuffle, batch_size):
  """Generate an input function for the Estimator."""
  assert tf.gfile.Exists(data_file), (
      '%s not found. Please make sure you have run census_dataset.py and '
      'set the --data_dir argument to the correct path.' % data_file)

  def parse_csv(value):
    tf.logging.info('Parsing '.format(data_file))
    columns = tf.decode_csv(value, record_defaults=_CSV_COLUMN_DEFAULTS)
    features = dict(zip(_CSV_COLUMNS, columns))
    labels = features.pop('income_bracket')
    classes = tf.equal(labels, '>50K')  # binary classification
    return features, classes

  # Extract lines from input files using the Dataset API.
  dataset = tf.data.TextLineDataset(data_file)

  if shuffle:
    dataset = dataset.shuffle(buffer_size=_NUM_EXAMPLES['train'])

  dataset = dataset.map(parse_csv, num_parallel_calls=5)

  # We call repeat after shuffling, rather than before, to prevent separate
  # epochs from blending together.
  dataset = dataset.repeat(num_epochs)
  dataset = dataset.batch(batch_size)
  return dataset

def train_input_fn():
    return input_fn(train_file, 2, True, 40)

def eval_input_fn():
    return input_fn(test_file, 1, False, 40)

【问题讨论】:

您是否在代码中的某处使用了model.fit(train_x, train_y) 不,我是直接用estimator.train,这不就是model_to_estimator函数的目的吗? 你有 input_shape=(10,),但是你传递了 14 个特征并且模型期望相同,为什么? 感谢回复,已更正,立即更新错误。在罐装估算器中,我传递了我感兴趣的特征:feature_columns=deep_columns,只是不确定如何告诉 Keras 传递相同的特征? @MaxPower 是正确的,他们将 tf.data 支持添加到 Keras 并最终使用该 API。 【参考方案1】:

你需要添加一个输入层:

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.InputLayer(input_shape=your_tensor_shape, name=your_feature_key))
model.add(tf.keras.layers.Dense(100, activation=tf.nn.relu))

【讨论】:

以上是关于Keras Estimator + tf.data API的主要内容,如果未能解决你的问题,请参考以下文章

有没有一种简单的方法可以在 tensorflow 中使用 tf.data.Dataset.from_generator 和自定义 model_fn(Estimator) 中的功能

tf.keras 模型 多个输入 tf.data.Dataset

使用 tf.keras.estimator.model_to_estimator 将 keras 模型转换为估计器模型后使用 estimator.train() 的问题

如何在 keras 自定义回调中访问 tf.data.Dataset?

如何通过 tf.data API 使用 Keras 生成器

Keras 扩充不适用于 tf.data.Dataset 映射