Tensorflow中,什么是Logits,它和我们常用的Feature有什么不同?

Tensorflow中,什么是Logits,它和我们常用的Feature有什么不同?

在tensorflow中经常会用到三个函数
tf.nn.softmax_cross_entropy_with_logits(label = one_hot_label, logits = logits)
tf.nn.softmax_cross_entropy(label = one_hot_label, logits = logits)
tf.nn.softmax(logits = logits)

其中softmax是在一个n分类问题中,输入一个n维的logits向量,输出一个n维概率向量,其物理意义是logits代表的物体属于各类的概率。即softmax的输出是一个n维的one_hot_prediction。
softmax_cross_entropy_with_logits输出的是一个batch_size维的向量,这个向量的每一维表示每一个sample的one_hot_label和one_hot_prediction 之间的交叉熵。
softmax_cross_entropy的输出是前述batch_size维的向量的均值。

它的示例代码和公式下面这篇博客讲得很好,本文不再赘述

三个函数都有一个奇怪的输入Logits。
今天我来讲讲什么是Logits。它和Feature的区别在何处?
以1000分类为例,Logits就是最后一层输出后,进入到Softmax函数之前得到的1000维向量。
我们以AlexNet为例进行解释,FC8层的输出就是Logits(1000维)。而常用的Feature确是4096维从FC6/FC7中提取。
为什么不用1000D的Logits作为Feature?一个直观理解是——这个Logits实在太“高级”太“抽象”。Logits由于离softmax太近,它的特性高度适应1000分类任务而无法用于其他任务,失去了对普遍性的视觉特性的描述,因而不能用于其他任务。

更理性的分析可以从Softmax的输入/输出关系看出,Softmax仅仅是对Logits做了一个归一化。也就是下面这个公式
Softmax函数
不难看出,输入softmax的Logits中最大的一维会成为输出中同样最大的一维。例如:

4分类问题的
Logits = [1, 5, 1, 0.2]
输入softmax后
得到的 one_hot_pred = [0.017 0.958 0.017 0.008]

同样是其中某一维比较大,我们可以认为Logits和one_hot_pred包含的信息没有区别。也就是说Logits中只包含了label的信息,而把图像中的其他有用信息抛弃掉了。
这就是为什么我们常用Logits的前一层输出做Feature,而非Logits本身。

最后,为了方便大家理解,将代码留给大家。至于softmax_cross_entropy_with_logits_v2softmax_cross_entropy_with_logits的区别。我们下次再说。

import tensorflow as tf
import numpy as np

sess = tf.Session()
sess.run(tf.global_variables_initializer())

# 把label 变成one-hot 
def one_hot(y, n_cls=40):
    one_hot_list = []
    for item in y:
        item_one_hot = np.zeros((1, n_cls))
        item_one_hot[0, item] = 1
        one_hot_list.append(item_one_hot)

    return np.vstack(one_hot_list)


# 准备数据
y = [1, 2]
y_one_hot = one_hot(y, 4)
# array([[0., 1., 0., 0.],
#    [0., 0., 1., 0.]])

logits = [[10, 1, 0.1, 2],
          [1, 5, 1, 0.2]]
logits = np.asarray(logits)

# 构建计算图
op1 = tf.nn.softmax_cross_entropy_with_logits_v2(labels=y_one_hot, logits=logits)
op2 = tf.nn.softmax_cross_entropy_with_logits(labels=y_one_hot, logits=logits)
op3 = tf.losses.softmax_cross_entropy(onehot_labels=y_one_hot, logits=logits)
# 将logits归一化
op4 = tf.nn.softmax(logits)

# 求值
value1 = sess.run(op1)
value2 = sess.run(op2)
value3 = sess.run(op3)
value4 = sess.run(op4)

  • 13
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值