- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对此问题更准确的描述是,当 is_training 未显式设置为 true 时,MobileNet 表现不佳。我指的是 TensorFlow 在其模型存储库 https://github.com/tensorflow/models/blob/master/slim/nets/mobilenet_v1.py 中提供的 MobileNet .
这就是我创建网络的方式(phase_train=True):
with slim.arg_scope(mobilenet_v1.mobilenet_v1_arg_scope(is_training=phase_train)):
features, endpoints = mobilenet_v1.mobilenet_v1(
inputs=images_placeholder, features_layer_size=features_layer_size, dropout_keep_prob=dropout_keep_prob,
is_training=phase_train)
我正在训练一个识别网络,并在训练时在 LFW 上进行测试。我在训练过程中得到的结果随着时间的推移而不断改进,并获得了很好的准确性。
在部署之前,我卡住了图表。如果我使用 is_training=True 卡住图表,那么我在 LFW 上得到的结果与训练期间相同。但是如果我设置 is_training=False 我会得到像网络根本没有训练过的结果...
这种行为实际上发生在 Inception 等其他网络中。
我倾向于认为我错过了一些非常基本的东西,并且这不是 TensorFlow 中的错误......
如有任何帮助,我们将不胜感激。
添加更多代码...
这就是我准备培训的方式:
images_placeholder = tf.placeholder(tf.float32, shape=(None, image_size, image_size, 1), name='input')
labels_placeholder = tf.placeholder(tf.int32, shape=(None))
dropout_placeholder = tf.placeholder_with_default(1.0, shape=(), name='dropout_keep_prob')
phase_train_placeholder = tf.Variable(True, name='phase_train')
global_step = tf.Variable(0, name='global_step', trainable=False)
# build graph
with slim.arg_scope(mobilenet_v1.mobilenet_v1_arg_scope(is_training=phase_train_placeholder)):
features, endpoints = mobilenet_v1.mobilenet_v1(
inputs=images_placeholder, features_layer_size=512, dropout_keep_prob=1.0,
is_training=phase_train_placeholder)
# loss
logits = slim.fully_connected(inputs=features, num_outputs=train_data.get_class_count(), activation_fn=None,
weights_initializer=tf.truncated_normal_initializer(stddev=0.1),
weights_regularizer=slim.l2_regularizer(scale=0.00005),
scope='Logits', reuse=False)
tf.losses.sparse_softmax_cross_entropy(labels=labels_placeholder, logits=logits,
reduction=tf.losses.Reduction.MEAN)
loss = tf.losses.get_total_loss()
# normalize output for inference
embeddings = tf.nn.l2_normalize(features, 1, 1e-10, name='embeddings')
# optimizer
optimizer = tf.train.AdamOptimizer()
train_op = optimizer.minimize(loss, global_step=global_step)
这是我的火车步骤:
batch_data, batch_labels = train_data.next_batch()
feed_dict = {
images_placeholder: batch_data,
labels_placeholder: batch_labels,
dropout_placeholder: dropout_keep_prob
}
_, loss_value = sess.run([train_op, loss], feed_dict=feed_dict)
我可以添加如何卡住图表的代码,但这并不是真正必要的。使用 is_train=false 构建图表、加载最新检查点并在 LWF 上运行评估以重现问题就足够了。
更新...
我发现问题出在批量归一化层。将这一层设置为 is_training=false 就足以重现问题。
我找到这个后发现的引用文献:
http://ruishu.io/2016/12/27/batchnorm/
https://github.com/tensorflow/tensorflow/issues/10118
Batch Normalization - Tensorflow
一旦我有了经过测试的解决方案,就会更新解决方案。
最佳答案
所以我找到了解决方案。主要使用这个引用:http://ruishu.io/2016/12/27/batchnorm/
来自链接:
Note: When is_training is True the moving_mean and moving_variance need to be updated, by default the update_ops are placed in tf.GraphKeys.UPDATE_OPS so they need to be added as a dependency to the train_op, example:
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) if update_ops: updates = tf.group(*update_ops) total_loss = control_flow_ops.with_dependencies([updates], total_loss)
言归正传,而不是像这样创建优化器:
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
train_op = optimizer.minimize(total_loss, global_step=global_step)
这样做:
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
train_op = optimizer.minimize(total_loss, global_step=global_step)
这样就可以解决问题了。
关于tensorflow - 当 is_training 设置为 false 时,MobileNet 不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45855443/
我有一个 is_training 变量,我仍然需要在我的 main.py 文件中定义它,如下所示: is_training = tf.placeholder(tf.bool, name='is_tra
我正在训练以下模型: with slim.arg_scope(inception_arg_scope(is_training=True)): logits_v, endpoints_v = i
对此问题更准确的描述是,当 is_training 未显式设置为 true 时,MobileNet 表现不佳。我指的是 TensorFlow 在其模型存储库 https://github.com/te
我尝试使用 TensorFlow-Slim 中的批标准化层,如下所示: net = ... net = slim.batch_norm(net, scale = True, is_training =
我想在训练后将模型的 is_training 状态变为 False,我该怎么做? net = tf.layers.conv2d(inputs = features, filters = 64, ker
我想在训练集( is_training=True )和验证集( is_training=False )上运行给定的模型,特别是如何 dropout被申请;被应用。现在 prebuilt models公
我是一名优秀的程序员,十分优秀!