基于tensorflow的MNIST手写数字识别(二)--入门篇

基于tensorflow的MNIST手写字识别(一)--白话卷积神经网络模型

基于tensorflow的MNIST手写数字识别(二)--入门篇

基于tensorflow的MNIST手写数字识别(三)--神经网络篇

一、本文的意义

         因为谷歌官方其实已经写了MNIST入门和深入两篇教程了,那我写这些文章又是为什么呢,只是抄袭?那倒并不是,更准确的说应该是笔记吧,然后用更通俗的语言来解释,并且补充更多,官方文章中没有详细展开的一些知识点,不过建议与官方文章结合着阅读。

           另外是代码部分的改动,官方的demo只提供了验证精确度,我将它改造成了能输入并预测输出结果的代码也就是说是一个从准备待测图片到最终是别的一个完整demo

中文版本:MNIST机器学习入门

http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html

demo截图如下,会将放进去的图片预测,然后输出结果,代码说明请看github的readme(最底下)

官网:http://yann.lecun.com/exdb/mnist/

这个MNIST数据库是一个手写数字的数据库,它提供了六万的训练集和一万的测试集。

它的图片是被规范处理过的,是一张被放在中间部位的28px*28px的灰度图

总共4个文件:

train-images-idx3-ubyte: training set images

train-labels-idx1-ubyte: training set labels

t10k-images-idx3-ubyte:  test set images

t10k-labels-idx1-ubyte:  test set labels

图片都被转成二进制放到了文件里面,

所以,每一个文件头部几个字节都记录着这些图片的信息,然后才是储存的图片信息

[offset] [type]          [value]          [description]

0000     32 bit integer  0x00000801(2049) magic number (MSB first)

0004     32 bit integer  60000            number of items

0008     unsigned byte   ??               label

0009     unsigned byte   ??               label

........

xxxx     unsigned byte   ??               label

The labels values are 0 to 9.

[offset] [type]          [value]          [description]

0000     32 bit integer  0x00000803(2051) magic number

0004     32 bit integer  60000            number of images

0008     32 bit integer  28               number of rows

0012     32 bit integer  28               number of columns

0016     unsigned byte   ??               pixel

0017     unsigned byte   ??               pixel

........

xxxx     unsigned byte   ??               pixel

每个像素被转成了0-255,0代表着白色,255代表着黑色。

[offset] [type]          [value]          [description]

0000     32 bit integer  0x00000801(2049) magic number (MSB first)

0004     32 bit integer  10000            number of items

0008     unsigned byte   ??               label

0009     unsigned byte   ??               label

........

xxxx     unsigned byte   ??               label

The labels values are 0 to 9.

[offset] [type]          [value]          [description]

0000     32 bit integer  0x00000803(2051) magic number

0004     32 bit integer  10000            number of images

0008     32 bit integer  28               number of rows

0012     32 bit integer  28               number of columns

0016     unsigned byte   ??               pixel

0017     unsigned byte   ??               pixel

........

xxxx     unsigned byte   ??               pixel

每个像素被转成了0-255,0代表着白色,255代表着黑色。

1、将要识别的图片转为灰度图,并且转化为28*28矩阵(单通道,每个像素范围0-255,0为黑色,255为白色,这一点与MNIST中的正好相反)

2、将28*28的矩阵转换成1维矩阵(也就是把第2,3,4,5....行矩阵纷纷接入到第一行的后面)

3、用一个1*10的向量代表标签,也就是这个数字到底是几,举个例子e数字1对应的矩阵就是[0,1,0,0,0,0,0,0,0,0]

4、softmax回归预测图片是哪个数字的概率

5、用交叉熵和梯度下降法训练参数

这个部分其实是比较重要的,因为如果处理不得当可能并不一定会有很好的结果,所以按照mnist的标准规范需要将待测图片转为28×28且文字居中的灰度图(其实彩色的也可以,不过就是最后代码需要改一下),目前介绍两种获得待测图片的方法:

1、自己用ps或者真的手写一些数字

2、将MNIST数据库中的二进制转化成图片,然后用来做测试

ps:图片解析  点击进入

如图所示,根据黑色部分的浓淡将其转化成微一个浮点数的数组,(白色0,黑色1)

看到这里,如果你跟我一样不熟悉python,是不是开始方了,没事,其实python很厉害,自带的PIL图片库一句话就可以搞定

img=array(Image.open(filename))         //打开然后就被numpy转化了

如果是彩色的图片,则需要先将它这样子转换一下(我当初并不知道可以转化,傻不垃圾地自己写了一个转化,所以python还是好好学习啊)

 im=Image.open("test_num3/8_3.png")

