Discuz验证码识别(上线篇)-写给程序员的TensorFlow教程

经过前两篇文章的开发,咱们今天终于要进入令人激动的上线篇了。(最近刚刚发布的TensorFlow lite其实也是部署上线的工具集之一)话说我在学习TensorFlow的时候,发现这部分的教程是尤其少。大部分教程都是先上来教一个回归,再来一个CNN,在来几篇保存模型和TensorBoard就结束了。我们这篇文章就来重点聊一聊部署上线。

前两篇文章传送门:

Discuz验证码识别(准备篇)-写给程序员的TensorFlow教程

Discuz验证码识别(编码篇)-写给程序员的TensorFlow教程

这篇文章会被分成四个部分,第一部分继续上篇文章,聊一聊第四步调参;第二部分聊一聊训练中的模型保存和载入;第三部分,介绍TensorFlow Serving;第四部分 就是最重要的部署上线流程。

Part 1 训练中的调参

还是先回顾下我们再三提及的解题思路:

第一步:将问题分解成输入(x)到输出(y)这样的结构,如Discuz验证码的输入是图片,输出是四个字符的字符串

第二步:找到很多同时包含输入输出的数据,比如很多有识别结果的验证码图片

第三步:针对不同问题,找到算法大神们的已经定义好的算法并实现成代码

第四步:尝试使用这个算法训练这些数据,如果效果不好,算法中有一些参数可以手动调整,至于怎么调,可以参考前人经验,也可以自己瞎调积累经验。

第五步:写一个程序载入模型,接受一个新的输入值,通过模型计算出新的输出值。

前两篇文章已经走完了前三步,那么我们现在来看的第四步。不负责任的讲,其实机器学习工程师大部分时间都是在调参。毕竟,大神都想好的算法就几个,但是却留了很多参数来调整。我们总还是得体现出自己的价值是不是,那我们来看看一般都有哪些参数值得调整(大家最好对照代码来看,这个是熟悉代码最好的方式):

1.图片最终压缩的长宽

image_resized = tf.image.resize_images(image_gray, [48, 48],tf.image.ResizeMethod.NEAREST_NEIGHBOR)

这一段是我们前面代码中压缩图片的逻辑,那么最终图片压缩到多大是最合适的呢?太大的训练的慢,内存占用高;太小了又会丢失重要信息。一般来说,我们挑一个样本图片,压缩完之后用肉眼看一下,如果你自己肉眼还能识别的话,那就是ok的。

2.神经网络层数和节点数

看了两节课,大家应该大体能知道我们的神经网络是由一层一层的节点组成的,比如这就是一层,这一层实现的是卷积层:

Discuz验证码识别(编码篇)-写给程序员的TensorFlow教程

欢迎大家回到《写给程序员的TensorFlow教程》系列中来,本系列希望能给广大想转型机器学习的程序员带来一些不一样的内容,我们不讲公式,只调方法,不聊文献,只说代码。不求最好,只求有用。带大家迅速上手TensorFlow(以下简称TF。我是强迫症患者,每次都敲驼峰太累了)。

系列教程前篇:

Discuz验证码识别(准备篇)-写给程序员的TensorFlow教程

下面正式要开始了我们真正的TensorFlow编程,这篇文章主要内容分为两部分,一部分是介绍TF的基础知识和一些常用接口;第二部分是接着上节课的内容继续执行我们的解题思路。

我们先进入第一部分

Part 1、TF基础知识

虽然我们机器学习的基础概念可以先不深究,但是TF还是得讲一讲的,不然咱们就算抄再多代码也是天书,完全达不到渗透法的学习目的,所以我们先给大家讲一讲TF的基本代码结构。

对于开发网页或者移动应用来说,程序是沿着我们写出来的代码逻辑一步一步执行的,因此我们一般都是可以在代码中任意地方插入print来打印我们需要了解的变量的值。但是在TF中却不是这样,TF中我们的代码一般会被分为两个模块:

