这里写目录标题
目标
使用神经网络探索多类分类的一个示例。
导入需要的工具和库
神经网络多分类简述
神经网络通常用于对数据进行分类。例如,神经网络可以处理照片并将其分类为狗、猫、马或其他类别,也可以处理句子并将其元素分类为名词、动词、形容词等。神经网络的最后一层包含多个神经元,每个神经元的输出对应一个类别。当一个输入样本传入神经网络时,输出值最高的神经元表示预测的类别。如果输出经过softmax函数处理,它将提供输入属于每个类别的概率。
在这个实验中,您将看到在Tensorflow中构建一个多类别网络的例子。接着,我们将深入了解神经网络是如何做出其预测的。让我们从创建一个四类数据集开始。
准备并可视化数据
1.构建数据集
使用 Scikit-Learn 的 make_blobs 函数来创建一个包含 4 个类别的训练数据集。
- X_train: 一个形状为 (100, 2) 的数组,包含生成的特征数据,每行表示一个数据点,每列表示一个特征。
- y_train: 一个形状为 (100,) 的数组,包含生成的数据点的类别标签,每个元素表示对应数据点的类别(0, 1, 2, 或 3)。
2.可视化数据集
可视化数据集。每个点代表一个训练示例。坐标轴 (x0, x1) 是输入,颜色表示示例所属的类别。一旦训练完成,模型将接收一个新的示例 (x0, x1),并预测其类别。
尽管这个数据集是生成的,但它代表了许多现实世界中的分类问题。有几个输入特征 (x0, ... , xn) 和几个输出类别。模型通过使用输入特征来预测正确的输出类别进行训练。
输出具体的类别,前10个数据集的真实标签y,以及训练样本的形状。
构建神经网络
1.简述
本实验将使用如下所示的两层神经网络。与二元分类网络不同,该网络有四个输出,每个类别一个。给定一个输入样本,输出值最高的便是预测的输入类别。
2.构建模型
设置两层,输出层为线性激活。虽然可以在输出层包含softmax函数,但在训练过程中将线性输出传递给损失函数会更为数值稳定。如果模型用于预测概率,那么在该阶段可以应用softmax函数。
3.编译并训练模型
以下语句用于编译并训练神经网络。在损失函数中设置参数from_logits=True,是为了指定输出激活函数为线性,而非softmax。
模型训练完成后,我们可以看到模型如何对训练数据进行分类。
4.每一层的分类
如上所示,决策边界展现了模型如何对输入空间进行划分。这个非常简单的模型在对训练数据进行分类时没有遇到任何困难。它是如何实现这一点的呢?让我们更详细地了解一下这个网络。
接下来,我们将从模型中提取训练好的权重,并利用这些权重来绘制网络中每个单元的功能。在下方会有对结果的更详细说明。要成功使用神经网络,您不需要了解这些细节,但了解这些内容可能会有助于您更深入地理解各层是如何结合来解决分类问题的,从而增加您的直觉理解。
第一层
第二层
5.解释每一层的分类
第一层
阴影越深,表示模型预测的激活值越高,也就是说模型预测该区域内的数据点属于某一类别的概率越高。
-
左图中,橙色点和紫色点(类别 2 和 3)位于右侧阴影深的区域,表示这些区域里的样本x0x1激活值较高,模型预测这些样本属于类别 2 和 3 的概率较高。蓝色点和绿色点(类别 0 和 1)位于左侧阴影浅的区域,激活值为 0。
-
右图中,紫色点和绿色点(类别 3 和 1)位于下侧阴影深的区域,表示这些区域里的样本x0和x1和激活值较高,模型预测这些样本属于类别3和1的概率较高。橙色点和蓝色点(类别 2 和 0)位于上侧阴影浅的区域,激活值为 0。
总结一下:第一层的两个神经元,通过不同的参数,绘制出不同的决策边界,然后通过ReLU,预测出了不同的分类。
第二层
这些图中的点是由第一层转换的训练样本。可以认为第一层为第二层创建了一组新的特征进行评估。这些图中的坐标轴是前一层的输出 𝑎[1]0 和 𝑎[1]1 。如上所述,类别0和1(蓝色和绿色)具有 𝑎[1]0=0 ,而类别0和2(蓝色和橙色)具有 𝑎[1]1=0。
再次强调,背景颜色的强度表示最高值。 单元0在 (0,0) 附近产生最大值,该位置映射了类别0(蓝色)。 单元1在左上角产生最高值,选择类别1(绿色)。 单元2在右下角产生最高值,选择类别2(橙色)。 单元3在右上角产生最高值,选择最后一个类别(紫色)。
图中不明显的另一个方面是值在单元之间的协调。一个单元不仅需要为其选择的类别生成最大值,还必须在该类别的点上是所有单元中的最高值。这是通过作为损失函数一部分的隐含 softmax 函数(SparseCategoricalCrossEntropy)来完成的。与其他激活函数不同,softmax 跨所有输出工作。
即使不清楚每个单元的具体作用,您也可以成功使用神经网络。希望这个示例能为您提供一些关于内部机制的直观理解。
存在的问题
即便设置了固定种子,每次Run All,神经网络的W,B也会随机变化,不清楚为什么。