周末闭关两日,做了一个手写识别数字的程序。
夫人很气愤,浪费两天时间,搞出这么个破东西,十几年前的触屏手机就具备了手写输入功能,拿过来用不就可以?做这个有什么价值?
是的,很多第三方服务,接入很便捷,识别率也很高。但是那毕竟是别人家的。
豪宅豪车是不错,而我们租来只能使用,没有能力和胆量按照自己的想法去重新装修和改造。
然而,自己家的就不一样。你写一个4,我可以让他显示“郭敬明”,乐趣在此。
结合当下比较火的机器学习。
实现方式如下:
首先,要训练电脑认识手写体,所以找来很多例子。
这里面有65000多张手写体图片(图片来源于mnist),每张图片名称“_”后边的是它的数字值。然后,这些要交给机器去学习,图片有了,答案有了,机器会去找规律。
机器学习中有一个比较笨的方法,叫回归模型。
在这个例子中,它是这样运作的,比如下面这张图片,这是1的手写体图片。
我们把这个图片通过技术手段,按照一个个像素点搞成矩阵x,空白就是0,有颜色的有值,就像上面那样。
我们假设,有这么一个公式(这个公式将最终计算图片得出数字):这个图片矩阵x和另一个矩阵W相乘,然后再加上一个数b,就会得出一个值,这个值就是我们的答案y。
所以,我们把65000张图片x传入公式中,让他自己去算,未知数就两个,一个W和一个b。因为矩阵x对应的值是图片的像素点,所以这个图片一般都会小到不能再小。这次我们的手写体数字是28*28像素。
好的,经过机器的求解。我们终于算出来了W和b的值,这个值要保存起来,下一次可以直接使用。
y = Wx + b
也就是说,如果再有一个图片,我们只需要把它转换为矩阵,然后输入到公式中,经过计算,我们就知道y的结果了,也就是知道了这个图片表达的是数字几。
至此,这个简单的程序就做完了。
再来回顾一下效果:
这是使用的最简单的基于Softmax回归的全连接神经网络。
当然,相比于卷积神经网络,它的识别率很低。
但是,它很容易理解,就像Hello World,容易理解。
总结:
一、用到的知识
1、谷歌开源的机器学习框架TensorFlow的使用,矩阵运算,图的持久化保存。
2、python的GUI界面知识,PIL的图形处理。
3、机器学习的流程和概念,前向传播算法,损失函数,学习率。
4、数学知识,矩阵,交叉熵。
二、感悟和思考
1、全连接神经网络的回归模型,有点像全体民主。
因为参数太多,会导致计算变慢;又因为要考虑每个人的感受,会出现过拟合的现象。
简单来说,就是因为照顾几个特例,导致大局无法形成有规律的模型。
要是为了照顾几个特例,从而形成一个的公式,那么其他主流数据又不适用这个规则了。
所以,需要从大局出发,抛弃这些特例,或者忽略他们的一些次要信息,就像只看一个人的优点。
据说卷积神经网络可以解决这个问题,它不是考虑每一个参数,它只把抽取出的主要特征作为判断依据,有点像核心成员决策。
2、行业的知识是共通的。
在此之前没有接触过python这个编程语言,下载了个电子书,看了一下他的语法,什么叫if,哪个叫Button,很多命名居然都是一样的,很快就能上手。
所以,不必着急去学习语言1,语言2,语言3,每一大类语言(前端、后端这算不同种类,Java、C也算不同种类)学好一个,其他的会很快上手。