常见的逻辑回归、SVM等常用于解决二分类问题,对于多个选项的分类问题,比如识别手写数字,它就需要10个分类,同样也可以用逻辑回归或SVM(只是需要多个二分类来组成多分类)。对于多分类的实现,我们还可以使用Softmax函数,它是逻辑回归在 N 个可能不同的值上的推广。
Softmax作用
神经网络的原始输出不是一个概率值,实质上只是输入的数值做了复杂的加权(*w+b)和与非线性处理之后的一个值而已,那么如何将这个输出变为概率分布?这就是Softmax 激活的作用(在某个隐藏层设置激活函数为 softmax)
说明:
- softmax要求每个样本必须属于某个类别,且所有可能的样本均被覆盖;
- softmax 要求每个样本必须属于某个类别,并且所有可能的样本均被覆盖;
- softmax个样本分量之和为 1
当只有两个类别时,与逻辑回归完全相同。为了方便理解Softmax的作用,举个例子来说明。如下图所示,神经网络中包含了输入层(x1---x6),然后通过两个隐藏层处理,最后通过softmax分析器就能得到不同条件下的概率,这里需要分成三个类别,最终会得到y=0、y=1、y=2的概率值。
继续看下面的图,三个输入通过softmax后得到一个数组[0.05 , 0.10 , 0.85],这就是softmax的功能。
计算过程直接看下图,其中即为,三个输入的值分别为3、1、-3,的值为20、2.7、0.05,再分别除以累加和得到最终的概率值,0.88,0.12,0。
可以看到它有多个值,所有值加起来刚好等于1,每个输出都映射到了0到1区间,可以看成是概率问题。
SoftMax代码示例
通过Fashion MNIST 数据集 训练一个Softmax分类器,实现分类功能。Fashion MNIST 数据集是经典 MNIST 数据集的简易替换,MNIST 数据集包含手写数字(0、1、2 等)的图像,这些图像的格式与本文使用的服饰图像的格式相同。Fashion MNIST 比常规 MNIST手写数据集更具挑战性。这两个数据集都相对较小,用于验证某个算法能否如期正常运行。它们都是测试和调试代码的良好起点。
Fashion MNIST 数据集包含 70000 张灰度图像,涵盖 10 个类别。我们将使用 60000 张图像训练网络,并使用 10000 张图像评估经过学习的网络分类图像的准确率。它可以直接从 TensorFlow 直接访问,只需导入和加载数据即可。
训练一个衣物鞋包的分类模型,要求把模型分为10个类别,然后预测某个物体属于某个类别的概率。
step1 添加库引用
#添加库引用
import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
step2 加载数据
# 下载数据集并划分为训练集和测试集
(train_images,train_lables),(test_images,test_labels) = tf.keras.datasets.fashion_mnist.load_data()
print('train_images.shape',train_images.shape)
print('train_labels',train_lables)
print('train_labels.shape',train_lables.shape)
print('test_images.shape',test_images.shape)
print('test_labels.shape',test_labels.shape)
print('test_labels',test_labels)
###########################################
step3 查看数据
plt.imshow(train_images[0]) # 通过切片取出测试集第一张图片查看
plt.show() #如下图所示
np.max(train_images[0]) #查看最大值得出取值范围0-255
print(train_lables[0]) # 查看对应的分类 9代表鞋子
step4 归一化
# 数组中的每个元素都除以255,归一化到0-1
train_image=train_images/255
test_image=test_images/255
step5 建立模型
#全连接模型
model = tf.keras.Sequential()
# 28*28 dense 是 张量为1的数据 映射到另一个张量为1 的数据,不能将2维数据直接进行运算 扁平化操作到1维
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))
model.add(tf.keras.layers.Dense(128,activation="relu"))
# 最后一层 用softmax 激活 softmax转换10个类别的概率
model.add(tf.keras.layers.Dense(10,activation="softmax"))
step6 查看模型结构
print(model.summary())
参数计算:
100480 = 128*(784+1)
1290 = 10*(128+1)
step7 编译模型
#编译模型 给模型设置优化器,损失函数,度量参数等信息。在tf.keras里,对于多分类问题我们使用categorical_crossentropy(独热编码) 和 sparse_categorical_crossentropy来计算softmax交叉熵,(使用交叉熵来计算两个概率分布的损失)
#############损失函数
##########leable 使用数字编码(1,2,3,4,5....)sparse_categorical_crossentropy (使用读热编码)
##########lable categorical_crossentropy
model.compile(optimizer="adam",
loss="sparse_categorical_crossentropy",
metrics=["acc"]#度量参数
)
step8 训练模型
model.fit(train_image,train_lables,epochs=100)
step9 模型评估
# 使用测试集进行评价
model.evaluate(test_image,test_labels)