利用简单逻辑回归(Logistic Regression)学习MNIST手写数字集
一动机:想学习深度学习算法,之前已经看过Andrew NG的课程,听完之后感觉原理也不是很难,于是萌生了上手试一把的冲动,最开始用了TensorFlow,感觉很神奇的几段代码就达成了,然而用TensorFlow感觉还是很黑盒的感觉,还是想用Python手动撸一把,于是就上手试一下。
二方法:基本原理其实不是很复杂,照着线性回归,改成sigmoid的函数就可以了,超过两个用softmax,Cost函数变化了,不过权重更新貌似挺像的。(原理笔记见这里https://blog.****.net/mysql403/article/details/51246822)
三过程:
1 数据下载,直接从tensorflow里面读取,
import tensorflow.examples.tutorials.mnist.input_data
mnist = input_data.read_data_sets('data/', one_hot=True)
读取到的数据有train(55000)和test(10000)两个数据集 分别有images(784,1)和labels(10,1)两项,
2 原理虽然不难撸代码还真不简单呀,(x,y)(x_,y_),w,b分别是什么样的矩阵,如何乘这些细节都要考虑。考虑完之后,训练样本要怎么训练,一时,居然想不明白了,不就是有GD算法么?可是问题是 五万个样本,分别对应五万个label输出,这更新一次,到底是一个样本一个样本,更新还是全部采样呀?于是,回去看基础,梯度下降法的三种解释(BGD,SGD,MBGD),见下方(原来是这么分着的),果断采用容易理解的SGD。
3 上代码
第一版:
拿到test集里面测试,居然10000个正确了八千多个,很是欣喜。
然而训练数据超过一万居然溢出了(心里不知道怎么回事):
于是,查资料,说可能是学习率太高,导致梯度爆炸(自己理解应该是步子太大,扯着蛋了,好疼),于是,才想起好像是有这么个参数,于是,调整代码
吼吼,不错,这次55000个样本全部训练完了,而且,正确率在80%多,不错啊。
不过这个学习率过大过小貌似都不太行,试了几次学习率在0.005的时候,正确率达到了90%,天呀,神奇。。。