sotfmax的通俗理解
借着上一篇对sigmoid的理解,将sotfmax替换成sigmoid即可!区别在于sotfmax解决的是多分类问题。
先来看几个重要的关键点:
1、sotfmax 是在一堆数值里面取最大数的概率。如tf.nn.softmax([1.0, 3.0, 4.2, 2.6]),返回的结果是[0.02640291 0.19509259 0.64773005 0.13077445]。意思是在这个数组里,取到4.2的概率是0.6477。1.0是里面最小的,能取到的概率也是最小的。
2、假设上面一组数据是猫的特征,现在又有一组数据[8.0, 9.2, 7.6, 6.0],这个是狗的特征数据,通过sotfmax计算的结果是[0.19509259 0.64773005 0.13077445 0.02640291],在这里对比猫的特征数据结果,猫的是第三位数0.6477的概率最大,狗的是第二位0.6477最大,这样的话我们可以区别两个动物了。再给一组数据,如果计算结果是第二位数最大,那我们就可以判断它是狗,第三位数最大的话就判断是猫,如果是第一位呢或最后一位?那就是划为另一个新动物了,这个数组有四个数,就可以进行四个分类。分类是否准确先不说,至少可以区别。
3、tensorflow里有个函数tf.nn.sotfmax_cross_entropy_with_logits(logits=logit,labels=label)。logits是上面的特征数据[1.0, 3.0, 4.2, 2.6] , 那labels就是真实的分类,是猫就可以表示为[0,0,1,0],狗就是[0,1,0,0]。第二个位置是1,表示是狗,第三个位置是1,表示是猫。tf.nn.sotfmax_cross_entropy_with_logits函数先将特征进行sotfmax运算,再和label做交叉熵运算,得到的结果就是它们的差异值。logits与labels必须是相同的shape,因为它们都代表的是概率,要相互比较。
4、现在分四类,labels就是一组四个元素的数组,但是我的样本数据里包括很多项内容,如有毛发,牙齿,眼睛,身高,体重这五项特征,logits与lables的shape又要一样,怎么办?还记得上一篇的sigmoid中有涉及到一个线性方程 F = W*X +B 吗?,这时W就起作用了,假设有10个样本,X是一个10*5的数组[ [a0,b0,c0,d0,e0],[a1,b1,c1,d1,e1],......[a9,b9,c9,d9,e9]],此时,我们定义W为一个5*4的矩阵,W*B的结果就是一个10*4的矩阵的。lalels也是一个10*4的矩阵,[[0,0,1,0],[0,1,0,0],......]。注意,每个[0,1,0,0]这样的数组里面的数加起来必须为1,因为它代表的是概率,也可以表示为[0.1,0.2,0.6,0.1],但是这个labels是我们知道的真实标签,这个百分之百就是猫,所以[0,0,1,0]的第三位直接用1表示。