Lim  = img=array(im.convert("L")) 

      转化为一维的矩阵其实并不难,用python的reshape就能搞定,还是要讲一下标签的表示方法,这个曾经令队友疑惑不久,直到我把这个数组打印出来

监督学习:利用一组已知类别的样本调整分类器的参数,使其达到所要求性能的过程,也称为监督训练或有教师学习举个例子,MNIST自带了训练图片和训练标签,每张图片都有一个对应的标签,比如这张图片是1,标签也就是1,用他们训练程序,之后程序也就能识别测试集中的图片了,比如给定一张2的图片,它能预测出他是2

无监督学习:其中很重要的一类叫聚类举个例子,如果MNIST中只有训练图片,没有标签,我们的程序能够根据图片的不同特征,将他们分类,但是并不知道他们具体是几,这个其实就是“聚类”

          在这里标签的表示方式有些特殊,它也是使用了一个一维数组,而不是单纯的数字,上面也说了,他是一个一位数组,0表示方法[1,0,0,0,0,0,0,0,0,0],1表示[0,1,0,0,0,0,0,0,0,0],.........,

           主要原因其实是这样的,因为softmax回归处理后会生成一个1*10的数组,数组[0,0]的数字表示预测的这张图片是0的概率,[0,1]则表示这张图片表示是1的概率......以此类推,这个数组表示的就是这张图片是哪个数字的概率(已经归一化),

             因此,实际上,概率最大的那个数字就是我们所预测的值。两者对应来看,标准的标签就是表示图片对应数字的概率为100%,而表示其它数字的概率为0,举个例子,0表示[1,0,0,0,0,0,0,0,0,0],可以理解为它表示0的概率为100%,而表示别的数字的概率为0.

       这是一个分类器,可以认为是Logistic回归的扩展,Logistic大家应该都听说过,就是生物学上的S型曲线,它只能分两类,用0和1表示,这个用来表示答题对错之类只有两种状态的问题时足够了,但是像这里的MNIST要把它分成10类,就必须用softmax来进行分类了。

       P(y=0)=p0,P(y=1)=p1,p(y=2)=p2......P(y=9)=p9.这些表示预测为数字i的概率,(跟上面标签的格式正好对应起来了),它们的和为1,即 ∑(pi)=1。

       tensorflow实现了这个函数,我们直接调用这个softmax函数即可,对于原理,可以参考下面的引文,这里只说一下我们这个MNIST demo要用softmax做什么。

(注:每一个神经元都可以接收来自网络中其他神经元的一个或多个输入信号,神经元与神经元之间都对应着连接权值,所有的输入加权和决定该神经元是处于激活还是抑制状态。感知器网络的输出只能取值0或1,不具备可导性。而基于敏感度的训练算法要求其输出函数必须处处可导,于是引入了常见的S型可导函数,即在每个神经元的输出之前先经过S型激活函数的处理。)

       通俗一点就是,方差大家都知道吧,用它可以衡量预测值和实际值的相差程度,交叉熵其实也是一样的作用,那为什么不用方差呢,因为看sigmoid函数的图像就会发现,它的两侧几乎就是平的,导致它的方差在大部分情况下很小,这样在训练参数的时候收敛地就会很慢,交叉熵就是用来解决这个问题的,它的公式是

,其中,y是我们预测的概率分布,y'是实际的分布。

        上面那步也说了,有个交叉熵,根据大伙对方差的理解,值越小,自然就越好,因此我们也要训练使得交叉熵最小的参数,这里梯度下降法就派上用场了,这个解释见上一篇系列文章吧,什么叫训练参数呢,可以想象一下,我们先用实际的值在二位坐标上画一条线,然后我们希望我们预测出来的那些值要尽可能地贴近这条线,我们假设生成我们这条线的公式ax+ax^2+bx^3+.....,我们需要生成这些系数,要求得这些系数,我们就需要各种点代入,然后才能求出,所以其实训练参数跟求参数是个类似的过程。

4.7 预测

        训练结束以后我们就可以用这个模型去预测新的图片了,就像我们已经求出来了方程,以后只要随意输入一个x,就能求出对应的y。

https://github.com/wlmnzf/tensorflow-train/tree/master/mnist

http://blog.csdn.net/acdreamers/article/details/44663305softmax回归

http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html    MNIST学习入门

http://blog.csdn.net/u012162613/article/details/44239919交叉熵代价函数


Page 2

2006年的一个雪夜,我亲眼看着自己的妹妹倒在血泊中。

她死了,葬在白雪里。

这是她最好的结局。

