我已经将一个简单的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))
我只是不明白为什么这两种方法会产生不同的结果。有人可以解释吗?
答案 0 :(得分:0)
您的模型的权重是否随机初始化?可能是这种情况。
答案 1 :(得分:0)
由于在第一个示例中多次调用input_fn
,似乎您将通过dataset_augment(x)
生成更多增强数据,因为您要为每个{{1 }}每个时代。
在第二个示例中,您只进行一次抛硬币,然后在同一数据上训练多个纪元。因此,这里的火车实际上是“更小”的。
在第一个示例中,x
并没有真正拯救您。