为了构建一个能够进行多类分类的神经网络,我们可以在神经网络的输出层使用Softmax回归模型。以手写数字识别为例,如果我们要识别从0到9的十个数字类别,就需要将神经网络的输出层改为包含十个输出单元的Softmax层。以下是实现的步骤和代码示例:
1. 神经网络的结构
-
输入层:接收手写数字图像的特征。
-
隐藏层:可以有多个隐藏层,例如第一层有25个单元,使用ReLU激活函数;第二层有15个单元,使用ReLU激活函数。
-
输出层:包含10个单元,每个单元对应一个数字类别(0到9),使用Softmax激活函数。
2. Softmax激活函数的作用
-
Softmax函数将输出层的线性组合 z 转换为概率分布,使得每个输出单元的值表示该输入属于对应类别的概率。
-
Softmax函数的输出值不仅取决于当前单元的 z 值,还依赖于所有其他单元的 z 值。这使得Softmax函数能够提供一个概率分布,而不是简单的阈值判断,从而更适合多类分类任务。
3. 在TensorFlow中实现
以下是代码实现:
-
构建模型:使用TensorFlow的
Sequential
模型,按顺序将各层连接起来。 -
损失函数:对于多类分类问题,使用
SparseCategoricalCrossentropy
损失函数。这个损失函数适用于标签是整数的情况(例如0到9),并且每个样本只属于一个类别。 -
以下是实现的代码示例:
-
代码解释
-
模型构建:
-
使用
Sequential
模型按顺序连接各层。 -
第一层有25个单元,使用ReLU激活函数。
-
第二层有15个单元,使用ReLU激活函数。
-
输出层有10个单元,使用Softmax激活函数。
-
-
编译模型:
-
使用
adam
优化器。 -
使用
sparse_categorical_crossentropy
损失函数,适用于多类分类问题,标签是整数(0到9)。 -
使用准确率作为评估指标。
-
训练模型:
-
使用训练数据
X_train
和y_train
进行训练。 -
设置训练轮数(epochs)和批量大小(batch_size)。
-
使用20%的训练数据作为验证集。
-
-
评估模型:
-
使用测试数据
X_test
和y_test
评估模型的性能。 -
输出测试集的准确率。
-
-
总结:通过上述代码,我们可以在TensorFlow中实现一个用于多类分类的神经网络。Softmax输出层能够为每个输入样本提供一个概率分布,表示该样本属于每个类别的概率。使用
SparseCategoricalCrossentropy
损失函数可以有效地训练这种多类分类模型。 -
第一张图片展示了一个具有Softmax输出层的神经网络结构。具体内容如下:
-
神经网络结构:
-
输入层:包含25个单元,使用ReLU激活函数。
-
第一个隐藏层:包含15个单元,使用ReLU激活函数。
-
输出层:包含10个单元,对应10个类别(0到9),使用Softmax激活函数。
-
-
Softmax函数的作用:
-
Softmax函数的独特性:
-
每个激活值 ai[3] 不仅依赖于自身的 zi[3],还依赖于所有其他单元的 zj[3]。这与其他激活函数(如ReLU、Sigmoid)不同,后者的激活值仅依赖于自身的输入。
-
第二张图片展示了如何在TensorFlow中实现上述神经网络结构,并进行模型训练。具体步骤如下:
-
指定模型结构:
-
使用TensorFlow的
Sequential
模型,按顺序连接各层。 -
第一层:25个单元,使用ReLU激活函数。
-
第二层:15个单元,使用ReLU激活函数。
-
输出层:10个单元,使用Softmax激活函数。
-
-
指定损失函数和优化器:
-
使用
SparseCategoricalCrossentropy
损失函数,适用于多类分类问题,标签是整数(0到9)。 -
编译模型时指定损失函数和优化器(例如Adam)。
-
-
训练模型:
-
使用训练数据进行模型训练,设置训练轮数(epochs)。
-
-
-
总结
这两张图片展示了如何构建一个具有Softmax输出层的神经网络进行多类分类,并在TensorFlow中实现这一过程。Softmax函数将输出层的线性组合转换为概率分布,使得每个输出单元的值表示该输入属于对应类别的概率。通过使用SparseCategoricalCrossentropy
损失函数,可以有效地训练这种多类分类模型。
补充Sequential模型
Sequential模型是Keras中的一种模型类型,它适用于构建那些层与层之间是简单堆叠(即前一层的输出是下一层的输入)的神经网络模型。在Sequential模型中,每一层的输出张量恰好是下一层的输入张量,层与层之间没有分支和并行结构,也没有层之间的共享权重或跳跃连接。这种模型非常适合简单的前馈神经网络,其中数据流是线性的,即每一层的输出直接成为下一层的输入。
创建Sequential模型非常简单,你可以通过传递一个层的列表给Sequential构造函数来创建模型。此外,你还可以通过add()
方法逐层添加。Sequential模型的行为非常像一个层的列表,它提供了一个方便的接口来构建模型,并可以方便地进行模型摘要(summary()
)打印,以监控模型结构和参数数量。此外,Sequential模型还支持增量构建,即可以在模型创建后通过add()
方法逐步添加层,这在调试和逐步构建模型时非常有用。
SparseCategoricalCrossentropy
损失函数
SparseCategoricalCrossentropy
损失函数是一种用于训练神经网络的数学工具,特别是在处理分类问题时。想象一下,你正在教计算机识别图片中的数字(0到9),这就是一个分类问题,因为你想让计算机将每个图片正确分类到10个不同的数字类别中。
在训练过程中,计算机会尝试猜测每个图片对应的数字,然后我们会告诉它猜测是否正确。SparseCategoricalCrossentropy
损失函数就是用来衡量计算机猜测的准确性,并指导它如何改进。
这里有两个关键点:
-
标签格式:在这种损失函数中,我们直接使用数字(0到9)来表示每个图片的类别,而不是使用一种称为“独热编码”的格式,后者会将每个数字转换为一个长字符串,其中只有一个位置是1,其余都是0。
-
计算损失:损失函数会计算计算机的猜测与正确答案之间的差距。如果猜测非常接近正确答案,损失就会很小;如果猜测完全错误,损失就会很大。
通过最小化这个损失值,我们可以训练计算机在识别数字时做得越来越好。在TensorFlow这样的机器学习库中,我们可以直接使用SparseCategoricalCrossentropy
作为模型的损失函数,这样在训练模型时,库就会自动帮助我们最小化这个损失。