我手里捏着带血的匕首,脸上没有任何表情。

直到警察赶来,将我带走。

我目光呆滞,仿佛三魂七魄被阴差勾走。

毕竟,当妹妹死的那一刻,我身为人的最后一项证明,也没了。

我已经不能被称之为人了。

1988年,我19岁,和小我两岁的妹妹姜婷一起给大姐做伴娘。

新郎官去年刚从监狱里被放出来,他作奸犯科吃喝嫖赌。

一个监狱常客,怎么可能会被黄花闺女相中。

他放出来没两个月,就在苞米地里强奸了大姐。

家里为了不被乡亲们戳脊梁骨,就只能勉强同意对方的提亲。

大姐的牺牲,是无妄之灾。

婚礼上,一对新人在拜天地。

我在一旁捏着竹篮子,嘴唇快咬出了血。

“我不同意!宋雪飞明明是强奸犯,他不是我姐夫!”

一声叱喝,一道炸雷。

场上乡里乡亲无不投射来目光看向我。

那是一种看戏,一种讥笑。

乡亲们都知道怎么回事,只不过,看破不说破。

“妈了个巴子的,老子是你姐夫,我娶你姐跟你有什么关系!”

宋雪飞瞪圆眼睛,一巴掌朝我扇了过来。

啪!

啪啪!

三巴掌下去,我脸上红地渗出血。

我倒在地上抿了抿嘴角,不让血流出来。

但比我脸上眼色更加猩红的,是三妹的眼球。

我眼睁睁看着姜婷从衣服里掏出菜刀,朝着宋雪飞砍了上去。

坐在地上的我,赶不及,拦不住。

“杀人啦!”

“姜家三闺女杀人啦!”

殷红的血从视线里迸射,溅到了我的衣服上。

所谓的大姐夫,现在脑袋已经被开了瓢。

红的,白的,四处都是。

只见那人惨叫着,捂着头。

哀嚎,叫骂,疯狂,死去……

人死的过程只需要不到一分钟。

但对我来说,那如同一生一般漫长。

从三妹杀人的那一刻起,姜家就已经注定不会再过上平静的日子。

“跑吧……”

“跑去哪?”

“不知道”

我和大姐三妹三个人互相看着,我现在脑子一片空白。

想必她们也是。

三妹手里依旧提着带血的菜刀,刀刃有猩红的血滴在地上。

“老三,家里有自行车,你骑车朝着南边跑,不要回头,上了公路拼命地骑,这辈子都不要再回来了。”

“不行,二姐,人是我杀的,我跑了警察抓谁?”

我一步三颤地走到三妹面前从她手里接过那把刀。

当我接过那把重约一斤二两的铁菜刀的一瞬间,曾经三姐妹小时候在田野里一起帮父亲割麦子,帮母亲过节包饺子的回忆,如跑马灯一般在脑子里闪回。

但我没有多少时间沉浸在回忆中,现在需要的是当机立断。

“老三,这样你就自由了,快走吧。”

姜婷看了我一眼,眼睛瞪得直直的,双腿像是被水泥灌上一样僵在原地。

我凑上去踢了她一脚,姜婷一个趔趄,摔倒在柴火堆。

此时,村大队那边已经绰约有七八个人影出现在稍远的地方。

“走啊!”

经我这么一喊,姜婷快速翻身爬起来,去屋子里抬出二八大杠骑上去,一路向南,背影逐渐缩小。

我没有看那些来抓人的大队干部和警察,而是看向了远方的火烧云,那样鲜艳,烫红。

大姐凑过来拉着我的手,紧紧攥着。

“走。”

“我来吧,你还要在家好好伺候爹妈和奶奶。”

我想起了以前的一些事情,三姐妹小时候在一起的那些日常。

大约七年前吧,大家都还是小丫头,正逢过年包饺子。

我在路边捡到了一个一枚五毛钱的硬币,这些钱可以买一包糖球了。

既然过年,自然要讨个彩头,我就谁也不告诉,将硬币偷偷包进了饺子里。

“能吃到硬币的人,以后一定能出人头地吧!”

这是我许下的愿望。

“老二,你包个饺子还背着我干嘛,你是不是在偷吃饺子馅?家里就那么些菜馅,少一口饺子就要留面了。”

“没有,我张嘴给你看看”

我嘿嘿笑着,张嘴给大姐检查,她叹了口气,没有继续怀疑我那些小动作。

大姐还是一如既往地成熟,温柔,顾家。她成熟的不像是个半大丫头。

毕竟每次老三翻墙去别人家偷鸡蛋的时候,都是大姐去给邻居赔礼道歉。

