当前位置: 首页 > 面试题库 >

TensorFlow:不可重复的结果

姜俊逸
2023-03-14
问题内容

我有一个使用TensorFlow创建多层感知器网络(带有辍学)的Python脚本,以进行二进制分类。即使我很小心地设置了Python和TensorFlow种子,我仍然得到了不可重复的结果。如果我运行一次然后再次运行,则会得到不同的结果。我什至可以运行一次,退出Python,重新启动Python,再次运行并获得不同的结果。

我尝试过的

我知道有人发布了有关在TensorFlow中获得不可重复的结果的问题,以及答案通常证明是对的不正确使用/理解tf.set_random_seed()。我已经确保实施给出的解决方案,但这并没有解决我的问题。

一个普遍的错误是没有意识到这tf.set_random_seed()仅仅是一个图形级的种子,并且多次运行脚本会改变图形,从而说明了不可重复的结果。我使用以下语句打印出整个图形,并(通过diff)验证了该图形是相同的,即使结果不同。

print [n.name for n in tf.get_default_graph().as_graph_def().node]

我也使用过像tf.reset_default_graph()和这样的函数调用tf.get_default_graph().finalize(),以免对图形进行任何更改,即使这可能会过大。

(相关)代码

我的脚本长约360行,因此这里是相关的行(指示了已截断的代码)。ALL_CAPS中的所有项目都是在Parameters下面的代码块中定义的常量。

import numpy as np
import tensorflow as tf

from copy import deepcopy
from tqdm import tqdm  # Progress bar

# --------------------------------- Parameters ---------------------------------
(snip)

# --------------------------------- Functions ---------------------------------
(snip)

# ------------------------------ Obtain Train Data -----------------------------
(snip)

# ------------------------------ Obtain Test Data -----------------------------
(snip)

random.seed(12345)
tf.set_random_seed(12345)

(snip)

# ------------------------- Build the TensorFlow Graph -------------------------

tf.reset_default_graph()

with tf.Graph().as_default():

    x = tf.placeholder("float", shape=[None, N_INPUT])
    y_ = tf.placeholder("float", shape=[None, N_CLASSES])

    # Store layers weight & bias
    weights = {
        'h1': tf.Variable(tf.random_normal([N_INPUT, N_HIDDEN_1])),
        'h2': tf.Variable(tf.random_normal([N_HIDDEN_1, N_HIDDEN_2])),
        'h3': tf.Variable(tf.random_normal([N_HIDDEN_2, N_HIDDEN_3])),
        'out': tf.Variable(tf.random_normal([N_HIDDEN_3, N_CLASSES]))
    }

    biases = {
        'b1': tf.Variable(tf.random_normal([N_HIDDEN_1])),
        'b2': tf.Variable(tf.random_normal([N_HIDDEN_2])),
        'b3': tf.Variable(tf.random_normal([N_HIDDEN_3])),
        'out': tf.Variable(tf.random_normal([N_CLASSES]))
    }

# Construct model
    pred = multilayer_perceptron(x, weights, biases, USE_DROP_LAYERS, DROP_KEEP_PROB)

    mean1 = tf.reduce_mean(weights['h1'])
    mean2 = tf.reduce_mean(weights['h2'])
    mean3 = tf.reduce_mean(weights['h3'])

    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y_))

    regularizers = (tf.nn.l2_loss(weights['h1']) + tf.nn.l2_loss(biases['b1']) +
                    tf.nn.l2_loss(weights['h2']) + tf.nn.l2_loss(biases['b2']) +
                    tf.nn.l2_loss(weights['h3']) + tf.nn.l2_loss(biases['b3']))

    cost += COEFF_REGULAR * regularizers

    optimizer = tf.train.GradientDescentOptimizer(LEARNING_RATE).minimize(cost)

    out_labels = tf.nn.softmax(pred)

    sess = tf.InteractiveSession()
    sess.run(tf.initialize_all_variables())

    tf.get_default_graph().finalize()  # Lock the graph as read-only

    #Print the default graph in text form    
    print [n.name for n in tf.get_default_graph().as_graph_def().node]

    # --------------------------------- Training ----------------------------------

    print "Start Training"
    pbar = tqdm(total = TRAINING_EPOCHS)
    for epoch in range(TRAINING_EPOCHS):
        avg_cost = 0.0
        batch_iter = 0

        train_outfile.write(str(epoch))

        while batch_iter < BATCH_SIZE:
            train_features = []
            train_labels = []
            batch_segments = random.sample(train_segments, 20)
            for segment in batch_segments:
                train_features.append(segment[0])
                train_labels.append(segment[1])
            sess.run(optimizer, feed_dict={x: train_features, y_: train_labels})
            line_out = "," + str(batch_iter) + "\n"
            train_outfile.write(line_out)
            line_out = ",," + str(sess.run(mean1, feed_dict={x: train_features, y_: train_labels}))
            line_out += "," + str(sess.run(mean2, feed_dict={x: train_features, y_: train_labels}))
            line_out += "," + str(sess.run(mean3, feed_dict={x: train_features, y_: train_labels})) + "\n"
            train_outfile.write(line_out)
            avg_cost += sess.run(cost, feed_dict={x: train_features, y_: train_labels})/BATCH_SIZE
            batch_iter += 1

        line_out = ",,,,," + str(avg_cost) + "\n"
        train_outfile.write(line_out)
        pbar.update(1)  # Increment the progress bar by one

    train_outfile.close()
    print "Completed training"


