我正在使用Tensorflow低级API编码vgg16网络。该模型在imagenet12数据集中进行了测试。由于计算成本高,我将验证集分为80%的训练数据和20%的测试数据。
首先,最后一层fc8
在没有激活softmax
的情况下输出,我使用tf.nn.softmax_cross_entropy_with_logits_v2(labels, logits)
计算损耗。最终在训练过程中输出nan
。
然后,我尝试在softmax
下添加一个fc8
层,但是仍然使用tf.nn.softmax_cross_entropy_with_logits_v2(labels, logits)
来计算损耗。令人惊讶的是,损失通常是输出而不是nan
。
以下是添加softmax
层之前的代码:
def vgg16():
...
fc8_layer = FullConnectedLayer(y, self.weight_dict, regularizer_fc=self.regularizer_fc)
self.op_logits = fc8_layer.layer_output
def loss(self):
entropy = tf.nn.softmax_cross_entropy_with_logits_v2(labels=self.Y, logits=self.op_logits)
l2_loss = tf.losses.get_regularization_loss()
self.op_loss = tf.reduce_mean(entropy, name='loss') + l2_loss
然后我将vgg16的输出更改为:
def vgg16():
...
fc8_layer = FullConnectedLayer(y, self.weight_dict, regularizer_fc=self.regularizer_fc)
self.op_logits = tf.nn.softmax(fc8_layer.layer_output)
此外,这是我的优化程序:
def optimize(self):
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
with tf.variable_scope(tf.get_variable_scope(), reuse=tf.AUTO_REUSE):
self.opt = tf.train.MomentumOptimizer(learning_rate=self.config.learning_rate, momentum=0.9,
use_nesterov=True)
self.op_opt = self.opt.minimize(self.op_loss)
我不明白为什么要添加softmax图层。在我的想法中,两个softmax层不会影响最终损耗,因为它不会改变每个输出单元的比例。