老三是个疯丫头,要强要面子,成天跟一帮小伙子出去疯玩,一家人都觉得老三生错了性别。

大姐老成稳重,事事都忍让包容,是村里交口称赞的未来好媳妇。

而我……我喜欢做梦,想要去大城市看看,想要见到祖国的山川大河,想要骑着老爸买的二八大杠环游中国。

那一定是个不切实际的梦吧……

饺子包好,煮熟上桌之后,我宣布了彩头,某个饺子里有一个五毛硬币。

三妹来了争第一的劲儿,拼命地往嘴里塞,可最后硬币却出现在了我的嘴里。

饭桌上,姜婷赌气哭了,她要强要到骨子里。往日跟野小子们争当老大不知道打过多少架,却在今天没能赢到一枚硬币。

最后还是大姐对她好好安慰,这才缓过劲儿来。

……

“别动!都离尸体远点!”

村大队的人来了,他们排开人群,不让村民们破坏尸体现场。

但他们扑了个空,姜婷跑了。

“人呢!姜老三那妮子呢!”

“跑了,是我指使老三杀人的,把我抓了吧”

支书打量着我,满脸的不相信。而在他身后,支书的儿子宋书怀表情则更加复杂。

焦急,震惊,慌乱……迫切……

“不会的,姜雅你怎么可能杀人!我不相信,我比谁都了解你,你不是那种人!”

我看了宋书怀一眼,他抓着头发,像是个无头苍蝇一样胡乱发疯。

宋书怀抱着他爹的手使劲儿地扯,张嘴在他爹耳边小声说着什么。

那是在为我求情吧,毕竟我和宋书怀已经相恋两年多了,眼看着快要把婚事提上日程,却摊上这么个事儿。

最终,支书甩开了他儿子的手,指挥着身后的一众干部跟警察。

“把姜雅给我抓起来!”

“爸!那是你儿媳妇!死的不过是个作奸犯科的泼皮,你怎么就不能当做为民除害!”

支书瞪了宋书怀一眼,没说话,更没收回决定。

我任由村干部们过来把我架走,没有什么反抗。

杀人偿命,总要有一个人承担代价,不是么……

三天后,村派出所的牢房里,我坐在发潮的木板床上发呆。

我似乎脑袋被人开了个洞,所有的思维和情绪都顺着那个洞流走了。现在什么情绪,什么想法都没有。

一阵嘈杂的拍铁窗声音将我唤醒,抬眼看过去,蓬头垢面的宋书怀在呼唤我。

“姜雅,今天下午的提审你把你妹妹供出来,然后我会想办法让案件不追究下去,这样事情就压下来了。”

压下来?出去?这确实是好事,但我怎么并没有感到惊喜?

我一度觉得,我似乎能未卜先知了,因为事情的下一秒,发生了让我难以想象的转折。

支书很快出现了,他拽着宋书怀离开牢房,一句话都没说,只是给我传递了一个又像是高兴,又像是欣慰,又有点扼腕的眼神。

等我的宣判下来之后我才明白前因后果。

支书给宋书怀早就准备了个门当户对的城里姑娘,从一开始,就不觉得我这种没文化的村姑是个合适的儿媳妇。

本来人家就想棒打鸳鸯的,这下可好,我顶了罪,直接成全了人家的美事。

但支书还是给我留了情面,在他的庭前佐证里面,写清楚了所有新郎官的恶行还有事故前因后果,要求给我减刑。

最终,我被判7年。

我被收监那天,坐在囚车里眼神空洞,感觉整个世界都在与我远去。

可咣当一声撞击将我吓到,那声音很响……

“姜雅!不管你判七年还是十年,十五年,我都会等你的!你不出狱我不结婚,你也要等我!”

真是个痴情的汉子……

“死心吧!我已经配不上你了!”

我想让自己尽量装作绝情一些,可眼泪和声带却生生将自己出卖。

泪水洒满囚车,声音也是哽咽断喉。

再见了青春,再见了初恋,再见了……世界。

再次意识聚拢的时候,已经收押入监,我戴着手铐脚镣坐在牢房。

啪!一个巴掌打了过来,让我的脸火辣辣地疼。

5,

“下铺是老娘的,你个新来的妮子去上面!”

原来坐了别人的床,我只好翻身上去,坐在上铺继续发呆。可明显下铺的狱友见我好欺负,不准备就此松手。

她开始教我规矩,每个月我要给她交块钱十块钱茶钱,以后管她叫大姐,给她洗脚端水。否则这里可没我好日子过。

我没理她。

狱友见我无视炸了毛,腾地站起来,拎着我脖领子。

