4 机器学习实践之手写数字识别- 神经网络识别
来源:互联网 发布:人脸识别算法 开源 编辑:程序博客网 时间:2024/04/30 13:17
在 初步特征选择及线性识别篇中提到机器学习算法输入数据分为原始数据,特征工程(人工选择特征)及深度学习(机器自己计算)。 在前面采用了特征工程的方案,识别率也在85%左右。 识别率不是很高,这跟特征工程选择的工程不全有关,继续选择各种工程会比较麻烦,以后有机会再细研究。 之后打算从原始数据输入及深度学习方面着手来解决这个手写数字识别功能。
接下去的过程中主要功能都将尽量采用自己编写的代码来实现并演示。
BP神经网络的python代码实现见http://blog.csdn.net/net_wolf_007/article/details/52055718, 这里不再给点。
BP神经网络识别
结果说明
识别结果目前为87%,比前面的识别结果好些。不过准确率有待提高。
训练时间花得太长,40,000个数据训练10次,花了50分钟!这跟神经网络代码有并,需要优化。
下一步计划:
1. 优化代码
2. 提高识别率:
添加偏置,
添加dropout功能
再到深度学习功能识别
识别说明
这里采用4层网络结构来识别 NeuralNetWork([28*28, 256, 100, 10])。
参数个数:256*28*28 + 100*256 + 10*100 = 227,304个。
由于神经网络输出的是10个节点,每个节点输出一个数字。而我们的数据的输入只是一位数据,所以需要对他们进行转换。以此实现了两个工具函数:format_y及unformat_y.
对于输入数据也要做下预处理,把原来[0-256)的数据,转变成[0-1).
需要引用统计报告函数: from sklearn.metrics import classification_report
now_str() 返回当前时间格式化结果字符串
实现代码如下:
def format_y(data): y_tmp = np.zeros((len(data), 10)) for i in range(len(data)): y_tmp[i, data[i]] = 1 return y_tmpdef unformat_y(data): m = max(data) for j, val in enumerate(data): if val == m: return j return 11def load_source(filename): with open(filename, "r") as file: lines = file.readlines() return lines[1:]if __name__ == '__main__': # print("test neural network") np.set_printoptions(precision=3, suppress=True) data_lines = load_source("./data/train.csv") for i in range(len(data_lines)): data_lines[i] = data_lines[i].split(',') data_lines = np.array(data_lines).astype(np.int) x_data = data_lines[:, 1:]/256 #格式化数据 y_data = data_lines[:, 0] TEST = -2000 x_train = x_data[:TEST] y_train = y_data[:TEST] x_test = x_data[TEST:] y_test = y_data[TEST:] print(now_str(), "train len", len(x_train), "test len:", len(x_test)) print(new_str(), "start train...") network = NeuralNetWork([28*28, 256, 100, 10]) network.fit(x_train=x_train, y_train=format_y(y_train), learning_rate=0.1, epochs=10, shuffle=False) print(now_str(), "start train...") predicts = [] for i in range(len(x_test)): predict = network.predict(x_test[i]) predicts.append(unformat_y(predict)) predicts = np.array(predicts) ok_cnt = sum([1 for i in range(len(predicts)) if predicts[i] == y_test[i]]) print(ok_cnt, len(predicts), "%.3f" % (float(ok_cnt)/len(predicts))) print(classification_report(y_test, predicts))
输出结果:
/Library/Frameworks/Python.framework/Versions/3.4/bin/python3.4 /XXX/机器学习/number/NeuralNetwork.pyJul-28-16 <span style="font-family: Arial, Helvetica, sans-serif;">20:56</span><span style="font-family: Arial, Helvetica, sans-serif;">:06 train len 40000 test len: 2000</span>Jul-28-16 21:50:46 start train...1732 2000 0.866 precision recall f1-score support 0 0.84 0.95 0.90 197 1 0.94 0.96 0.95 225 2 0.80 0.88 0.84 190 3 0.88 0.78 0.83 198 4 0.90 0.83 0.87 226 5 0.80 0.75 0.77 162 6 0.94 0.91 0.92 216 7 0.97 0.87 0.92 202 8 0.80 0.79 0.80 179 9 0.78 0.89 0.83 205avg / total 0.87 0.87 0.87 2000Process finished with exit code 0
- 4 机器学习实践之手写数字识别- 神经网络识别
- 6 机器学习实践之手写数字识别-卷积神经网络实现
- 机器学习实践之手写数字识别 - 数据初识
- 2. 机器学习实践之手写数字识别 - 初步特征选择及线性识别
- 机器学习之 神经网络的实现(二)-->手写识别
- 机器学习实践之手写数字识别- 数据阶段分析总结
- 5 机器学习实践之手写数字识别 - 最终实现版本(97%识别率)
- 机器学习-神经网络-手写字体识别
- 【机器学习】k-近邻算法应用之手写数字识别
- 机器学习--knn手写数字识别系统
- 【机器学习 sklearn】手写数字识别 SVM
- 使用神经网络识别手写数字
- 利用神经网络识别手写数字
- 初识神经网络--识别手写数字
- 《机器学习实战二》K近邻学习之手写数字识别及检测识别错误率
- 机器学习(四):BP神经网络_手写数字识别_Python
- 机器学习笔记:tensorflow实现卷积神经网络经典案例--识别手写数字
- 神经网络与机器学习(二)——识别手写数字示例
- Dubbo logo服务框架 Dubbo
- RxJava 之 操作符
- Leetcode 39. Combination Sum (Medium) (cpp)
- mask匀光算法原理
- java的单例模式
- 4 机器学习实践之手写数字识别- 神经网络识别
- MySQL进阶(二)——子查询
- Http相关辅助类 HttpUtils
- Linux日志学习
- Ketama一致性哈希算法整理
- 导出oracle数据库所有表结构到excel中
- Json数据格式介绍、使用Android自带类库完成Json生成与解析
- Handler消息传递机制
- java中的static用法