tf.estimator.Estimator在每个时期与每个时期进行了三次划分时,给出了不同的测试准确性

时间:2019-05-15 12:06:06

标签: python tensorflow tensorflow-datasets tensorflow-estimator

我已经将一个简单的CNN定义为tf.estimator.Estimator的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个时间段,我的测试准确度达到了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个时间段,我可以获得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))

我只是不明白为什么这两种方法会产生不同的结果。有人可以解释吗?

2 个答案:

答案 0 :(得分:0)

您的模型的权重是否随机初始化?可能是这种情况。

答案 1 :(得分:0)

由于在第一个示例中多次调用input_fn,似乎您将通过dataset_augment(x)生成更多增强数据,因为您要为每个{{1 }}每个时代。

在第二个示例中,您只进行一次抛硬币,然后在同一数据上训练多个纪元。因此,这里的火车实际上是“更小”的。

在第一个示例中,x并没有真正拯救您。