手写数字数据集MNIST介绍
为了保证完整性,从算法所用的训练数据讲起,训练数据是由MNIST手写数字组成的,MNIST数据集来自美国国家标准与技术研究所,由来自250个不同人手写的数字构成,其中训练集包含60000张图片,测试集包含10000张图片,每个图片都有其标签,图片大小为28 * 28。许多机器学习库提供了加载MNIST数据集的方法,这里使用keras库进行加载:
#,导入,keras 库 import keras #,加载数据 (train_dataset, train_labels), (test_dataset, test_labels),=, keras.datasets.mnist.load_data () 时间=train_labels np.array (train_labels, dtype=np.int32) #,打印数据集形状 打印(train_dataset.shape, test_dataset.shape) #,图像预览 for 小姐:拷贝范围(40): ,,,plt.subplot(10 4,,,,我+ 1) ,,,plt.imshow (train_dataset[我],提出=& # 39;灰色# 39;) ,,,plt.title (train_labels[我],字形大?10) ,,,plt.axis(& # 39;从# 39;) plt.show ()
基准模型,利用资讯算法识别手写数字
加载数据集后,我们尝试使用资讯分类器识别数字,在原始方法中,我们首先使用原始像素值作为特征,因此图像描述符的大小为28×28=784。
首先利用keras加载所有数字图像,为了了解数据训练的全部流程,我们将加载的训练数据集划分为训练数据集+测试数据集,每部分占比50%:
#,加载数据集 (train_dataset, train_labels), (test_dataset, test_labels),=, keras.datasets.mnist.load_data () 时间=train_labels np.array (train_labels, dtype=np.int32) #,将原始图像作为描述符 def raw_pixels (img): ,,,return img.flatten () #,数据打散 时间=shuffle np.random.permutation (len (train_dataset)) train_dataset, train_labels =, train_dataset (shuffle), train_labels (shuffle) #,计算每个图像的描述符,这里特征描述符是原始像素 时间=raw_descriptors [] for img  train_dataset拷贝: ,,,raw_descriptors.append (np.float32 (raw_pixels (img))) 时间=raw_descriptors np.squeeze (raw_descriptors) #,将数据拆分为训练和测试数据(各占,50%) #,因此,使用,30000,个数字来训练分类器,30000,位数字来测试训练后的分类器 partition =, int (0.5, *, len (raw_descriptors)) raw_descriptors_train, raw_descriptors_test =, np.split (raw_descriptors,,(分区)) labels_train, labels_test =, np.split (train_labels,[分区])
现在,我们就可以使用knn.train()方法训练资讯模型并使用get_accuracy()函数对其进行测试:
#,训练,KNN 模型 时间=knn cv2.ml.KNearest_create () knn.train (raw_descriptors_train, cv2.ml.ROW_SAMPLE, labels_train) #,测试,kNN 模型 时间=k 5 受潮湿腐烂,因此,,邻居,,dist =, knn.findNearest (raw_descriptors_test, k) #,根据真实值和预测值计算准确率 def get_accuracy(预测,,标签): ,,,acc =, (np.squeeze(预测),==,标签).mean () ,,,return acc *, 100 时间=acc get_accuracy(因此,labels_test) print(“准确性:{}“.format (acc)
我们可以看到当K=5时,资讯模型可以获得96.48%的准确率,但我们仍然可以对其进行改进,以获取更高性能。
改进模型1——参数K对识别手写数字精确度的影响
我们已经知道在资讯算法中,一个影响算法性能的重要参数就是K,因此,我们可以首先尝试使用不同的K值,查看其对识别手写数字精确度的影响。
为了比较不同K值时模型的准确率,我们首先需要创建一个字典来存储测试不同K值时的准确率:
得到collections import defaultdict 时间=results defaultdict(列表)
接下来,计算knn.findNearest()方法,改变K参数,并将结果存储在字典中:
#, K 取值范围为,(1,9) for k 拷贝范围(1,10): ,,,受潮湿腐烂,,结果,,邻居,,dist =, knn.findNearest (raw_descriptors_test, k) ,,,acc =, get_accuracy(因此,labels_test) ,,,print (“, {}“.format (“% .2f", %, acc)) ,,,结果[& # 39;50 & # 39;].append (acc)
最后,绘制结果:
ax =, plt.subplot (1, 1, 1) ax.set_xlim (0, 10) 时间=dim np.arange (1, 10) for key 结果:拷贝 ,,,ax.plot(昏暗的,,结果(关键),线型=& # 39;——& # 39;,,标志=& # 39;o # 39;,,标签=?0%”) ,,,, plt.legend (loc=& # 39; upper 左# 39;,,title=?, training") plt.title (& # 39; Accuracy of 从而K-NN model varying k # 39;) plt.xlabel (“number  of k") plt.ylabel (“accuracy") plt.show ()Python-OpenCV中如何利用资讯算法识别手写数字