原理见上一节
读入数据集:
# load the mnist test data CSV file into a list
test_data_file = open("mnist_dataset/mnist_test.csv", 'r')
test_data_list = test_data_file.readlines()#用列表进行储存,每个元素代表一行
test_data_file.close()
打印二维化数字组成的字符:
all_values = test_data_list[1].split(',')
print(len(all_values))
将第一行按 ‘ , ’ 拆分并储存到变量中:结果为785
因为第一个字符为标签,代表是数字几,其余为28*28=784
用asfarray将储存的文本字符串转换为实数数字,并创建28*28的数组列表。
image_array = numpy.asfarray(all_values[1:]).reshape((28,28))
matplotlib.pyplot.imshow(image_array, cmap='Greys', interpolation='None')
准备mnist数据集
为了加速神经网络的训练,将数据范围进行缩放,将原来的0-255缩放至0.01到1的范围。
即:0对应0.01,255对应1
通过 x / 255 × 0.99 + 0.01 x/255\times0.99+0.01 x/255×0.99+0.01 完成
scaled_input = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
print(scaled_input)
设计神经网络
目标:根据输入的字符串识别表示的数字
相当于做一个类别为10的分类问题,故设计的神经网络共10个输出节点。
784个输入节点,100个隐藏层节点,10个输出节点。
通过激活函数来进行分辨,并0.01和0.99来代替0和1。
onodes = 10#设置输出节点数为10
targets = numpy.zeros(onodes) + 0.01 #设置目标列表
targets[int(all_values[0])] = 0.99 #对目标列表赋值,对应数字几的那一列为0.99,其余为0.01
完成的神经网络:
import numpy
import pylab
import scipy.special
import matplotlib.pyplot
# neural network class definition
class neuralNetwork:
#初始化:设置节点数、权重赋值、设置激活函数
def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
# set number of nodes in each input, hidden, output layer
self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes
# link weight matrices, wih and who
# weights inside the arrays are w_i_j, where link is from node i to node j in the next layer
# w11 w21
# w12 w22 etc
self.wih = numpy.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes))#随机赋初始权重w_i
self.who = numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes))#随机赋初始权重w_h
# learning rate
self.lr = learningrate
# activation function is the sigmoid function
self.activation_function = lambda x: scipy.special.expit(x)#设置激活函数
pass
#定义训练神经网络的执行函数,1、正向求输出和期望的误差;2、反向更新激活函数
def train(self, inputs_list, targets_list):
# convert inputs list to 2d array
inputs = numpy.array(inputs_list, ndmin=2).T
targets = numpy.array(targets_list, ndmin=2).T
hidden_inputs = numpy.dot(self.wih, inputs)#隐藏层用输入求和
hidden_outputs = self.activation_function(hidden_inputs)#结果用激活函数
final_inputs = numpy.dot(self.who, hidden_outputs)
final_outputs = self.activation_function(final_inputs)
output_errors = targets - final_outputs#计算输出层误差
# hidden layer error is the output_errors, split by weights, recombined at hidden nodes
hidden_errors = numpy.dot(self.who.T, output_errors)
#更新隐藏层与输出层权重
self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)),
numpy.transpose(hidden_outputs))
#更新输入层与隐藏层权重
self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)),
numpy.transpose(inputs))
pass
# query the neural network
def query(self, inputs_list):
# convert inputs list to 2d array
inputs = numpy.array(inputs_list, ndmin=2).T
# calculate signals into hidden layer
hidden_inputs = numpy.dot(self.wih, inputs)
# calculate the signals emerging from hidden layer
hidden_outputs = self.activation_function(hidden_inputs)
# calculate signals into final output layer
final_inputs = numpy.dot(self.who, hidden_outputs)
# calculate the signals emerging from final output layer
final_outputs = self.activation_function(final_inputs)
return final_outputs
测试神经网络
- 用100条数据进行训练
- 用10条数据进行测试
#设置并创建神经网络参数
input_nodes = 784
hidden_nodes = 100
output_nodes = 10
learning_rate = 0.3
n = neuralNetwork(input_nodes,hidden_nodes,output_nodes, learning_rate)
# 训练神经网络:用100个数据作为训练集,加载后循环训练集每一个,并将每个都处理输入和目标值,带入神经网络进行训练
training_data_file = open("mnist_train_100.csv", 'r')
training_data_list = training_data_file.readlines()
training_data_file