softmax是一个可以把连续的数输出成一个在0到1之间的函数。它的输出,表征了不同类别间的相对概率。用于分类任务的神经网络的最后一层的输出。
什么是softmax分类?
对于多个选项的问题,我们可以使用softmax函数,它是对数几率回归在N个可能不同的值上的推广。
神经网络的原始输出不是一个概率值,实质上只是输入的数值做了复杂的加权和与非线性处理之后的一个值而已,那么如何将这个输出变为概率分布?
这就是softmax的作用。
softmax要求每个样本必须属于某个类别,且所有可能的样本均被覆盖。
softmax各样本分量之和为1。当只有两个类别时,与对数几率回归完全相同。
softmax交叉熵
在tf.keras里,对于多分类问题我们使用categorical_crossentropy
和sparse_categorical_crossentropy
来计算softmax交叉熵。
TensorFlow中,categorical_crossentropy和sparse_categorical_crossentropy都是交叉熵损失函数,它们的数学意义相同,区别仅在于适用于不同的类别标签编码格式。
当输入数据的类别标签采用独热编码(OneHot Encoding)格式时,模型应采用 categorical_crossentropy 损失函数;当输入数据的类别标签采用序号编码(Label Encoding)格式时,模型应采用 sparse_categorical_crossentropy 损失函数。
后面会在例子中具体介绍两种方式的区别。
Fashion MNIST数据集
Fashion-MNIST是一个替代MNIST手写数字集的图像数据集。 它是由Zalando(一家德国的时尚科技公司)旗下的研究部门提供。其涵盖了来自10种类别的共7万个不同商品的正面图片。Fashion-MNIST的大小、格式和训练集/测试集划分与原始的MNIST完全一致。60000/10000的训练测试数据划分,28x28的灰度图片。你可以直接用它来测试你的机器学习和深度学习算法性能,且不需要改动任何的代码。
数据集都相对较小,用于验证某个算法能否如期正常运行,是测试和调试代码的良好起点。
Fashion-MNIST总共有十个类别的图像。每一个类别由训练数据集6000张图像和测试数据集1000张图像。所以训练集和测试集分别包含60000张和10000张。测试训练集用于评估模型的性能。
我们将使用60000张图像训练网络,并使用10000张图像评估经过学习的网络分类图像的准确率。可以从TensorFlow直接访问Fashion MNIST,只需导入和加载数据即可。
softmax多分类的代码实现
import tensorflow as tf
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 加载Fashion MNIST数据
(train_image, train_label),(test_image, test_label) = tf.keras.datasets.fashion_mnist.load_data()
# 对于图片数据,进行归一化处理
train_image = train_image/255
test_image = test_image/255
# 神经网络模型的建立
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28,28))) #输入层,把图像扁平成28*28的向量
model.add(tf.keras.layers.Dense(128, activation='relu')) # 添加隐藏层
model.add(tf.keras.layers.Dense(10, activation='softmax')) # 输出十个概率值,softmax概率分布
# 编译
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy', #输入数据的类别标签采用序号编码
metrics = ['acc']
)
# 进行训练
model.fit(train_image, train_label,epochs=5)
# 实用测试数据进行模型的评价
model.evaluate(test_image,test_label)
下面是一些训练的结果,准确率将近90%,还是比较好的结果。