1.先预定义一张图

注意:这个图不是图片的图,而是一个节点之间相互连接的结构,为了能打击大家的学习积极性,我先放一张简单的图给大家看看:

2.再循环把数据扔进这张图中执行

举一个不恰当的比方:

机器学习任务类似与起房子,一条一条的数据就是一块一块的砖,最终训练出来的模型就是房子本身,那么相对应的起房子的流程就是:

1.先画一个设计的图纸

2.根据这个设计的图纸,用砖一点一点把房子造出来

这里稍微有些不恰当的细节,不过初学者不用在意这些细节。

那么接着我们就要认识到TF中的一个最重要的概念,那就是Session,这个Session就可以理解为施工队,Session的具体用法如下:

Discuz验证码识别(准备篇)-写给程序员的TensorFlow教程

蛰伏了快两个月了,终于迎来了新系列的第一篇文章。斟酌来斟酌去,决定将系列名字定为-《写给程序员的TensorFlow教程》也算是给这个系统文章定个基调。

太多的TensorFlow入门教程上来就是列了一系列国外的文献,视频。或者直接扔一堆代码,实在难以称之为入门。我们希望针对想学习TensorFlow的程序员来写一系列教程,聊一聊如何在基本掌握python的情况下,能够快速的使用TensorFlow这个工具解决实际问题。

首先,这个系列文章是之前的系列-《反爬与反反爬的奇技淫巧》的番外篇,

之所以是反爬系列的番外篇,因为我们主要是讨论如果使用TensorFlow解决爬虫中常见的问题,包括验证码,图片电话号码识别这类问题(这个系列主要是图像识别)。不过虽然跟反爬相关,但是这个系列依然可以独立来看,不做爬虫的朋友也不会受影响。

作为系列文章第一篇,先说说这个系列的定位,我们希望能给广大想转型机器学习(准确说是Tensorflow实现的神经网络)的程序员带来一些不一样的内容,我们不讲公式,只调方法,不聊文献,只说代码。不求最好,只求有用。正如下面这个自带bgm的表情:

那么我认为对于想要转型的程序员来说,做到以下四点就算基本转型成功了:

1.了解一定的机器学习原理(类似写web,我们要知道http的包结构,知道tcp的三次握手即可)

2.大方向上知道遇到什么问题该用什么机器学习算法来解决(成熟的大类就几个,很容易掌握)

3.熟悉主流算法的实现方案和用法,最好自己有一套对主流方案的封装(做到这一点其实已经很好了)

4.掌握整个从测试环境到生产环境的完整流程(通俗点就是会做能上线的产品,这一点很重要却最容易被忽略)

好了,扯了这么多题外话,我们正式开始:

一、准备部分

在我们动手写代码之前还是要有一些准备工作:

首先我们要对整个问题和解决方案有一个宏观的认知,另外为了方便,本文所有的提到机器学习的地方都可以等价为神经网络实现的监督学习这个领域,关于其他机器学习的领域不在本系列的讨论范围以内。(如果没入门的朋友可以忽略这句话)

1.知识的准备

先说说问题,我们今天要从一个最简单的验证码识别问题入手,我们看下我们的敌人:

就是这货,看着不复杂,没有太多杂点杂线。不过我们说他最简单,绝对不是说的这些,而是这个验证码我们是有生成代码的(Discuz是开源的)。这就意味着我们有无穷多的标注好的验证码图片(就是自带识别结果的图片)。这个对于机器学习来说简直就是无敌了。

聊完问题,我们再整体聊一聊Tensorflow和机器学习的解题思路。我们上学的时候,无论遇到什么问题总有一个解题思路,否则绝对是一头雾水。所谓隔行如隔山,很多时候是因为我们不了解那个行业解决一个常规问题的解题思路,那么机器学习的解题思路是什么呢?

当我们拿到一个问题决定用机器学习的方法解决他,我们要做以下几步:

1