为什么vgg16的损耗等于nan,但是在添加额外的Softmax层时却能正常工作?

时间:2019-04-18 03:01:25

标签: tensorflow softmax vgg-net

我正在使用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层不会影响最终损耗,因为它不会改变每个输出单元的比例。

0 个答案:

没有答案