上篇文章提了一下模型,有点意思同学让举个例子写篇,拖了几天,今天晚上抽空补上。
我们都知道,计算机它只会计算,其它的能力都是我们赋予给它的,它只是按照我们的步骤去执行而已。
比如机器学习,关于它的定义有很多,不过也有很多共同点,里面都强调了经验还有数据;
我个人觉得很多先进的方法或者理念都是来源于人的大脑,比如人是如何学习的,这是一个很有意思的问题,尤其是刚出生的小孩,从一无所知,是如何慢慢建立起他的认知,认识生活中各种各样的动物等等。
理论和概念总是比较抽象的,通过实例来会更好理解,不过话又说回来,真正的理解就是能够对各种实例抽象出它们的共同点,这样才能推广到其它。
下面开始正文。
上篇的内容最后一个案例代码,其实来自官方的手写数字识别案例教程,我自己基于里面的内容自己删减了一些。
下面是其链接:
https://scikit-learn.org/stable/auto_examples/classification/plot_digits_classification.html
不过文章中代码可能还是比较难理解,主要里面没有对数据集进行讲解。
这里主要讲一下里面的数据集,sklearn自带了很多数据集,在安装包的data里面,就有手写数字识别数据集。
虽说是数字识别,不过这个数据集里面并没有实际图片。这个数据集只是一个csv文件,
打开文件可以看见一共有1797行,65列,每一行前64个数字表示一张8*8图片的数据,也就是图片的特征值;
最后一个数字叫做标签,就是这个图片的真实值;
大概清楚了里面的数据集后,下面看看其中的一些代码。
这里的数字识别核心的可以分为下面几步:
第一步:创建分类器模型
简单理解,可以看作一个映射函数,传入一个数据,就可以返回一个结果给你。
# 创建分类器
clf = svm.SVC(gamma=0.001)
第二步:准备训练数据集和测试数据
这些数据集前面讲了,都是有正确答案的。
# 分割数据集,训练数据和测试数据各50%
X_train, X_test, y_train, y_test = train_test_split(
data, digits.target, test_size=0.5, shuffle=False
)
第三步:训练分类器模型
通过上面的数据训练后,分类器就可以用来进行数字图片识别了,不过识别前都会通过测试数据测试一下,先看看准确率怎么样,确定效果还不错,就可以用来测试没有见过的数字图片了。
# 训练模型
clf.fit(X_train, y_train)
# 预测测试集
print(X_test[:1])
predicted = clf.predict(X_test[:1])
第四步:识别未见过的图片
# 预测一张新图片
img = cv2.imread('1.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.resize(img,(8,8))
data = img.reshape(64,)
r= clf.predict(data)
print(r)
注:第四步如果你随意拿一张图片进来识别,大概率都是识别不出来的,第一个可能你的特征数量与模型特征数量不一致(不过我上面的代码已经进行了处理),第二个这个图片与训练的数据偏差很大。
实际训练的图片。
如果将下面的数据(和训练的数据风格类似)转换成图片,再拿去识别是没问题的。
[0,0,7,15,13,1,0,0,0,8,13,6,15,4,0,0,0,2,1,13,13,0,0,0,0,0,2,15,11,1,0,0,0,0,0,1,12,12,1,0,0,0,0,0,1,10,8,0,0,0,8,4,5,14,9,0,0,0,7,13,13,9,0,0]
相信通过上面一个例子,你可能大概知道这个流程了,不过中间的很多细节相信你还是很懵的,通过要给函数,传入数据,就可以训练出一个分类器,它到底是怎样训练的呢?
要想完全理解一个内容,造个简单的轮子是很有效且有必要的,如果你能自己做出一个同样的功能,那你大概率是明白其原理的。
我没有看过那些方法源码,不过一般的像上面的这种监督学习(也就是提供了答案的),其实后面应该就是相似度匹配的过程。
有一车牌,经过过预处理,并裁剪出对应的每个字符。
如何输入其中一张图片的名称,告诉你这个图片的数字是几呢?
实现过程:
1.准备好数据:
这是我很早之前下载的一个手写数字数据,里面有大量的图片,我处理了一下,每个文件夹中放了对应的20张图片。
2.从图片文件夹中将所有数字图片读取出来
这里只是做了数字图片的读取,所以只能识别数字。
3.定义一个单张图片匹配的方法。
4.最后找到最匹配的图片
实际测试:
以上这个方法识别会比较慢,因为会不断通过IO口打开图片,这个是非常影响速度的,可以像自带的案例一样,将所有数据变成数字导入到一个csv文件中,同时打上标签,处理速度应该会更快,这里的匹配代码似乎看不出什么机器学习,如果封装一下,应该会差不多吧。
刨除概念,仅仅使用其实还是很简单的,同样还有神经网络的,不过机制不同,感兴趣可以自己了解。
上面的内容只是个人理解,不保证正确性。