用Keras处理自己的数据:制作自己的Keras数据集

前言

在刚开始接触Keras时,相信大家都实践过诸如MNIST手写数据集、CIFAR系列数据集,这些数据集的特点是已经为用户打包封装好了数据。在Keras环境下只要load_data即可实现导入。但是实际情况是,为了某一个项目我们不可能总是找到相应的打包好的数据集供使用,这时候自己建立一个dataset就十分重要。然而针对这方面,官方手册给出的知道不是很明确;而在网上搜索相关内容,得到的答案也不是很通俗易懂,不太适合深度学习的初学者阅读,即使有现成的代码(如:github上),放在自己的运行环境下也不见得能用。下面我想为广大初学者介绍一下如何创建与导入自己的数据集,这样就不用拘泥于Kears提供的现成datasets来进行训练了。这里我们以captcha验证码识别项目为例。


第一步:寻找和建立样本

captcha本身提供了用户自定义验证码生成API,利用它,我们可以轻松的建立样本。样本数目不要太少,视项目具体情况而定(本项目一般50000个左右)。网上有很多资源关于如何用captcha生成*.png的验证码,这里就不再赘述。


第二步:为样本打好标签(LABEL)

得到了样本后我们下面一步要做的就是给样本打标签。作为一个监督学习的项目,我们有义务告诉计算机什么样的结果是正确的,什么样的结果是错误的。如果说X_train为样本的话,我们这里要做的便是得到y_train。打标签的方法有很多,比如建立*.txt文件对应样本一一做标签。Concretely, 本项目中,captcha在随机生成验证码 的同时已经将相应验证码样本命名为了代表其含义的png文件前缀(下图所示),这非常利于我们做标签。

用Keras处理自己的数据:制作自己的Keras数据集_第1张图片


训练这个项目的最简单方法就是建立n个神经网络并训练机器使其能够分辨第n位字符(n为验证码长度)。例如要训练机器识别第一位字符,我们要做的便是检索每个样本文件名,将其对应的ASCII码提取出来,经过处理①并写入*.txt中,这样就得到标签了。关于如何提取字符ascii,可自行网上搜索,相关资源很丰富。

①处理:将26个字母编码,比如:0代表A,1代表B,2代表C...........这样keras之后就能通过one_hot编码了。

第三步:导入数据集

这里,我们通过numpy和PIL两个库。

先说导入图片,这里我们的图片格式是RGB 60*160 png。单张图片灰度化和导入使用PIL(opencv也可以)。因为我们需要导入整个样本库,所以需要用append函数把新的单张图片矩阵加到整个矩阵集合里,这之前当然要定义一个数组来作为集合,如images = []。之后再使用X = numpy.array(images),这样便得到了numpy格式的数据集。导入完毕后,我们可以通过print(X.shape)看看导入是否正确,例如我们导入了30000张60*160的图片,应得到:(30000, 60, 160)

然后是导入标签,即y。直接y = numpy.loadtxt('*.txt')即可。之后print (y.shape)应得到:(30000,),注意样本数和标签数一定要对应。


第四步:得到训练集和测试集(X_train,X_test,y_train,y_test)

此项目,我们可以使用sklearn库中的train_test_split函数将整个数据集分成训练集和测试集(X_train,X_test,y_train,y_test),此函数还有一个优点是会打乱顺序,比较好。关于该函数用法可自行百度。提供个参考:X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state= 30)


通过上述四步,我们便人工完成了如下函数功能:(X_train, y_train), (X_test, y_test) = mnist.load_data()

之后reshape下X_train,X_test,y_train,y_test,搭建网络,训练即可。


源码:https://github.com/YingjieZhang31/Captcha-Verification-Code-Recognition

你可能感兴趣的:(用Keras处理自己的数据:制作自己的Keras数据集)