# ------------------------------ Testing & Output ------------------------------

keep_prob = 1.0  # Do not use dropout when testing

print "now reducing mean"
print(sess.run(mean1, feed_dict={x: test_features, y_: test_labels}))

print "TRUE LABELS"
print(test_labels)
print "PREDICTED LABELS"
pred_labels = sess.run(out_labels, feed_dict={x: test_features})
print(pred_labels)

output_accuracy_results(pred_labels, test_labels)

sess.close()

什么是不可重复的

如您所见,我将在每个时期将结果输出到文件,并在最后打印出准确度数字。尽管我相信我已经正确设置了种子,但所有这些都不匹配。我用两个random.seed(12345)tf.set_random_seed(12345)

如果需要提供更多信息,请告诉我。在此先感谢您的帮助。

-DG

设置细节

TensorFlow版本0.8.0(仅CPU)
Enthought Canopy版本1.7.2(Python 2.7,不是3. +)
Mac OS X版本10.11.3


问题答案:

除了图形级种子外,还需要设置操作级种子,即

tf.reset_default_graph()
a = tf.constant([1, 1, 1, 1, 1], dtype=tf.float32)
graph_level_seed = 1
operation_level_seed = 1
tf.set_random_seed(graph_level_seed)
b = tf.nn.dropout(a, 0.5, seed=operation_level_seed)


 类似资料:
  • 我正在 当我通过isundermaintanace时,真的最后没有执行。 我错过了什么?还有别的方法吗?

  • 我目前正在使用AWS SageMaker Python SDK来训练EfficientNet模型(https://github.com/qubvel/efficientnet)我的数据。具体来说,我使用张量流估计器如下。此代码位于SageMaker笔记本实例中 火车的代码。py包含通常的训练过程,从S3中获取图像和标签,将它们转换为正确的数组形状以进行EfficientNet输入,并拆分为训练集、

  • 本文向大家介绍浅谈PyTorch的可重复性问题(如何使实验结果可复现),包括了浅谈PyTorch的可重复性问题(如何使实验结果可复现)的使用技巧和注意事项,需要的朋友参考一下 由于在模型训练的过程中存在大量的随机操作,使得对于同一份代码,重复运行后得到的结果不一致。因此,为了得到可重复的实验结果,我们需要对随机数生成器设置一个固定的种子。 许多博客都有介绍如何解决这个问题,但是很多都不够全面,往往

  • 将浮点数转换为十进制数。例如,如果输入为12.345,则输出应为12345 ...所以这是我的解决方案: 我认为这个算法理论上是正确的,但实际上有些值对我不起作用!! 问题出在哪里,解决方案是什么,使我的程序正确工作?

  • 钱箱类: 商户类: 输入数据: 我的任务 计算每个商家的总金额并返回商家列表 我正在尝试使用Stream API解决这个任务。并编写了以下代码: 结果 但显然,流返回四个对象,而不是所需的两个对象。我意识到,地图(第二行)为每个cashBoxId创建了四个对象。而且我不知道如何通过进行过滤,也不知道如何获得没有重复的结果。