训练的神经网络使用相同的数据产生不同的预测(TensorFlow)

时间:2018-06-05 18:25:34

标签: python tensorflow machine-learning neural-network

我已经使用TensorFlow训练了一个神经网络。训练结束后,我将其保存并再次装入新的'。 py'文件,以避免在事故中重新训练。当我用一些额外的数据测试它时,我发现它预测了相同数据的不同内容。它理论上是否应该为相同的数据计算相同的东西?

一些信息 前馈网
4个隐藏层,每层有900个神经元 5000个训练时期
达到~80%的准确度 使用sklearn中的normalize对数据进行归一化。预处理
成本函数:tensorflow.nn.softmax_cross_entropy_with_logits
优化器:tf.train.AdamOptimizer
我将数据作为矩阵提供给我的网络,就像我用于培训一样。 (每行包含一个数据样本,具有与输入神经元一样多的列)

在具有相同数据的十个预测周期中,我的网络在至少2个周期内产生不同的结果(到目前为止最多观察到4个周期) 怎么会这样。理论上,所发生的一切都是W_i * x_i + b_i形式的数据处理计算。由于我的x_i,W_i和b_i不再改变,预测会如何变化?模型重装例程可能有错吗?

{{1}}

2 个答案:

答案 0 :(得分:0)

所以我一直在做一些测试,并发现以下关于这个问题。 因为我一直在尝试重用我创建的模型,所以我必须使用tf.global_variables_initializer()。通过这样做,它覆盖了我导入的图形,所有值都是随机的,这解释了不同的网络输出。这仍然让我有一个问题要解决:我如何加载我的网络?我目前使用的解决方法目前还不是最优的,但它至少允许我使用我保存的模型。 Tensor flow允许为所使用的函数和张量赋予唯一的名称。通过这样做,我可以通过图表访问它们:

with tf.Session() as sess:
    saver = tf.train.import_meta_graph('path to .meta')  
    saver.restore(sess, tf.train.latest_checkpoint('path to checkpoints'))
    graph = tf.get_default_graph()
    graph.get_tensor_by_name('name:0')

使用这种方法我可以访问我保存的所有值,但它们是分开的!这意味着我每次操作都有1倍的重量和1倍的偏差,这导致了一堆新变量。如果您不知道名称,请使用以下命令:

print(graph.get_all_collection_keys())

这将打印集合名称(我们的变量存储在集合中)

print(graph.get_collection('name'))

这允许我们访问集合,看看变量的名称/键是什么。

这导致了另一个问题。我不能再使用我的模型作为全局变量初始化程序已覆盖所有内容。因此,我必须手动重新定义整个模型的重量和偏差,这是我以前得到的。

不幸的是,这是我唯一能想到的。如果有人有更好的想法,请告诉我。

整个错误的事情看起来像这样:

imports...
placeholders for data...

def my_network(data):
    ## network definition with tf functions ##
return output

def train_my_net():
    prediction = my_network(data)
    cost function
    optimizer
    with tf.Session() as sess:
        for i in how many epochs i want:
            training routine
            save

def use_my_net():
    prediction = my_network(data)
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        saver = tf.train.import_meta_graph('path to .meta')  
        saver.restore(sess, tf.train.latest_checkpoint('path to checkpoints'))
        print(sess.run(prediction.eval(feed_dict={placeholder:data})))
graph = tf.get_default_graph()

答案 1 :(得分:0)

所以这对我来说是一个非常愚蠢的错误。现在它可以从保存中加载模型。问题是由全局变量初始化器引起的。如果你把它放在外面,它会正常工作。以前找到的信息可能对某人有用,所以我会留在这里。解决方案现在是:

saver = tf.train.Saver()
with tf.Session() as sess:
    saver.restore(sess, 'path to your saved file C:x/y/z/model/model.ckpt')

在此之后你可以继续。我真的不知道为什么变量初始化程序会阻止它工作。正如我所看到的,它应该是这样的:初始化所有变量以存在并使用随机值,然后到达保存的文件并使用那里的值,但显然还有其他事情发生......