机器学习生成CRM表单 - 1.模型训练
Contents
表单自动生成 机器学习 模型训练
数据获取
按照HTML表单元素分类,进行截图。因为这里不是目标识别,只是分类,所以自动生成作用不太大。
目录按照如下编排,每个类别建立一个文件夹,里面放相应的截图图片,方便后续处理,对图片形状大小不做要求。
1 | main_directory/ |
数据输入处理
图像预处理
将图片文件预处理后生成浮点数张量,步骤如下:
- (1)读取图像文件
- (2)将文件解码为RGB像素网格
- (3)将像素网格转换为浮点数张量
- (4)将像素值(0-255)缩放到(0-1)区间
可以使用python手写这些代码,keras有个预处理函数,可以实现上述步骤。
https://keras.io/api/preprocessing/image/#flow_from_directory-method
我们这样使用
1 | # create a data generator |
target_size
参数会对图片进行预处理,处理为目标大小。这里有个问题,因为我们的html表单元素大部分是长方形的,而这个图像处理是不保持宽高比的,所以元素的形状会改变为正方形,必然会造成信息丢失。
其实很多人发现这个问题并提了PR
但是3年过去没和进去。(有空可以提个PR增加这个功能)
所以目前解决方案需要自己处理。
ImageDataGenerator 保持宽高比 扩充图片为正方形
参考这篇文章,把填充的内容改为白色
1 | import os |
打印出处理后的图片
1 | def show_batch(image_batch, label_batch): |
训练
把训练方案都列出来
1.全连接训练模型
1 | # 方法一:全连接的训练 |
最基础的入门训练模型
2.卷积神经网络训练模型 CNN
1 | model = models.Sequential() |
上面两个模型的介绍可以参考《python》深度学习
这本入门书,介绍的很详细。
3.迁移学习训练模型
本来直接照着《python深度学习》,一步一步进行搭建model,进行训练,但是比较慢且效果不太好。
然后在谷歌的在线 tf.js 图片分类的demo页试用了下,
发现训练超级快而且准确,这是什么原因呢?
在github打开了网页源码:
发现其用了训练好的模型 mobilenet
。
1 | import * as mobilenet from '@tensorflow-models/mobilenet'; |
这才想起来用的是 模型复用-迁移学习。
迁移学习
迁移学习介绍
以人打比方,训练好的模型,相当于一个能熟练掌握C语言的程序员,迁移学习,就是在这个模型上训练新的内容,相当于让这个有丰富C语言开发经验的人去新学习js,肯定会比没有编程经验的人学得快,即比新写模型训练快而准。
tf 的机器学习训练教程
https://www.tensorflow.org/tutorials/images/transfer_learning_with_hub
注意tf的版本要使用比较新的版本,否则会报错,使用tf-nightly。
从tfpub引入训练好的模型, headless model, 就是没有最后分类层的。方便我们迁移训练。
1 | feature_extractor_url = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/2" |
建立模型
1 | model = tf.keras.Sequential([ |
其实就是加了个最后的分类,这个例子里 最后是分为3类
训练
1 | predictions = model(image_batch) |
虽然看起来最后的模型只有简单的两层,但训练效果却很好
保存模型
1 | import time |
使用保存的模型1
2reloaded = tf.keras.models.load_model(export_path)
reloaded_result_batch = reloaded.predict(image_batch)