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)

在使用TensorFlow对鸢尾花数据进行分类预测时,你需要完成以下几个步骤: 1. **数据准备**:首先,你需要导入鸢尾花数据集,这通常可以从sklearn库的load_iris函数获取。数据集包括特征(花瓣长度、宽度等)标签(鸢尾花种类)。 ```python from sklearn.datasets import load_iris import pandas as pd data = load_iris() df = pd.DataFrame(data.data, columns=data.feature_names) labels = data.target ``` 2. **数据预处理**:将类别标签转换成数值形式,并分割数据集(训练集测试集)。 ```python from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(df, labels, test_size=0.2, random_state=42) ``` 3. **模型构建**:选择一个适合做分类任务的深度学习模型,如Dense网络、决策树或随机森林,甚至简单的线性模型(如果你只是想了解基本流程)。然后,在TensorFlow中创建一个Keras序列式模型。 ```python import tensorflow as tf model = tf.keras.models.Sequential([ tf.keras.layers.Dense(64, activation='relu', input_shape=(4,)), # 输入层 tf.keras.layers.Dense(32, activation='relu'), # 隐藏层 tf.keras.layers.Dense(3, activation='softmax') # 输出层(假设鸢尾有三种) ]) ``` 4. **编译模型**:设置损失函数(例如sparse_categorical_crossentropy)、优化器(如Adam)以及评估指标(accuracy)。 ```python model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), optimizer=tf.keras.optimizers.Adam(), metrics=['accuracy']) ``` 5. **训练模型**:使用训练数据拟合模型,并监控验证集的表现。 ```python history = model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=50, batch_size=32) ``` 6. **评估预测**:最后,使用测试集评估模型性能,并进行新样本的分类预测。 ```python test_loss, test_acc = model.evaluate(X_test, y_test) print(f"Test accuracy: {test_acc * 100}%") # 对新的鸢尾花数据进行预测 new_data = ... # 新的数据点 prediction = model.predict(new_data) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值