飞道的博客

softmax多分类

451人阅读  评论(0)

一、softmax分类

对数几率回归解决的是二分类的问题,对于多个选项的问题,我们可以使用softmax函数它是对数几率回归在N个可能不同的值上的推广。
神经网络的原始输出不是一个概率值,实质上只是输入的数值做了复杂的加权和与非线性处理之后的一个值而已,那么如何将这个输出变为概率分布?
这就是Softmax层的作用,将输出值转化为概率。

  • softmax要求每个样本必须属于某个类别,且所有可能的样本均被覆盖。
  • softmax样本分量之和为1,当只有两个类别时,与对数几率回归完全相同
  • 在tf.keras里,对于多分类问题我们使用categorical_crossentropysparse_categorical_crossentropy来计算softmax交叉熵。

二、Fashion MNIST 数据集

  • Fashion MNIST 的作用是成为经典MNIST数据集的简易替换,不同于MNIST手写数据集,Fashion-MNIST数据集包含了10个类别的图像,分别是:t-shirt(T恤),trouser(牛仔裤),pullover(套衫),dress(裙子),coat(外套),sandal(凉鞋),shirt(衬衫),sneaker(运动鞋),bag(包),ankle boot(短靴)。MNIST数据集包含手写数字(0、1、2等)的图像,这些图像的格式与服饰图像的格式相同。
  • Fashion MNIST 比常规MNIST手写数据集更具挑战性。这两个数据集都相对较小,用于验证某个算法能否如期正常运行。它们都是测试和调试代码的良好起点。
  • 我们将使用60000张图像训练网络,并使用10000张图像评估经过学习的网络分类图像的准确率。可以从TensorFlow 直接访问Fashion MNIST,只需导入和加载数据即可。

三、softmax分类的简单示例

代码运行平台为jupyter-notebook,文章中的代码块,也是按照jupyter-notebook中的划分顺序进行书写的,运行文章代码,直接分单元粘入到jupyter-notebook即可。

1.导入第三方库

import matplotlib.pyplot as plt
import tensorflow as tf
import pandas as pd
import numpy as np
%matplotlib inline

2.加载fashion_mnist数据集

(train_image,train_label),(test_image,test_label) = tf.keras.datasets.fashion_mnist.load_data()
# 训练集的形状(60000, 28, 28)
print("训练集的形状:",train_image.shape)
# 训练集标签形状(60000,)
print("训练集标签形状:",train_label.shape)
# 打印训练集第一张图片看看
print(train_image[0])
# 查看第一张图片的标签
print(train_label[0])
# 查看训练集第一张图片
plt.imshow(train_image[0])

3.数据处理

对训练集和测试集进行归一化。

train_image = train_image/255.
test_image = test_image/255.

4.搭建模型

model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))
model.add(tf.keras.layers.Dense(128,activation="relu"))
# 最终输出层,由于有10个类别,所以输出单元个数为10
model.add(tf.keras.layers.Dense(10,activation="softmax"))
  • 该网络的第一层 tf.keras.layers.Flatten将图像格式从二维数组(28 x 28像素)转换为一维数组(28 * 28 = 784像素)。可以将这一层看作是堆叠图像中的像素行并将它们排成一行。该层没有学习参数。它只会重新格式化数据。
  • 像素展平后,网络由tf.keras.layers.Dense两层序列组成。这些是紧密连接或完全连接的神经层。第一Dense层有128个节点(或神经元)。第二层(也是最后一层)返回长度为10的数组。每个节点包含一个得分,该得分指示当前图像属于10个类之一。

模型中第一层是Flatten层,那么为什么是Flatten层呢?
Dense是把一个一维的数据映射到另一个一维的数据,不能把二维的数据进行运算,所以我们要把fashion mnist数据先扁平成一维的,model.add(tf.keras.layers.Flatten(input_shape=(28,28))),了解更多详情还可以查看官方文档Dense的解释。
还有一点要注意,这是一个多分类问题,所以最后一个输出层的激活函数,我们使用softmax,将输出的类别转化为概率。

5.训练模型

可以在官方文档查看模型对compile方法的参数使用。
在tf.keras里,对于多分类问题我们使用categorical_crossentropysparse_categorical_crossentropy来计算softmax交叉熵。

# 定义优化器,损失函数
model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['acc']
)
model.fit(train_image,train_label,epochs=5)

6.模型评估

model.evaluate(test_image,test_label)

参考文章:
Tensorflow2.*教程之基本分类:对Fashion Mnist进行分类(1)
【深度学习】Fashion-MNIST数据集简介


转载:https://blog.csdn.net/booze_/article/details/125817983
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场