一、步骤
第一步:定义输入层——>隐层——>输出层——>权重——>学习率——>激活函数。
第二步:定义训练网络(计算误差、更新权重)
第三步:定义查询网络(个人感觉就是通过神经网络预测的结果)
第四步:定义主函数(包括参数的取值,训练次数,数据的输入)
二、代码
第一步导入包——>定义一个叫NeuralNetwork的类——>初始化函数__init__。
在这个初始化函数中,我们看到了一些参数(输入层,隐层,输出层,权重,学习率),其中权重(拿输入层和隐层之间的为例),numpy.random 表示随机收取,其中函数 normal 有三个参数(期望,标准差,shape),其中这个shape我认为是一个矩阵。所以W-ih=随机从(方差=0,标准差=
inputs = numpy.array(inputList,ndmin=2).T:将输入的数据生成一个二维数组,T应该是转秩,inputs=Xi (根据书里)
targets = numpy.array(targetList,ndmin=2).T:将目标结果数据生成一个二维数组,T应该是转秩,targets=Yi
hiddenInput = numpy.dot(self.w_ih, inputs):表示 hiddenInput = W-ih * inputs (隐层输入等于权重乘以输入层输入,即WX)
hiddenOutput =self.activate(hiddenInput): 通过激活函数判断hiddenInput ,例如输出0、1
finalInput = numpy.dot(self.w_ho, hiddenOutput):表示finalInput = W_ho * hiddenOutput
finalOutput =self.activate(finalInput):通过激活函数判断finalInput ,例如输出0、1
计算误差和权重更新
下面结合书里的来解释一下这些计算过程
第三步:定义查询网络查询网络其实就是说return一个通过神经网络预测出来的输出值,finalOutput. 其他过程解释跟训练网络的一样
第四步:定义主函数
这里主要就是参数的设置接下来读取我们的训练数据,因为我们的数据是一行数据就是一张图片的数据,每一行开头的第一个数据就是我们的目标结果,即Yi。所以我们读取文件要一行一行的读取,我们来看看这个文档大家就明白了。
再来设置训练次数(trainTimes )这里的训练次数可以根据自己尝试多设置其他数值,这里我设置了5次,我也尝试了其他数值,一开始的准确率为0.45.如果训练次数过小,就会导致欠拟合,过大即过拟合。大家可以自己适当的修改一下参数,多跑几次对比不同数值下的准确率。
qbar = tqdm.tqdm(total=5):tqdm函数表示设置进度条,其中进度条总长为5 for e in range(trainTimes): qbar.update(1) :用e去遍历循环个训练次数,每次进度条读取更新的步长为1,即在总长为5下,每进一步代表训练次数更加一次。
tqbar = tqdm.tqdm(total=100):tqdm函数表示设置进度条,其中进度条总长为100 for record in fileData: tqbar.update(10) :原理跟上面的一样,但是这里的进度条更新步长我设置了10,因为在调参的时候我一开始设置 tqbar.update(5) 然后准确率比1还低,我就发现了这里进度条的步长跟准确率也有关系,试了好多的数据最后确定了10,准确率也来到0.54
这里我就避重就轻,因为有些我也没看太明白
imageValue = record.split(','):将数值用逗号分隔开
inputs = numpy.asfarray(imageValue[1:]) /255.0 *0.99 +0.01:这里很细节,就是前面用逗号分隔开数据,然后这里的函数asfarray就是起到移除符号的作用。imageValue[1:]因为这里是输入数据,即x,我们就取每行第二个数值到最后,因为第一个是Y值,前面有说,最后除以255*0.99+0.01,就是图像的那个啥值最高是255,将训练数据的数值按比例缩小到0-1的范围内,经过乘以0.99后加0.01的处理后,编程0.01-0.99的数据
这里我不太懂为啥要处理这里targets,即y,所以说我就避重就轻嘻嘻
targets = numpy.zeros(outputNodes) +0.01:使用0填充长度为target_nodes的数组,并将其中所有值+0.01 targets[int(imageValue[0])] =0.99:将训练数据中第一个值(训练数据的正确结果)对应的位置的值改为0.99 neuralTest.train(inputs, targets):然后训练
训练完,接下来就是测试读取文件,处理,跟上面的训练网络一样,这里的answer就是直接取Y值,然后打印出来。原理就是用查询出来的数值跟这个Y对比,一样则预测正确。
最后打印出预测结果,用实际结果跟目标结果对比,如果相等,就返回1,否则返回0,然后用返回的数值相加起来除以全部数值的个数,这个比值就是我们的准确率。最后准确率比较低的原因,我认为是我们的训练集不够大。
如果有理解错误的求大神指点嘻嘻
网友评论