【发布时间】:2019-10-02 13:50:16
【问题描述】:
我已经为 tf.estimator.Estimator 定义了一个简单的 CNN 作为我的 model_fn,并用这个 input_fn 提供给它:
def input_fn(features, labels, batch_size, epochs): dataset = tf.data.Dataset.from_tensor_slices((features)) dataset = dataset.map(lambda x: tf.cond(tf.random_uniform([], 0, 1) > 0.5, lambda: dataset_augment(x), lambda: x), num_parallel_calls=16).cache() dataset_labels = tf.data.Dataset.from_tensor_slices((labels)) dataset = dataset.zip((dataset, dataset_labels)) dataset = dataset.shuffle(30000) dataset = dataset.repeat(epochs) dataset = dataset.batch(batch_size) dataset = dataset.prefetch(-1) return dataset
当我以这种方式训练估计器时,我在 10 个 epoch 后获得了 43% 的测试准确率:
steps_per_epoch = data_train.shape[0] // batch_size
for epoch in range(1, epochs + 1):
cifar100_classifier.train(lambda: input_fn(data_train, labels_train, batch_size, epochs=1), steps=steps_per_epoch)
但是当我以这种方式训练它时,我在 10 个 epoch 后获得了 32% 的测试准确率:
steps_per_epoch = data_train.shape[0] // batch_size
max_steps = epochs * steps_per_epoch
cifar100_classifier.train(steps=max_steps,
input_fn=lambda: input_fn(data_train, labels_train, batch_size, epochs=epochs))
我只是不明白为什么这两种方法会产生不同的结果。谁能解释一下?
【问题讨论】:
-
如何设置
cifar100_classifier?我的猜测是它与在第一种情况下重置的超参数有关。 -
@McAngus 我正在使用 tf.keras.layers 创建我的模型并使用 AdamOptimizer 对其进行训练。我假设检查点保持优化器的状态以及层的权重和偏差。因此,一次性训练模型与在每个 epoch 结束时从保存的检查点加载并继续训练另一个 epoch 等具有相同的效果......
标签: python tensorflow tensorflow-datasets tensorflow-estimator