tensorflow和tensorboard在训练中使用交叉验证的黑暗之谜。奇怪的图表出现
The dark mystery of tensorflow and tensorboard using cross-validation in training. Weird graphs showing up
这是我第一次使用 tensorboard,因为我的图表出现了一个奇怪的错误。
这是我打开 'STEP' window 得到的结果。
但是,这就是我打开 'RELATIVE' 时得到的结果。 (打开 'WALL' window 时类似)。
除此之外,为了测试模型的性能,我每隔几步应用一次交叉验证。一段时间后,这种交叉验证的准确性从 ~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
现在我怀疑我的错误是在图的损失函数的定义中,但我不确定。知道问题可能是什么吗?或者模型是否正确收敛并且所有这些错误都是预期的?
我怀疑你得到了如此奇怪的输出(我自己也见过类似的),因为你 运行 同一个模型不止一次,它把 Tensorboard 输出保存在完全相同的地方。我在您的代码中看不到您如何命名放置输出的文件?尽量使这部分代码中的文件路径唯一:
`summary_writer = tf.summary.FileWriter(unique_path_to_log, sess.graph)`
您还可以尝试定位现有输出的目录,并尝试删除具有较旧(或较新?)时间戳的文件,这样 Tensorboard 就不会混淆要删除哪个文件使用。
是的,我认为您在 cross-validation 实施中不止一次运行相同的模型。
只需在每个循环结束时尝试
session.close()
这是我第一次使用 tensorboard,因为我的图表出现了一个奇怪的错误。
这是我打开 'STEP' window 得到的结果。
但是,这就是我打开 'RELATIVE' 时得到的结果。 (打开 'WALL' window 时类似)。
除此之外,为了测试模型的性能,我每隔几步应用一次交叉验证。一段时间后,这种交叉验证的准确性从 ~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
现在我怀疑我的错误是在图的损失函数的定义中,但我不确定。知道问题可能是什么吗?或者模型是否正确收敛并且所有这些错误都是预期的?
我怀疑你得到了如此奇怪的输出(我自己也见过类似的),因为你 运行 同一个模型不止一次,它把 Tensorboard 输出保存在完全相同的地方。我在您的代码中看不到您如何命名放置输出的文件?尽量使这部分代码中的文件路径唯一:
`summary_writer = tf.summary.FileWriter(unique_path_to_log, sess.graph)`
您还可以尝试定位现有输出的目录,并尝试删除具有较旧(或较新?)时间戳的文件,这样 Tensorboard 就不会混淆要删除哪个文件使用。
是的,我认为您在 cross-validation 实施中不止一次运行相同的模型。 只需在每个循环结束时尝试
session.close()