为什么tesorflow在不更改代码时会更改预测?

时间:2017-03-16 22:25:54

标签: tensorflow

我做了一个非常简单的xor预测DNN。它如下。

p = tf.contrib.layers.sparse_column_with_keys(column_name="p", keys=["0","1"])
q = tf.contrib.layers.sparse_column_with_keys(column_name="q", keys=["0","1"])
p_emb = tf.contrib.layers.embedding_column(sparse_id_column=p, dimension=1)
q_emb = tf.contrib.layers.embedding_column(sparse_id_column=q, dimension=1)

input_fn = tf.contrib.learn.io.numpy_input_fn({
        "p": np.array(["0","0","1","1"]),
        "q": np.array(["0","1","0","1"])},
    np.array([0,1,1,0]),
    batch_size=4,
    num_epochs=1000)

estimator = tf.contrib.learn.DNNClassifier(
    feature_columns=[p_emb, q_emb],
    hidden_units=[3],
    optimizer=tf.train.GradientDescentOptimizer(
        learning_rate=0.05
    ))

estimator.fit(input_fn=input_fn, steps=5000)

print(list(estimator.predict({
        "p": np.array(["0","0","1","1"]),
        "q": np.array(["0","1","0","1"])})))

有时(超过平均值)它正确地预测[0,1,1,0],但有时候它会非常错误地预测。

这可能是因为它首先做出的选择,在做出它之后,权重在一个训练方向上进行,这不是正确的,但我怎么能几乎肯定(95%以上)预测值将是正确的吗?

2 个答案:

答案 0 :(得分:0)

GradientDescentOptimizer的结果取决于许多因素,例如初始体重,每批中的训练样例等。因此,在不同的运行中,权重可以被不同地初始化,并且其他因素也可以是不同的,这可能导致不同的分类。您无法确定具体百分比(95%以上)。您可以做一些事情(例如,增加训练样本的数量,如果可以的话),这可以提高您的分类准确性,但没有什么可以保证您在数学上可以获得95%或更高的准确度。

答案 1 :(得分:0)

你正在使用Tensorflow的高级方法,所以我希望在引擎盖下完成一些工作。其中之一通常是使用一些随机值初始化权重。

因此,每次新的训练都会产生不同的起点,从而实现不同的学习成果。通常使用验证 - 和 test - 集来监控此过程。

您正在使用的优化器(随机梯度下降)通常只能找到局部最小值(除了您的问题满足某些属性[凸性])。因此,优化的初始化至关重要。

然而,训练有素的NN - 无论其设计或训练有多好或多坏 - 只要没有进一步训练或以任何其他方式改变,就应该对同一输入产生相同的结果。