利用简单逻辑回归(Logistic Regression)学习MNIST手写数字集

一动机:想学习深度学习算法,之前已经看过Andrew NG的课程,听完之后感觉原理也不是很难,于是萌生了上手试一把的冲动,最开始用了TensorFlow,感觉很神奇的几段代码就达成了,然而用TensorFlow感觉还是很黑盒的感觉,还是想用Python手动撸一把,于是就上手试一下。

二方法:基本原理其实不是很复杂,照着线性回归,改成sigmoid的函数就可以了,超过两个用softmax,Cost函数变化了,不过权重更新貌似挺像的。(原理笔记见这里https://blog.csdn.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。

 https://blog.csdn.net/kevin_123c/article/details/51879935#0-tsina-1-20158-397232819ff9a47a7b7e80a40613cfe1

3 上代码 

第一版:

 

利用简单逻辑回归(Logistic Regression)学习MNIST手写数字集_第1张图片

拿到test集里面测试,居然10000个正确了八千多个,很是欣喜。

然而训练数据超过一万居然溢出了(心里不知道怎么回事):

利用简单逻辑回归(Logistic Regression)学习MNIST手写数字集_第2张图片

于是,查资料,说可能是学习率太高,导致梯度爆炸(自己理解应该是步子太大,扯着蛋了,好疼),于是,才想起好像是有这么个参数,于是,调整代码

利用简单逻辑回归(Logistic Regression)学习MNIST手写数字集_第3张图片

吼吼,不错,这次55000个样本全部训练完了,而且,正确率在80%多,不错啊。

不过这个学习率过大过小貌似都不太行,试了几次学习率在0.005的时候,正确率达到了90%,天呀,神奇。。。

 

 

 

你可能感兴趣的:(利用简单逻辑回归(Logistic Regression)学习MNIST手写数字集)