- 输出层采用softmax
- 在识别手写数字的模型中,预测y只有两个结果,所以输出层采用sigmoid激活函数且只有一个神经元。
- 若预测y有10个结果(0-9),该模型的前向传播计算方式与识别数字的模型完全相同,即隐藏层的设定完全相同,那么输出层可以采用softmax激活函数,也叫该神经网络模型有一个softmax输出层
- softmax激活函数与sigmoid激活函数的区别:对于sigmoid,a₁是只关于z₁的函数;对于softmax,a₁是关于z₁…z₁₀所有z的函数(每一个激活值a都取决于所有z的值)
- 用tensorflow实现softmax
- 与之前类似,有三个步骤来这指定和训练模型:第一步,指定模型结构并设定单元数和激活函数。第二步,指定损失函数和成本函数,在tensorflow中,称softmax激活函数的损失函数为SparseCategoricalCrossentropy函数。第三步,训练模型
- 但这个版本的代码可能会损失数据精度,以下为提高数据精度的办法
- 提高数据精度
- 如图所示,在进行浮点数运算时,表达式不同结果也会不同,这是因为小数在计算机中用二进制来表示可能会丢失精度
- 第二种情况先计算了两个中间值,再用两个中间值做运算,这加大了损失数据精度的可能。
- 第二种可以通过化简表达式来达到第一种的数据精度
- 在之前逻辑回归模型中,输出层直接计算并输出激活值a,再将a的值带入损失函数,相当于上图的第二种情况,即先计算了中间值a,再将a的值代入损失函数进行运算,加大损失数据精度的可能
- 相反,我们可以选择将输出层的激活值a隐式表达,即不直接计算出a的结果,转而将a直接代入损失函数中,再让tensorflow自动简化损失函数,来减小损失数据精度的可能
- 在代码中:需要将输出层的激活函数设为linear,且将g(z)直接带入损失函数中。因为我们并不计算激活值a,所以不需要sigmoid激活函数,直接用linear激活函数输出z就行;因为要将a,即g(z)代入损失函数中,所以损失函数为关于z的函数
- 在之前的softmax回归模型中,输出层同样是直接计算并输出激活值a,再将a的值代入损失函数。同样是计算了中间值a,再将a的值代入损失函数进行运算,这加大了损失数据精度的可能。
- 相反,我们也可以将输出层的激活值a隐式表达,即不直接计算出a的结果,转而将a直接代入损失函数,再让tensorflow自动简化损失函数,来减少损失数据精度的可能。
- 代码中:同样将输出层的激活函数设为linear,且将g(z)直接代入损失函数中。因为我们也不需要计算激活值a,所以不需要softmax激活函数,直接用linear激活函数输出z就行;因为要将g(z)代入损失函数,所以损失函数为关于z的函数
- 综上:这个版本与原始版本相比:提高了数据精度,增加了阅读的难度,但实现了几乎相同的事情
- 在softmax回归模型中,因为输出层的激活函数是linear,所以输出层的输出结果不再是a₁ - a₁₀,而是z₁ - z₁₀
- 对于逻辑回归模型也是如此,所以如果想要得到预测y为1的概率,还需要带入sigmoid函数g(z)