在 初步特征选择及线性识别篇中提到机器学习算法输入数据分为原始数据,特征工程(人工选择特征)及深度学习(机器自己计算)。 在前面采用了特征工程的方案,识别率也在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_tmp
def unformat_y(data):
m = max(data)
for j, val in enumerate(data):
if val == m:
return j
return 11
def 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.py
Jul-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 205
avg / total 0.87 0.87 0.87 2000
Process finished with exit code 0