tf.nn.softmax 与slim.sofmax 之间的不同

前言:

在使用densenet的时候,发现原网络结构最后的输出的net是[batch_size,1,1,num_class]四个维度,同时用slim.softmax输出predictions。如下:

net = slim.conv2d(net, num_classes, 1,
                        biases_initializer=tf.zeros_initializer(),
                        scope='logits')
if num_classes is not None:
  end_points['predictions'] = slim.softmax(net, scope='predictions')

可是我想用 tf.nn.sparse_softmax_cross_entropy_with_logits 计算交叉熵,于是在net之后net =  tf.squeeze(net) 对net进行压缩。可是运行的时候出现了维度不对的错误。

左思右想觉得代码逻辑方面没有错误呀,可是为什么还会报错呢?根据报错的内容,是上面这一句提示的维度不对。于是试着注释掉以下两句,就能正常出现结果了。:

if num_classes is not None: end_points['predictions'] = slim.softmax(net, scope='predictions')

仔细想了一下。应该是我前面用了squeeze,导致了出现维度报错。可是压缩成一维后用softmax应该是可以的。于是我试着取消注释,同时将slim.softmax替换成tf.nn.softmax。果然,代码一样能够运行。这说明,tf.nn.softmax与slim.softmax的用处还是有所不同的。

分析结果:

1.tf.nn.softmax需要输入的维度可以是一维,而slim.softmax需要最少两个维度;

2.slim.softmax 可以使用命名空间scope而tf.nn.sotfmax不能。

猜你喜欢

转载自blog.csdn.net/cn19491001/article/details/82559805