[翻译4.5] Softmax classification

在逻辑回归问题中我们可以让模型回答yes-no的问题。现在如果是要回答多选择性问题呢话要怎样呢,比如:“你出生在哪里?波士顿?伦敦?还是悉尼?”

对于这一类问题,需要使用softMax函数,它可以由逻辑回归生成C类不同的值。

《[翻译4.5] Softmax classification》

这个函数会返回它返回一个C成分的概率向量,填充着每个类别的输出。由于是概率,所以C个元素相加以后的结果是1。这是因为公式是这样构成的:每个可能的输入数据示例必须属于一个输出类,覆盖了100%个可能的例子。如果相加之后小于1,那就意味着可能有一些隐藏的类别;如果是大于1,那就意味着每个样本不仅仅属于一个类别。

我们可以去证明,当分类的数目是2个的话,输出结果的概率和逻辑回归模型的输出一样的。

现在,看看模型的代码。你会发现和之前的模型在初始化的时候有很明显的区别。由于我们的模型计算C个输出,而不是一个,所以我们需要有C个不同的权重组,每组分配有一个。因此,我们会使用一个权重矩阵来代替权重向量。矩阵中的每一行代表每次输入的特征值,同时会有一列代表输出的类别。

我们准备使用softmax对鸢尾花(Iris flower)分类。你可以从https://archive.ics.uci.edu/ml/datasets/Iris中下载数据。该数据集合中包含了4个特征值,和三个可能的输出类别结果。这三种结果分别对应着每一种花卉类型。所以,我们的矩阵应该是4*3大小的。

变量的初始化代码如下:

《[翻译4.5] Softmax classification》

当然,和你期待的一样,Tensorflow中已经内嵌(embedded)了softmax函数的实现:

《[翻译4.5] Softmax classification》

关于(Regarding)loss的计算,和逻辑回归(logistic regression)的一样,同样需要考虑拟合(fit)的候选loss function,因为这里输出的也是概率。我们准备再次使用交叉熵(cross-entropy)来用于多分类的计算。

对于计算单个样本i ,交叉熵应该是:

《[翻译4.5] Softmax classification》

在训练集合上,需要将每个样本输出类别对应的loss相加。注意Yc中等于1的元素应该是所期望的类别,而其余的应该是0.所以其实只有一个loss值被加上,这个loss是用来衡量模型中预测的分类和真事分类的距离。

现在需要根据训练集合来计算所有的loss,我们需要对每次训练样本的loss求和:

《[翻译4.5] Softmax classification》

在代码的书写上,Tensorflow有两种版本来实现softMax的交叉熵:一种是优化训练集,使得每个样本对应一个类别。例如,我们的训练数据可能只有一个值“人”、“狗”、”树”之类的值。我们用的是tf.nn.sparse_softmax_cross_entropy_with_logits.

《[翻译4.5] Softmax classification》

另一个版本是允许你的数据集合中每个类别都有概率值。或者例如,您可以使用训练数据,如“60%的被问及的人认为这张照片是关于狗,25%关于树木,其余的人认为是“人””

这个时候需要用tf.nn.softmax_cross_entropy_with_logits.在真实生活中可能会用到这个函数,但是我们不会在简单的案例上使用它。稀疏(spare)版本也是可以用的,因为它的计算速度更快。(P.S.这里的稀疏版本指的就是第一个版本)。注意,模型的最终输出将始终是一个单一的类值,而此版本只是为了支持更灵活的训练数据。

来让我们定义输入方法。我们会再次利用“4.4节逻辑回归”中read_csv函数,但是这次调用的时候,默认值是适合我们的数据集的(我们的数据集都是数字,所以默认值也是数字):

《[翻译4.5] Softmax classification》

我们不需要使用sparse_softmax_cross_entropy_with_logits来将每个类别转换成新的变量(上一节的逻辑回归是需要转换的),但是我们需要将类别的值控制在0到2之间,因为我们只有三种可能性。在这个数据集合中,类别是字符串的值:“Iris-setosa”, “Iris-versicolor”, or “Iris-virginica”。 为了转换他,我们用tf,pack来创建tensor,同时用tf.equal来对比。然后我们使用tf.argmax到tensor中找到真实值的位置,并且将其有效的转化为0到2的整数。

训练函数和之前的一样,不必多说。

为了评估精确度,我们需要一种有明显变化的sigmoid version:

《[翻译4.5] Softmax classification》

预测模型会计算测试样本中每个类别的概率。我们会使用tf.argmax函数来选择一个最大可能性的类别作为预测的输出值; 最后,我们会用tf.equal来和期望类别进行比较,并且与sigmoid实例一样使用tf.reduce_mean。

代码运行的准确率是96%;

PS:还有一小节就会结束,等把第四章翻译完毕以后,我会把完整的代码粘贴过来。如果有问题,请评论。

    原文作者:斐波那契的数字
    原文地址: https://www.jianshu.com/p/b350c8b0edc2
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