借着上一篇对sigmoid的理解,将sotfmax替换成sigmoid便可!区别在于sotfmax解决的是多分类问题。git
先来看几个重要的关键点:数组
一、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是里面最小的,能取到的几率也是最小的。函数
二、假设上面一组数据是猫的特征,如今又有一组数据[8.0, 9.2, 7.6, 6.0],这个是狗的特征数据,经过sotfmax计算的结果是[0.19509259 0.64773005 0.13077445 0.02640291],在这里对比猫的特征数据结果,猫的是第三位数0.6477的几率最大,狗的是第二位0.6477最大,这样的话咱们能够区别两个动物了。再给一组数据,若是计算结果是第二位数最大,那咱们就能够判断它是狗,第三位数最大的话就判断是猫,若是是第一位呢或最后一位?那就是划为另外一个新动物了,这个数组有四个数,就能够进行四个分类。分类是否准确先不说,至少能够区别。spa
三、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,由于它们都表明的是几率,要相互比较。it
四、如今分四类,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表示。tensorflow