2017-03-16 86 views
0

我做了一个非常简单的xor预测DNN。它如下。为什么在不更改代码时,tesorflow会改变预测?

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%以上)预测值将是正确的吗?

回答

0

您正在使用Tensorflow的高级方法,因此我期望在一定程度上完成一些工作。其中之一通常是用随机值初始化权重。

因此,每一个新的培训将产生一个不同的起点,从而实现不同的学习成果。通常使用确认 - 和测试 - 集合来监控该过程。

您所使用的优化器(随机梯度下降),通常只能找到一个当地最低(除非你的问题达到了一定的性能[])。因此,优化开始的初始化至关重要。

但是 - 一个训练好的神经网络 - 不管它的设计或训练的好坏如何 - 只要没有进一步训练或以其他方式改变,对于相同的输入应该产生相同的结果。

0

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

+0

adagrad呢? – Garmekain

+0

因此,当你知道答案足够好时,解决方案可能是在某个点输出权重? – Garmekain

+1

你也会遇到与adagram和其他优化器类似的问题。你可以在这里阅读关于不同优化器的行为http://sebastianruder.com/optimizing-gradient-descent/ –

相关问题