今天研究了好久的sigmoid,把学习结果总结一下。git
sigmoid的二分类问题。
函数
首先咱们得有个样本,好比书上的例子。经过人的体重和年龄,来预测血脂的高低。那么数据形式就是[weight,age],血脂的高低用1和0表示,1表示高,0表示低。[1]或者[0]学习
100个样本数据就是[[88,33],[78,25]......], 所对应的结果是[[1],[0].......], 意思是第一我的体重88,年龄33,血脂高(1);第二我的体重78,年龄25,血脂低(0)。优化
这100个样本的体重和年龄用X表示,血脂高低用Y表示,若是X的分布以下图,那么咱们就能够找出一条能大概条例这些点的直线,那么这条直线的函数是:F = W*X+B 。(F并不等于Y)blog
此时,这条直线表明的并非真实数据。它只是经过100个样本所推算出来,能粗略表明全部人的一个线性方程。(准确性要看样本的大小,样本越大,准确性越高;各个元素之间的相关性越强,准确性也越高)若是此时随便给个新的X,就能够算出它所对应的结果F。it
这个F,咱们都不知道它表明什么,不重要,咱们暂时知道有这个值先。tensorflow
如今轮到sigmoid出场了!循环
sigmoid的做用是能够把一堆值变成非线性的,它返回值是在0-1之间。当咱们将上面获得的F传入sigmoid中(a = tf.sigmoid(F)),sigmoid就会将F的值按照下图的曲线得出a,a是在0-1之间的小数,包括0和1。若是a的值在0.5-1之间,表示血脂高,那么a在0-0.5之间,就表示血脂低。咱们是否是直接从100个样本的体重和年龄就能够推算出他们的血脂高低了。对的!就是这样子im
第一步:f=tf.matmul(w,x)+b 得出线性方程总结
第二步:y = tf.sigmoid(f) 将样本分红两类,一类血脂高,一类血脂低。
可是,这个推算出来的分类到底准不许?
文章开头有个数据Y,是100个样本的血脂高低的真实数据。若是咱们推算出来的y和真实数据的Y是彻底同样的,那准确率就是100%,若是有3个错误,那准确率就是97%,因此咱们要经过比较才知道准确率有多少。假设准确率只有56%,我能够经过改变以前那条直线方程的w的值和b的值,获得的F不同,sigmoid出来的值也不同,分类也会不一样,让它的准确率不断提升,这就叫作优化。
接下来怎么比较?怎么优化呢?
tensorflow有个函数tf.nn.sigmoid_cross_entropy_with_logits(logits=logit,labels=label),这个函数常常用到的参数有两个,一个logits,输入的是未sigmoid的线性方程(F),另外一个是labels,这个是真实的数据Y。此函数先对参数logits作sigmoid运算,而后再把运算结果(y)与labels(Y)作交叉熵计算。交叉熵是指推算出来的分类结果(y)与真实数据的分类结果(Y)之间的差别,交叉熵的值越小,二者之间的差别越小。(交叉熵常常用来做损失函数)
高潮来了!!要提升准确率,接近真实数据,是否是只要让交叉熵的值愈来愈小,就能够了!bingo!!
tensorflow里面有个优化器Optimizer,优化器里有个叫梯度降低优化器 tf.train.GradientDescentOptimizer(learn_rate).minimize(loss_fun) 。参数learn_rate是学习率,loss_fun就是要优化的损失函数。学习率本身定个值,如learn_rate=0.01。为了方便理解,能够理解为调节w和b的值,每一次调节0.01,不是调一次就准确了,因此要不停的调,好比循环1000次,直到交叉熵的愈来愈小,最后稳定在一个值,也就是最小值。这样是结果是最让人满意的,也叫作收敛。若是learn_rate过大,就会没法收敛。(这次梯度暂不展开解释)
此时,咱们经过100个样本训练出来的模型就基本定型了。如何还想要继续提升准确率,就要从样本上入手。