Machine learning tensorflow和tensorboard在培训中使用交叉验证的黑暗奥秘。奇怪的图形出现了

Machine learning tensorflow和tensorboard在培训中使用交叉验证的黑暗奥秘。奇怪的图形出现了,machine-learning,tensorflow,deep-learning,cross-validation,tensorboard,Machine Learning,Tensorflow,Deep Learning,Cross Validation,Tensorboard,这是我第一次使用tensorboard,因为我的图形有一个奇怪的bug 这就是我打开“台阶”窗口时得到的结果。 然而,如果我打开“亲戚”,这就是我得到的。(类似于打开“墙”窗口时)。 除此之外,为了测试模型的性能,我每隔几步就应用交叉验证。经过一段时间后,这种交叉验证的准确性从约10%(随机猜测)下降到0%。我不确定我在哪里犯了错误,因为我不是tensorflow的专家,但我怀疑我的问题在于图形构建。代码如下所示: def initialize_parameters(): globa

这是我第一次使用tensorboard,因为我的图形有一个奇怪的bug

这就是我打开“台阶”窗口时得到的结果。

然而,如果我打开“亲戚”,这就是我得到的。(类似于打开“墙”窗口时)。

除此之外,为了测试模型的性能,我每隔几步就应用交叉验证。经过一段时间后,这种交叉验证的准确性从约10%(随机猜测)下降到0%。我不确定我在哪里犯了错误,因为我不是tensorflow的专家,但我怀疑我的问题在于图形构建。代码如下所示:

def initialize_parameters():
    global_step = tf.get_variable("global_step", shape=[], trainable=False, 
            initializer=tf.constant_initializer(1), dtype=tf.int64)

    Weights = {
        "W_Conv1": tf.get_variable("W_Conv1", shape=[3, 3, 1, 64],
            initializer=tf.random_normal_initializer(mean=0.00, stddev=0.01),
        ),
...
        "W_Affine3": tf.get_variable("W_Affine3", shape=[128, 10],
            initializer=tf.random_normal_initializer(mean=0.00, stddev=0.01),
    )
}
    Bias = {
        "b_Conv1": tf.get_variable("b_Conv1", shape=[1, 16, 8, 64],
            initializer=tf.random_normal_initializer(mean=0.00, stddev=0.01),
        ),
...
        "b_Affine3": tf.get_variable("b_Affine3", shape=[1, 10],
            initializer=tf.random_normal_initializer(mean=0.00, stddev=0.01),
    )
}
    return Weights, Bias, global_step


def build_model(W, b, global_step):

    keep_prob = tf.placeholder(tf.float32)
    learning_rate = tf.placeholder(tf.float32)
    is_training = tf.placeholder(tf.bool)

    ## 0.Layer: Input
    X_input = tf.placeholder(shape=[None, 16, 8], dtype=tf.float32, name="X_input")
    y_input = tf.placeholder(shape=[None, 10], dtype=tf.int8, name="y_input")

    inputs = tf.reshape(X_input, (-1, 16, 8, 1)) #must be a 4D input into the CNN layer
    inputs = tf.contrib.layers.batch_norm(
                        inputs,
                        center=False,
                        scale=False,
                        is_training=is_training
                    )

    ## 1. Layer: Conv1 (64, stride=1, 3x3)
    inputs = layer_conv(inputs, W['W_Conv1'], b['b_Conv1'], is_training)
... 

    ## 7. Layer: Affine 3 (128 units)
    logits = layer_affine(inputs, W['W_Affine3'], b['b_Affine3'], is_training)

    ## 8. Layer: Softmax, or loss otherwise
    predict = tf.nn.softmax(logits) #should be an argmax, or should this even go through


    ## Output: Loss functions and model trainers
    loss = tf.reduce_mean(
                tf.nn.softmax_cross_entropy_with_logits( 
                      labels=y_input, 
                      logits=logits
                )
           )
    trainer = tf.train.GradientDescentOptimizer(
                learning_rate=learning_rate
              ) 
    updateModel = trainer.minimize(loss, global_step=global_step)

    ## Test Accuracy
    correct_pred = tf.equal(tf.argmax(y_input, 1), tf.argmax(predict, 1))
    acc_op = tf.reduce_mean(tf.cast(correct_pred, "float"))

return X_input, y_input, loss, predict, updateModel, keep_prob, learning_rate, is_training

现在我怀疑我的错误在图的损失函数的定义中,但我不确定。知道问题出在哪里吗?或者模型是否正确收敛并且所有这些错误都是预期的?

我怀疑您得到了如此奇怪的输出(我自己也看到过类似的输出),因为您多次运行同一个模型,并且将张力板输出保存在完全相同的位置。我在代码中看不到如何命名要将输出放在其中的文件?尝试使这部分代码中的文件路径唯一:

`summary_writer = tf.summary.FileWriter(unique_path_to_log, sess.graph)`

您还可以尝试定位现有输出已放入的目录,并尝试删除具有较旧(或较新?)时间戳的文件,这样Tensorboard就不会混淆使用哪一个了。

是的,我认为您使用交叉验证实现多次运行同一模型。 只要在每个循环的末尾尝试一下

session.close()