Tensorflow估算器:不同的纪元数给出相同的结果

时间:2018-10-09 08:04:54

标签: python tensorflow tensorflow-estimator

我想使用TF Estimator创建一个简单的模型。下面是我的代码:

num_epoch = 4
num_train = 186
num_test = 81

# 1 Define input function
def input_function(x, y, is_train):

    dict_x = {
        "featurename" : x,
    }

    dataset = tf.data.Dataset.from_tensor_slices((
        dict_x, y
    ))

    if is_train:
        dataset = dataset.shuffle(num_train, seed=113).repeat(num_epoch).batch(num_train)
    else:   
        dataset = dataset.batch(num_test)
    return dataset

def my_serving_input_fn2():
    input_data = {
        "featurename" : tf.placeholder(tf.float32, [None, 15], name='inputtensors')
    }
    return tf.estimator.export.ServingInputReceiver(input_data, input_data)


def main(argv):
    tf.set_random_seed(113)
    np.random.seed(113)
    run_config = tf.estimator.RunConfig(save_summary_steps=None, save_checkpoints_secs=None, tf_random_seed=113)

    # 2 Define feature columns
    feature_columns = [
        tf.feature_column.numeric_column(key="featurename",shape=15),
    ]

    # 3 Define an estimator
    classifier = tf.estimator.DNNClassifier(
        feature_columns=feature_columns,
        hidden_units=[15, 15],
        n_classes=3,
        optimizer=tf.train.AdamOptimizer(),
        activation_fn=tf.nn.relu,
        model_dir = 'models/',
        config=run_config
    )

    # Train the model
    classifier.train(
        input_fn=lambda:input_function(X_train, y_train, True)
    )

    # Evaluate the model
    eval_result = classifier.evaluate(
        input_fn=lambda:input_function(X_test, y_test, False)
    )

    print('\nTest set accuracy: {accuracy:0.3f}\n'.format(**eval_result))

if __name__ == "__main__":
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' 
    tf.app.run(main)

我相信,由于num_epoch影响数据集的num_epoch,模型将被repeat()次训练。我没有在估算器中定义steps,因此将永远对其进行训练,直到input_fn生成tf.errors.OutOfRange

但是,如果我更改num_epoch的值,则总是得到相同的结果。例如,当我使用num_epoch=4num_epoch=400运行该程序时,测试集的准确性将是相同的。

我在这里误解了培训过程吗?还是只是巧合?我希望有人可以帮助解释为什么会发生

1 个答案:

答案 0 :(得分:0)

可能是因为您没有足够的数据。您正在做的是在相同的数据上对其进行训练,并达到“智能”的顶峰。基本上增加数据集,您将在num-epoch中看到变化。