TensorFlow中10节点softmax输出层如何与整数标签匹配?
你贴的相关代码如下:
ffnn = Sequential([ Flatten(input_shape=X_train.shape[1:]), Dense(512, activation='relu'), Dropout(0.2), Dense(512, activation='relu'), Dropout(0.2), Dense(10, activation='softmax') ])
ffnn_history = ffnn.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.2, callbacks=[checkpointer, early_stopping], verbose=1, shuffle=True)
ffnn_accuracy = ffnn.evaluate(X_test, y_test, verbose=0)[1]
核心逻辑说明
你观察到的自动匹配是TensorFlow损失函数和评估指标内部实现的自动处理,分两个阶段解释:
1. 训练阶段的匹配规则
你给出的代码省略了模型compile步骤,该步骤必然使用了SparseCategoricalCrossentropy作为损失函数:
- 这个损失原生支持整数类型的类别标签,不需要你提前把标签转成10维的one-hot编码
- 它内部会自动将整数标签(比如标签值为5)映射到10维输出向量的索引5位置,直接用该位置的概率值计算交叉熵损失,全程不需要你手动转换输出向量的格式
2. 评估阶段的准确率计算规则
你调用evaluate拿到的准确率指标,默认对应SparseCategoricalAccuracy评估指标:
- 该指标内部会自动对10维输出向量执行
argmax操作,取概率最大的维度对应的索引作为预测的整数类别 - 自动将得到的预测整数和输入的整数标签做对比,统计一致的样本占比得到准确率,转换和对比过程都不需要你手动实现
手动预测的额外说明
只有当你自己调用predict方法获取原始输出的时候,才需要手动做转换:
import numpy as np # 拿到的preds是[样本数, 10]的概率矩阵 preds = ffnn.predict(X_test) # 手动转换为整数预测结果 pred_labels = np.argmax(preds, axis=1)
内容的提问来源于stack exchange,提问作者user900476
相关产品推荐
相关产品推荐