“跪下!懂不懂规矩!你怎么进来的?犯的什么事?”

“我姐被村里一个二流子强奸了。然后……”

听到这话,狱友来了兴致,嘴咧到了脸颊中央去,写满了嘲笑。

“哦~,你姐是个烂货,被二流子玩了,怕不是有了孽种了吧?然后呢?”

听到这话,我原本空洞的内心突然沸腾起来,猩红的血丝爬满眼球。

啪!

一巴掌,我扇在了狱友脸上,但还是不解气,连着三脚我踹在她小腹,狱友惨叫着飞进了下铺床上,捂着肚子翻滚。

谁都不能侮辱大姐,谁都不能!

“我杀了那个二流子,你有什么想说的么?”

狱友惊恐地看着我,从上一分钟的趾高气昂,变成了恐惧。

监狱就是这样一个地方,谁更不要命,谁更狠,谁就能活得滋润。

狱友没敢再说话。

[if !supportLists]第二天,[endif]她将下铺让给了我,还主动在我枕头里塞了十块钱纸币。

照她的话说,这是孝敬的茶钱。

夜里睡不着觉,我捏着手里的纸币,脑子里不知道该想些什么。

“姜雅,有人来探监了,你出来吧。”

我被狱警带着来到探监室,大姐满是憔悴地看着我,眼圈坨红。

在她身后,站着宋书怀。

“老二,宋书怀说一定要捞你出去,你不用待满七年,你放心。”

我抿着嘴,想张开说些什么,但话到嘴边又忘记了嘴巴怎么动。

出去么……

的确是个好事,但宋书怀会为此付出什么样的代价,我不知道。

只是……宋书怀不是支书,他爹才是。

而且杀人偿命,我放了老三,那罪就应该我来承担,不应该再拉书怀下水。

他是村里少有几个马上要上大学的,以后是国家栋梁,是村里的希望,不能被我一个蹲过监狱的女人耽误。

“书怀,你不应该为了我,放弃你的前途。”

我想这么让宋书怀醒过来,但他却红眼瞪着我,对我这番随波逐流的姿态很是失望。

我让你失望了。

这样就好。

放手吧。

我认了。

再见。

没等宋书怀和大姐再说些什么,我就站起身离开探监室。

可回去的路上,路过活动区的时候却被一个女囚吸引。

与别的女囚不同,她在戴着眼镜看书,梳着干净的双辫,虽然穿着囚服,却气质像个读书人。

“你在看书?”

“啊对……是,对不起,打扰到你了,我让座”

她比大姐还要懂得退让,活像是个小老鼠。

“不不,我不是在赶你,我也想看书,但我不识字。你能不能教我?”

“你想学知识?”

我点了点头,毕竟我从认识宋书怀那天开始,就觉得读书识字是件特别脸上有光的事情,没想到进了监狱,我还能有学习的机会。

我打量着眼前很有知识的女囚,心里有种对老师的尊敬。

“我叫姜雅,你呢?”

“王雪蓉”

“你是怎么进来的?”

“我爹带着我单位的机关文件,拉着小老婆去美国了。我还没睡醒,就被抓了进来。”

原来是殃及池鱼……

王雪蓉是个很好相处的女孩,也很乐意从头教我读书写字。

这些行为虽然在监狱里不违规,但王雪蓉是国家叛徒的女儿,在这里被所有人都骂作汉奸,所以她教我东西,也变得非常敏感。

谩骂,流言,唾弃,戳脊梁骨……

我不想理会这些,可挡不住这些东西像是虫子一样钻进耳朵里。

王雪蓉是个很清瘦的女孩,每天吃的很少,而且特别自闭。

吃饭劳改之外唯一的行为就是找个别人看不到的角落看书。

逃避,是她在这里不被人欺负的唯一办法。

但俗话说三人成虎。

谣言说了一千遍就会成为事实。

不久后我被典狱官传唤,警告我不要再想着救王雪蓉出去,不要当汉奸,否则会加判刑期。

“王雪蓉只是在教我读书写字而已……我知道,你这是文字狱。”

文字狱,是王雪蓉最近教我的一个词汇。

典狱官眼皮挑了挑,明显在我的话里听到了挑衅。

“宋支书特意提醒我关照你点,但你要是自己堕落不肯改造,那就没办法了。最后警告你一次,别再和王雪蓉有接触,她爸爸是汉奸。”

我明白怎么回事,相信典狱官也明白怎么回事儿。

首页 - Wiki
Copyright © 2011-2026 iteam. Current version is 2.155.1. UTC+08:00, 2026-04-07 08:27
浙ICP备14020137号-1 $访客地图$