1.def convert(imgf, labelf, outf, n):
2. f = open(imgf, "rb")
3. o = open(outf, "w")
4. l = open(labelf, "rb")
5.
6. f.read(16)
7. l.read(8)
8. images = []
9.
10. for i in range(n):
11. image = [ord(l.read(1))]
12. for j in range(28 * 28):
13. image.append(ord(f.read(1)))
14. images.append(image)
15.
16. for image in images:
17. o.write(",".join(str(pix) for pix in image) + "\n")
18. f.close()
19. o.close()
20. l.close()
21.
22.
23.convert("C:/Users/Administrator/Desktop/第二次模式识别实验/train-images-idx3-ubyte",\
24. "C:/Users/Administrator/Desktop/第二次模式识别实验/train-labels-idx1-ubyte",
25. "mnist_train.csv", 60000)
26.convert("C:/Users/Administrator/Desktop/第二次模式识别实验/t10k-images-idx3-ubyte", \
27. "C:/Users/Administrator/Desktop/第二次模式识别实验/t10k-labels-idx1-ubyte",
28. "mnist_test.csv", 10000)
29.
30.print("Convert Finished!")
1.#标准化
2.for i in range(len(train)):
3. train[i][1:] = (2*train[i][1:]-255.0)/255.0
4.for j in range(len(test)):
5. test[j][1:] = (2*test[j][1:]-255.0)/255.0
1.#选取样本
2.label = int((list(train[i]))[0])
3.#独热编码
4.y = np.mat(np.zeros((num_label, 1)))
5.y[label][0] = 1
1.#数据维度与样本个数
2.[num_train, devision] = train.shape
3.num_in = devision-1
4.num_hidden = 256
5.num_label = 10
6.
7.#定义网络结构并完成初始化
8.#定义权重矩阵
9.eta = 0.1 #学习率
10.max_iter = 50 #遍历训练集次数
11.v_ih = np.mat(np.random.rand(num_in, num_hidden)*0.01) #输入-隐含
12.w_hj = np.mat(np.random.rand(num_hidden, num_label)*0.01) #隐含-输出
13.
14.#定义偏置
15.grama_h = np.mat(np.zeros((num_hidden, 1))) #隐藏层
16.theta_j = np.mat(np.zeros((num_label, 1))) #输出层
1.#利用梯度下降进行网络训练
2.for iter in range(max_iter):
3. print('* * * * * * 第 ', iter+1, ' 遍训练集迭代* * * * * * ')
4. for i in range(num_train):
5. #选取样本
6. label = int((list(train[i]))[0])
7. #独热编码
8. y = np.mat(np.zeros((num_label, 1)))
9. y[label][0] = 1
10.
11. x = np.mat(train[i][1:]).T
12. alphas = v_ih.T * x
13.
14. #定义隐藏层输出
15. b_h = sigmoid(alphas-grama_h)
16.
17. #定义输出层输入
18. beta_j = w_hj.T * b_h
19.
20. #定义输出层输出
21. y_hat = sigmoid(beta_j-theta_j)
22.
23. #相关梯度计算
24. g = np.multiply(y_hat, 1-y_hat)
25. g = np.multiply(g, y-y_hat)
26. e = np.multiply(b_h, 1-b_h)
27. e = np.multiply(e, w_hj*g)
28.
29. #更新权重与偏置
30. w_hj = w_hj + eta*b_h*g.T
31. theta_j = theta_j - eta*g
32. v_ih = v_ih + eta*x*e.T
33. grama_h = grama_h - eta*e
1.#训练集正确率
2.true_train = 0
3.for i in range(num_train):
4. # 选取样本
5. label = int((list(train[i]))[0])
6. y = np.mat(np.zeros((num_label, 1)))
7. y[label][0] = 1
8.
9. #输出预测
10. x = np.mat(train[i][1:]).T
11. alphas = v_ih.T * x
12. b_h = sigmoid(alphas - grama_h)
13. beta_j = w_hj.T * b_h
14. y_hat = sigmoid(beta_j - theta_j)
15.
16. max_index = np.unravel_index(np.argmax(y_hat, axis=None), y_hat.shape)
17. label_pre = max_index[0]
18. if label_pre == label:
19. true_train = true_train+1
20.print('训练集正确率: ', true_train/num_train*100, '%')
1.import numpy as np
2.import pandas as pa
3.
4.'''
5.load_data:导入数据集
6.第一列为label,其余列为features
7.'''
8.def load_data(filename):
9. data = pa.read_csv(filename)
10. print('* * * * * * ' + filename + '文件加载完成 * * * * * *')
11. return data
12.
13.'''
14.label_show:将数字转化为文字标签
15.'''
16.def label_show(labels):
17. text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat',
18. 'sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']
19. return [text_labels[int(i)] for i in labels]
20.
21.'''
22.sigmoid:定义sigmoid函数
23.'''
24.def sigmoid(x):
25. return 1/(1+np.exp(-x))
26.
27.
28.
29.
30.
31.#导入数据
32.filename_train = 'D:/BP/venv/mnist_train.csv'
33.filename_test = 'D:/BP/venv/mnist_test.csv'
34.train = np.array(load_data(filename_train), dtype=np.float32)
35.test = np.array(load_data(filename_test), dtype=np.float32)
36.
37.
38.#选取部分样本
39.train = train[0:6000]
40.test = test[0:1000]
41.
42.
43.#标准化
44.for i in range(len(train)):
45. train[i][1:] = (2*train[i][1:]-255.0)/255.0
46.for j in range(len(test)):
47. test[j][1:] = (2*test[j][1:]-255.0)/255.0
48.
49.
50.
51.#数据维度与样本个数
52.[num_train, devision] = train.shape
53.num_in = devision-1
54.num_hidden = 256
55.num_label = 10
56.
57.
58.
59.
60.#定义网络结构并完成初始化
61.#定义权重矩阵
62.eta = 0.1 #学习率
63.max_iter = 50 #遍历训练集次数
64.v_ih = np.mat(np.random.rand(num_in, num_hidden)*0.01) #输入-隐含
65.w_hj = np.mat(np.random.rand(num_hidden, num_label)*0.01) #隐含-输出
66.
67.#定义偏置
68.grama_h = np.mat(np.zeros((num_hidden, 1))) #隐藏层
69.theta_j = np.mat(np.zeros((num_label, 1))) #输出层
70.#print(v_ih)
71.
72.#利用梯度下降进行网络训练
73.for iter in range(max_iter):
74. print('* * * * * * 第 ', iter+1, ' 遍训练集迭代* * * * * * ')
75. for i in range(num_train):
76. #选取样本
77. label = int((list(train[i]))[0])
78. #独热编码
79. y = np.mat(np.zeros((num_label, 1)))
80. y[label][0] = 1
81.
82. x = np.mat(train[i][1:]).T
83. alphas = v_ih.T * x
84.
85. #定义隐藏层输出
86. b_h = sigmoid(alphas-grama_h)
87.
88. #定义输出层输入
89. beta_j = w_hj.T * b_h
90.
91. #定义输出层输出
92. y_hat = sigmoid(beta_j-theta_j)
93.
94. #相关梯度计算
95. g = np.multiply(y_hat, 1-y_hat)
96. g = np.multiply(g, y-y_hat)
97.
98. e = np.multiply(b_h, 1-b_h)
99. e = np.multiply(e, w_hj*g)
100.
101. #更新权重与偏置
102. w_hj = w_hj + eta*b_h*g.T
103. theta_j = theta_j - eta*g
104. v_ih = v_ih + eta*x*e.T
105. grama_h = grama_h - eta*e
106.
107.
108.#训练集正确率
109.true_train = 0
110.for i in range(num_train):
111. # 选取样本
112. label = int((list(train[i]))[0])
113. y = np.mat(np.zeros((num_label, 1)))
114. y[label][0] = 1
115.
116. #输出预测
117. x = np.mat(train[i][1:]).T
118. alphas = v_ih.T * x
119. b_h = sigmoid(alphas - grama_h)
120. beta_j = w_hj.T * b_h
121. y_hat = sigmoid(beta_j - theta_j)
122.
123. max_index = np.unravel_index(np.argmax(y_hat, axis=None), y_hat.shape)
124. label_pre = max_index[0]
125. if label_pre == label:
126. true_train = true_train+1
127.print('训练集正确率: ', true_train/num_train*100, '%')
128.
129.#测试集正确率
130.true_test = 0
131.num_test = len(test)
132.for i in range(num_test):
133. # 选取样本
134. label = int((list(test[i]))[0])
135. y = np.mat(np.zeros((num_label, 1)))
136. y[label][0] = 1
137.
138.
139. x = np.mat(test[i][1:]).T
140. alphas = v_ih.T * x
141. b_h = sigmoid(alphas - grama_h)
142. beta_j = w_hj.T * b_h
143. y_hat = sigmoid(beta_j - theta_j)
144.
145. max_index = np.unravel_index(np.argmax(y_hat, axis=None), y_hat.shape)
146. label_pre = max_index[0]
147. if label_pre == label:
148. true_test = true_test+1
149.print('测试集正确率: ', true_test/num_test*100, '%')