Tensorflow 为什么tesorflow在不更改代码的情况下更改预测?

Tensorflow 为什么tesorflow在不更改代码的情况下更改预测?,tensorflow,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, dime

我做了一个非常简单的
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%以上)预测值会是正确的呢?

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

你使用的是Tensorflow的高级方法,因此我希望有相当多的工作是在幕后完成的。其中之一通常是使用一些随机值初始化权重

因此-每一次新的培训都会产生不同的起点,从而获得不同的学习结果。通常使用验证集和测试集来监控该过程

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


然而,一个经过训练的神经网络,无论其设计或训练的好坏,只要它没有进一步训练或以任何其他方式改变,对于相同的输入,应该产生非常相同的结果。

adagrad呢?因此一个解决方案可以是在某一点导出权重,当您知道答案足够好时,adagram和其他优化器也会出现类似的问题。您可以在这里阅读关于第二条评论的不同优化器的行为。保存这些权重不一定能保证很好的准确性,因为您可能有很高的训练分数,但测试分数较低。所以你需要确保你的考试成绩也很高。您还可以尝试使用交叉验证