当前位置:   article > 正文

神经网络学习笔记1——BP神经网络原理到编程实现(matlab,python)_input_train = input(1:190,:)

input_train = input(1:190,:)

先表达一下歉意吧

不好意思拖了这么久才整理,弄完考试的事情就在研究老师给安排的新任务,一时间还有点摸不到头脑,就直接把百度网盘链接放在视频下面了但是最近才发现那个链接发出来了看不到,所以现在有时间了就来重新整理一下!

(发了之后看好多人管我要,我还奇怪,原来是没法出去o(╥﹏╥)o)


目录

先表达一下歉意吧

下面是视频地址和代码数据

BP神经网络原理及编程实现_哔哩哔哩_bilibili

1.bp神经网络原理

        1.1前向传播

        1.2反向传播

        1.3 测试模型

2.两个项目的matlab实现和python实现

        2.1语音数据分类预测

                matlab实现如下

        2.2 蝴蝶花分类预测

                2.2.1matlab程序如下

                 2.2.2 python实现和框架如下

3.心得分享


下面是视频地址和代码数据

BP神经网络原理及编程实现

BP神经网络原理及编程实现_哔哩哔哩_bilibili

python,matlab代码,还有数据集放在这里了

链接:https://pan.baidu.com/s/1-onLcVrPR7csFWJkxhIMsg
提取码:j3z6

感觉有帮助的话,可以点个赞支持一下,真的每次被赞的时候还是挺开心的哈哈(*^▽^*)

1.bp神经网络原理

        bp神经网络主要由三部分组成,分别是前向传播,反向传播,测试模型。其中前向传播主要是计算模型当前的预测结果,反向传播是对模型进行修正得到能达到预测效果的模型,测试模型是看我们最后通过反向传播得到的模型能否识别出我们想要的分类,好下面我来分别介绍他们的原理~

        1.1前向传播

        我就拿一个三层的网络来举例说明,同时也是我后面讲得第一个项目,这样理论实践相结合,比较方便理解。

这是一个基础的三层神经网络,按顺序分别是输入层,隐藏层,输出层,我们先按照一个节点来看,这样方便理解,我把传播的公式放在下面

其中a1作为输入的一个特征,在这里我们把特征数字化表示成一个数字

w代表权重,其实按我理解,就是a1占多少分量,这个特征对我们识别目标帮助有多大

b是一个偏差,方便我们对a2也就是下一个节点的值进行调整 

z代表节点激活,这里用到了归激活函数sigmoid,对节点进行激活,按照我的理解sigmoid是一个归一化函数他要把归一化到0-1之间,方便收敛和标签值比较,判断误差,这样通过缩小误差来达到模型的预测功能。

最后的得到的z3是前向传播的结果也就是我们模型预测结果分类标签。

        1.2反向传播

        得到了前向传播的结果,相当于是一组用来训练的数据,我们要通过这次前向传播得到的结果和我们的分类标签相减得到误差。

        我们希望缩小误差让我们的模型有更好的训练效果,这时候就要用到反向传播们这里用的是梯度下降法,让误差按照梯度的方向减小,最后训练打到我们预期的效果。

         还是用我们刚才的神经网络

        

        这里是做的一个链式求导,可以左右对应着看,因为E对b直接进行求导得不到结果,通过链式展开,配合着左边的公式,其中每一部都是可以求出来的,结果如红字表示,这里感觉文字不太方便表述,要是实在还不清楚,就看一下最前面分享的视频,里面讲解的还是比较细致的

        然后求w1,w2同理

         这样我们就能通过反向传播的到,b1,b2,w1,w2的变化率,然后和最开始随机得到的w和b进行运算就得到了我们通过这一组数据训练后的结果,在这里最重要的就是权重和偏差的数值了!

        1.3 测试模型

        理解了前面两个测试模型其实就很好理解了,这里其实主要也是前向传播,我们用训练好的模型对测试集进行目标分类,在通过

        正确预测/训练集总数 * 100% = 模型的准确率

2.两个项目的matlab实现和python实现

        对于这个程序要是看不懂的地方我记得在视频中有逐行对应的讲解,这里我们就大致标注一下

        2.1语音数据分类预测

                matlab实现如下

  1. %% 清空环境变量
  2. clc
  3. clear
  4. %% 训练数据预测数据提取及归一化
  5. %1.下载四类语音信号
  6. load data1 c1
  7. load data2 c2
  8. load data3 c3
  9. load data4 c4
  10. %2.四个特征信号矩阵合成一个矩阵
  11. data(1:500,:)=c1(1:500,:);
  12. data(501:1000,:)=c2(1:500,:);
  13. data(1001:1500,:)=c3(1:500,:);
  14. data(1501:2000,:)=c4(1:500,:);
  15. %3.从12000间随机排序
  16. k=rand(1,2000);%生成0-1之中2000个随机数
  17. [m,n]=sort(k);%对k进行从从小到大的排序,序结果放入m(1*2000)向量,n(1*2000)为原数据对应的索引号
  18. %4.输入输出数据
  19. input=data(:,2:25);%取出data225列数据构成新矩阵input
  20. output1 =data(:,1);%取出data中第一列数据构成矩阵output1
  21. %5.把输出从1维变成4
  22. for i=1:2000
  23. switch output1(i)
  24. case 1
  25. output(i,:)=[1 0 0 0];
  26. case 2
  27. output(i,:)=[0 1 0 0];
  28. case 3
  29. output(i,:)=[0 0 1 0];
  30. case 4
  31. output(i,:)=[0 0 0 1];
  32. end
  33. end
  34. %6.随机提取1500个样本为训练样本,500个样本为预测样本
  35. input_train=input(n(1:1500),:)';
  36. output_train=output(n(1:1500),:)';
  37. input_test=input(n(1501:2000),:)';
  38. output_test=output(n(1501:2000),:)';
  39. %7.输入数据归一化
  40. [inputn,inputps]=mapminmax(input_train);%归一化到[-1,1]之间,inputps用来作下一次同样的归一化
  41. %%8.网络结构初始化,设置节点输入层,隐藏层,输出层
  42. innum=24;
  43. midnum=25;%选择多少个节点才比较好?
  44. outnum=4;
  45. %9.权值初始化
  46. w1=rands(midnum,innum);%随机给定隐藏层和是输入层间的初始神经元权重 W1= net. iw{1, 1};
  47. b1=rands(midnum,1);%中间各层神经元阈值 B1 = net.b{1};
  48. w2=rands(midnum,outnum);%中间层到输出层的权值 W2 = net.lw{2,1};
  49. b2=rands(outnum,1);%输出层各神经元阈值 B2 = net. b{2}
  50. %10.权重,偏差重新赋值
  51. w2_1=w2;w2_2=w2_1;%把w2中的值分别配给w1w2
  52. w1_1=w1;w1_2=w1_1;
  53. b1_1=b1;b1_2=b1_1;
  54. b2_1=b2;b2_2=b2_1;
  55. %11.学习率
  56. xite=0.1 %权值阈值更新
  57. alfa=0.01; %学习速率,这里设置为0.01
  58. %%12 网络训练
  59. %(1)大循环
  60. for ii=1:10
  61. E(ii)=0;
  62. for i=1:1:1500
  63. %% (2)网络预测输出
  64. x=inputn(:,i);
  65. % (3)隐含层输出
  66. for j=1:1:midnum
  67. I(j)=inputn(:,i)'*w1(j,:)'+b1(j);
  68. Iout(j)=1/(1+exp(-I(j)));
  69. end
  70. % (4)输出层输出
  71. yn=w2'*Iout'+b2;
  72. %%(5) 权值阀值修正
  73. %计算误差
  74. e=output_train(:,i)-yn;
  75. E(ii)=E(ii)+sum(abs(e));
  76. %计算权值变化率
  77. dw2=e*Iout;
  78. db2=e';
  79. for j=1:1:midnum
  80. S=1/(1+exp(-I(j)));
  81. FI(j)=S*(1-S);
  82. end
  83. for k=1:1:innum
  84. for j=1:1:midnum
  85. dw1(k,j)=FI(j)*x(k)*(e(1)*w2(j,1)+e(2)*w2(j,2)+e(3)*w2(j,3)+e(4)*w2(j,4));
  86. db1(j)=FI(j)*(e(1)*w2(j,1)+e(2)*w2(j,2)+e(3)*w2(j,3)+e(4)*w2(j,4));
  87. end
  88. end
  89. %(6)权值阈值更新,学习率在这用
  90. w1=w1_1+xite*dw1';
  91. b1=b1_1+xite*db1';
  92. w2=w2_1+xite*dw2';
  93. b2=b2_1+xite*db2';
  94. w1_2=w1_1;w1_1=w1;
  95. w2_2=w2_1;w2_1=w2;
  96. b1_2=b1_1;b1_1=b1;
  97. b2_2=b2_1;b2_1=b2;
  98. end
  99. end
  100. %%13 语音特征信号分类
  101. inputn_test=mapminmax('apply',input_test,inputps);
  102. for ii=1:1
  103. for i=1:500%1500
  104. %隐含层输出
  105. for j=1:1:midnum
  106. I(j)=inputn_test(:,i)'*w1(j,:)'+b1(j);
  107. Iout(j)=1/(1+exp(-I(j)));
  108. end
  109. fore(:,i)=w2'*Iout'+b2;
  110. end
  111. end
  112. %% 14结果分析
  113. %(1)根据网络输出找出数据属于哪类
  114. for i=1:500
  115. output_fore(i)=find(fore(:,i)==max(fore(:,i)));
  116. end
  117. %(2)BP网络预测误差
  118. error=output_fore-output1(n(1501:2000))';
  119. %画出预测语音种类和实际语音种类的分类图
  120. figure(1)
  121. plot(output_fore,'r')
  122. hold on
  123. plot(output1(n(1501:2000))','b')
  124. legend('预测语音类别','实际语音类别')
  125. %画出误差图
  126. figure(2)
  127. plot(error)
  128. title('BP网络分类误差','fontsize',12)
  129. xlabel('语音信号','fontsize',12)
  130. ylabel('分类误差','fontsize',12)
  131. %print -dtiff -r600 1-4
  132. k=zeros(1,4);
  133. %找出判断错误的分类属于哪一类
  134. for i=1:500
  135. if error(i)~=0 %~表示非也就是error不等于0是
  136. [b,c]=max(output_test(:,i));
  137. switch c
  138. case 1
  139. k(1)=k(1)+1;
  140. case 2
  141. k(2)=k(2)+1;
  142. case 3
  143. k(3)=k(3)+1;
  144. case 4
  145. k(4)=k(4)+1;
  146. end
  147. end
  148. end
  149. %找出每类的个体和
  150. kk=zeros(1,4);
  151. for i=1:500
  152. [b,c]=max(output_test(:,i));
  153. switch c
  154. case 1
  155. kk(1)=kk(1)+1;
  156. case 2
  157. kk(2)=kk(2)+1;
  158. case 3
  159. kk(3)=kk(3)+1;
  160. case 4
  161. kk(4)=kk(4)+1;
  162. end
  163. end
  164. %正确率
  165. rightridio=(kk-k)./kk

  这个我在程序中进行了比较详细的备注,数据集在前面网盘链接中可以获取,这个项目的python文件是我完全仿照matlab中写了,流程基本一样,不太具有再利用价值,所以可以看下视频中的思路和讲解。

        2.2 蝴蝶花分类预测

        这里需要注意的是这里数据集是已经打乱好的数据,python中不在是墨守成规的仿照matlab文件,而是写好了一个框架,虽然是打乱的数据集,但是也配备了随机抽取数据的函数,方便大家拿了就用!!

这里用的改进的bp神经网路,动量下降法进行加速收敛大致步骤原理公式如下

Step 1 :初始化数据,设定各层节点数和学习效率等值。
Step 2 :输入层 FA 输入样品,计算出隐层 FB 活动。
b(ki)=logsig(a*V(:,ki)+Pi(ki))
Step 3 :计算出输出层 FC 活动。
c(kj)=logsig(b*W(:,kj)+Tau(kj))
Step 4 :网络输出和期望输出相比较,计算出输出层 FC 的错误。
d=c.*(1-c).*(ck-c)
Step 5 :反传,计算出隐层 FB 的错误。
e=b.*(1-b).*(d*W')
Step 6 :修改 FC 层和 FB 之间的权值 wij
DeltaW(ki,kj)=Alpha*b(ki)*d(kj)+Gamma*DeltaWOld(ki,kj)
W=W+DeltaW
Step 7 :修改 FA 层和 FB 之间的权值 vhj
DeltaV(kh,ki)=Beta*a(kh)*e(ki)
V=V+DeltaV
Step 8 :修改偏差。
重复 Step 2 Step 8 ,直到输出层 FC 的错误足够小。

                2.2.1matlab程序如下

  1. clc %清屏
  2. clear all; %删除 workplace 变量
  3. close all; %关掉显示图形窗口
  4. format long
  5. % Initial
  6. % parameters for the NN structure
  7. h=4;
  8. i=3;
  9. j=3;
  10. Alpha=0.9;
  11. Beta=0.5;
  12. Gamma=0.85;
  13. Tor=0.0005;
  14. Maxepoch=2000;
  15. Accuracy=0;
  16. Ntrain=115;
  17. Ntest=35;
  18. %随机赋值 [-1, +1]
  19. V=2*(rand(h,i)-0.5);
  20. W=2*(rand(i,j)-0.5);
  21. Pi=2*(rand(1,i)-0.5);
  22. Tau=2*(rand(1,j)-0.5);
  23. DeltaWOld(i,j)=0;
  24. DeltaVOld(h,i)=0;
  25. DeltaPiOld(i)=0;
  26. DeltaTauOld(j)=0;
  27. % the learning process
  28. Epoch=1;
  29. Error=10;
  30. %加载数据
  31. load data.dat
  32. Odesired=data(:,2);
  33. % normalize the input data to rang [-1 +1]
  34. datanew=data(:,3:6);
  35. maxv=max(max(datanew));
  36. minv=min(min(datanew));
  37. datanorm=2*((datanew-minv)/(maxv-minv)-0.5);
  38. while Error>Tor
  39. Err(Epoch)=0;
  40. for k=1:Ntrain % k = the index of tranning set
  41. a=datanorm(k,:);
  42. % set the desired output ck[j]
  43. if data(k,2)==0
  44. ck=[1 0 0];
  45. elseif data(k,2)==1
  46. ck=[0 1 0];
  47. else
  48. ck=[0 0 1];
  49. end;
  50. % calculate the hidden nodes activation
  51. for ki=1:i
  52. b(ki)=logsig(a*V(:,ki)+Pi(ki));
  53. end;
  54. % calculate the output nodes activation
  55. for kj=1:j
  56. c(kj)=logsig(b*W(:,kj)+Tau(kj));
  57. end;
  58. % calculate error in output Layer FC
  59. d=c.*(1-c).*(ck-c);
  60. % calculate error in hidden layer FB
  61. e=b.*(1-b).*(d*W');
  62. % adjust weights Wij between FB and FC
  63. for ki=1:i
  64. for kj=1:j
  65. DeltaW(ki,kj)=Alpha*b(ki)*d(kj)+Gamma*DeltaWOld(ki,kj);
  66. end
  67. end;
  68. W=W+DeltaW;
  69. DeltaWOld=DeltaW;
  70. % adjust weights Vij between FA and FB
  71. for kh=1:h
  72. for ki=1:i
  73. DeltaV(kh,ki)=Beta*a(kh)*e(ki);
  74. end
  75. end;
  76. V=V+DeltaV;
  77. DeltaVold=DeltaV;
  78. % adjust thresholds Pi and Tau
  79. DeltaPi=Beta*e+Gamma*DeltaPiOld;
  80. Pi=Pi+DeltaPi;
  81. DeltaPiold=DeltaPi;
  82. DeltaTau=Alpha*d+Gamma*DeltaTauOld;
  83. Tau=Tau+DeltaTau;
  84. DeltaTauold=DeltaTau;
  85. % the error is the max of d(1),d(2),d(3)
  86. Err(Epoch)=Err(Epoch)+0.5*(d(1)*d(1)+d(2)*d(2)+d(3)*d(3));
  87. end %for k=1:Ntrain
  88. Err(Epoch)=Err(Epoch)/Ntrain;
  89. Error=Err(Epoch);
  90. % the training stops when iterate is too much
  91. if Epoch > Maxepoch
  92. break;
  93. end
  94. Epoch = Epoch +1; % update the iterate number
  95. end
  96. % test data
  97. for k=1:Ntest % k = the index of test set
  98. a=datanorm(Ntrain+k,:);
  99. % calculate the hidden nodes activation
  100. for ki=1:i
  101. b(ki)=logsig(a*V(:,ki)+Pi(ki));
  102. end;
  103. % calculate the output of test sets
  104. for kj=1:j
  105. c(kj)=logsig(b*W(:,kj)+Tau(kj));
  106. end;
  107. % transfer the output to one field format
  108. if (c(1)> 0.9)
  109. Otest(k)=0;
  110. elseif (c(2)> 0.9)
  111. Otest(k)=1;
  112. elseif (c(3)> 0.9)
  113. Otest(k)=2;
  114. else
  115. Otest(k)=3;
  116. end;
  117. % calculate the accuracy of test sets
  118. if Otest(k)==Odesired(Ntrain+k)
  119. Accuracy=Accuracy+1;
  120. end;
  121. end; % k=1:Ntest
  122. % plot the error
  123. plot(Err);
  124. % plot the NN output and desired output during test
  125. N=1:Ntest;
  126. figure; plot(N,Otest,'b-',N,Odesired(116:150),'r-');
  127. % display the accuracy
  128. Accuracy = 100*Accuracy/Ntest;
  129. t=['正确率: ' num2str(Accuracy) '%' ];
  130. disp(t);

                 2.2.2 python实现和框架如下

        每一部分具体的功能都进行了标注

  1. import math
  2. import random
  3. import numpy
  4. from sklearn import preprocessing
  5. import time
  6. import xlwt
  7. import matplotlib.pyplot as plt
  8. random.seed(0)
  9. def read_data(dir_str):
  10. '''
  11. 读取txt文件中的数据
  12. 数据内容:科学计数法保存的多行多列数据
  13. 输入:txt文件的路径
  14. 输出:小数格式的数组,行列与txt文件中相同
  15. '''
  16. data_temp = []
  17. with open(dir_str) as fdata:
  18. while True:
  19. line=fdata.readline()
  20. if not line:
  21. break
  22. data_temp.append([float(i) for i in line.split()])
  23. return numpy.array(data_temp)
  24. def randome_init_train_test(data, n_tr):
  25. ''' 随机划分训练集和测试集 '''
  26. # sklearn提供一个将数据集切分成训练集和测试集的函数train_test_split
  27. train_index = numpy.random.choice(data.shape[0], size=n_tr, replace=False, p=None)
  28. train_data = data[train_index]
  29. test_index = numpy.delete(numpy.arange(data.shape[0]),train_index) # 删除train_index对应索引的行数
  30. test_data = data[test_index]
  31. return train_data, test_data
  32. def min_max_normalization(np_array):
  33. ''' 离差标准化,(Xi-min(X))/(max(X)-min(X)) '''
  34. min_max_scaler = preprocessing.MinMaxScaler()
  35. ret = min_max_scaler.fit_transform(np_array)
  36. return ret
  37. def label_to_value(label):
  38. ''' 标签转换为对应输出值 (由于输出层结构,需要修改输出数据结构)'''
  39. switch = {
  40. 0.0: [1,0,0],
  41. 1.0: [0,1,0],
  42. 2.0: [0,0,1]
  43. }
  44. return switch[label]
  45. def value_to_label(value):
  46. ''' 神经网络输出值转换为对应标签 '''
  47. return value.index(max(value))
  48. def rand(min, max):
  49. ''' 随机取[a, b]范围内的值 '''
  50. return (max - min) * random.random() + min
  51. def make_matrix(m, n, fill=0.0): # 生成多维矩阵
  52. mat = []
  53. for i in range(m):
  54. mat.append([fill] * n)
  55. return mat
  56. def sigmoid(x):
  57. return 1.0 / (1.0 + math.exp(-x))
  58. def sigmoid_derivative(x):
  59. return x * (1 - x)
  60. class BPNeuralNetwork:
  61. def __init__(self): # 设置在BP神经网络中用到的参数
  62. self.input_n = 0
  63. self.hidden_n = 0
  64. self.output_n = 0
  65. self.input_values = [] # [1.0] * self.input_n
  66. self.hidden_values = [] # [1.0] * self.hidden_n
  67. self.output_values = [] # [1.0] * self.output_n
  68. self.input_weights = []
  69. self.output_weights = []
  70. self.input_correction = [] # dw1
  71. self.output_correction = [] # dw2
  72. self.input_bias = []
  73. self.output_bias = []
  74. def setup(self, ni, nh, no): # 参数设置
  75. self.input_n = ni
  76. self.hidden_n = nh
  77. self.output_n = no
  78. # init
  79. self.input_values = [1.0] * self.input_n # 输入层神经元输出(输入特征)
  80. self.hidden_values = [1.0] * self.hidden_n # 中间层神经元输出
  81. self.output_values = [1.0] * self.output_n # 隐藏层神经元输出(预测结果)
  82. self.input_weights = make_matrix(self.input_n, self.hidden_n)
  83. self.output_weights = make_matrix(self.hidden_n, self.output_n)
  84. # 初始随机赋值,在范围[-1, +1]内
  85. for i in range(self.input_n):
  86. for h in range(self.hidden_n):
  87. self.input_weights[i][h] = rand(-1, 1)
  88. for h in range(self.hidden_n):
  89. for o in range(self.output_n):
  90. self.output_weights[h][o] = rand(-1, 1)
  91. self.input_correction = make_matrix(self.input_n, self.hidden_n)
  92. self.output_correction = make_matrix(self.hidden_n, self.output_n)
  93. self.input_bias = [0.0] * self.input_n
  94. self.output_bias = [0.0] * self.output_n
  95. def predict(self, inputs): # 前向传播(在train中套在反向传播的train前面)
  96. # 输入层计算
  97. for i in range(self.input_n - 1):
  98. self.input_values[i] = inputs[i]
  99. # 隐藏层计算
  100. for j in range(self.hidden_n):
  101. total = 0.0
  102. for i in range(self.input_n):
  103. total += self.input_values[i] * self.input_weights[i][j]
  104. self.hidden_values[j] = sigmoid(total + self.input_bias[i])
  105. # 输出层计算
  106. for k in range(self.output_n):
  107. total = 0.0
  108. for j in range(self.hidden_n):
  109. total += self.hidden_values[j] * self.output_weights[j][k]
  110. self.output_values[k] = sigmoid(total + self.output_bias[j])
  111. return self.output_values[:]
  112. def back_propagate(self, case, label, learn, correct):
  113. # 前向预测
  114. self.predict(case)
  115. # 计算输出层的误差 w2
  116. output_deltas = [0.0] * self.output_n
  117. for o in range(self.output_n):
  118. error = label[o] - self.output_values[o]
  119. output_deltas[o] = sigmoid_derivative(self.output_values[o]) * error
  120. # 计算隐藏层的误差 w1
  121. hidden_deltas = [0.0] * self.hidden_n
  122. for h in range(self.hidden_n):
  123. error = 0.0
  124. for o in range(self.output_n):
  125. error += output_deltas[o] * self.output_weights[h][o]
  126. hidden_deltas[h] = sigmoid_derivative(self.hidden_values[h]) * error
  127. # 更新隐藏-输出层权重 b2
  128. for h in range(self.hidden_n):
  129. for o in range(self.output_n):
  130. change = output_deltas[o] * self.hidden_values[h]
  131. self.output_weights[h][o] += learn * change + correct * self.output_correction[h][o]
  132. self.output_correction[h][o] = change
  133. self.output_bias[o] += learn * change
  134. # 更新输入-隐藏层权重 b1
  135. for i in range(self.input_n):
  136. for h in range(self.hidden_n):
  137. change = hidden_deltas[h] * self.input_values[i]
  138. self.input_weights[i][h] += learn * change + correct * self.input_correction[i][h]
  139. self.input_correction[i][h] = change
  140. self.input_bias[h] += learn * change
  141. # 计算样本的均方误差
  142. error = 0.0
  143. for o in range(len(label)):
  144. error += 0.5 * (label[o] - self.output_values[o]) ** 2
  145. return error
  146. def train(self, datas, labels, epochs=5000, learn=0.05, correct=0.1, stop_error=0.001):
  147. for j in range(epochs):
  148. error = 0.0
  149. for i in range(len(datas)):
  150. label = labels[i]
  151. data = datas[i]
  152. error += self.back_propagate(data, label, learn, correct)
  153. if error <= stop_error:
  154. return j+1
  155. return epochs
  156. def save_excel(datas, output_file):
  157. # 将数据保存到新的excel表格里
  158. # 因为xls文件支持最大数据行数为65536,所以大文件输出成几个小文件,每个小文件有MAX_EXCEL_ROWS行数据
  159. MAX_EXCEL_ROWS = 60000
  160. for no in range(0, datas.__len__()//MAX_EXCEL_ROWS + 1):
  161. sheet_name = 'sheet' + str(no+1)
  162. output_file_name = output_file.split('.')[0] + str(no+1) + '.' + output_file.split('.')[-1]
  163. print('输出文件:', output_file_name)
  164. excel = xlwt.Workbook()
  165. sh = excel.add_sheet(sheet_name)
  166. for i, data in enumerate(datas[no*MAX_EXCEL_ROWS:(no+1)*MAX_EXCEL_ROWS]):
  167. for j, d in enumerate(data):
  168. sh.write(i, j, d)
  169. try:
  170. excel.save(output_file_name)
  171. except:
  172. xxx = input('输出异常!!请检查输出路径是否异常或文件是否已存在(需删除已存在文件)。然后输入任意键即可...')
  173. no = no - 1
  174. print('结束gool luck')
  175. if __name__ == '__main__':
  176. n_tr = 115
  177. input_nodes = 4
  178. hidden_nodes = 3 #
  179. output_nodes = 3
  180. epochs = 1000
  181. learn_rate = 0.5 # 学习率
  182. momentum_rate = 0.09 # 动量参数
  183. correct_rate = 0.1 # 矫正率
  184. data = read_data(r"D:\优化大作业\BPNN_Butterfly classification\data.txt")
  185. normal_data = min_max_normalization(data[:, 2:]) # 变量归一化
  186. data = numpy.concatenate((data[:, 1:2],normal_data),axis=1) # 取出输出的结果和标准化的数据拼接在一起
  187. tr, te = randome_init_train_test(data, n_tr) # 随机划分训练集和测试集
  188. tr_in = tr[:, 1:]
  189. tr_out = [label_to_value(v[0]) for v in tr[:, :1]] # 由于输出层使用3个节点,需要修改输出数据结构
  190. n_true = 0 # 统计正确预测数量
  191. nn = BPNeuralNetwork()
  192. nn.setup(input_nodes, hidden_nodes, output_nodes) # 设置BP神经网络框架
  193. st = time.perf_counter()
  194. epoch = nn.train(tr_in, tr_out, epochs, learn_rate, correct_rate) # train(self, datas, labels, epochs=5000, learn=0.05, correct=0.1, stop_error=0.001)
  195. print('epoch:', epoch, '\nTrain_time:', time.perf_counter() - st)
  196. pre = []
  197. for t in te:
  198. t_in = t[1:]
  199. label = value_to_label(nn.predict(t_in))
  200. if label == t[0]:
  201. n_true += 1
  202. # print(t, label)
  203. pre.append([label])
  204. # 输出统计结果
  205. accuracy = n_true/(data.shape[0]-n_tr)
  206. print('accuracy:', accuracy)
  207. print(nn.input_bias, nn.output_bias)
  208. # numpy.savetxt(r'bpnn_param\input_weights.txt', (nn.input_weights), fmt='%s')
  209. # numpy.savetxt(r'bpnn_param\output_weights.txt', (nn.output_weights), fmt='%s')
  210. # numpy.savetxt(r'bpnn_param\input_correction.txt', (nn.input_correction), fmt='%s')
  211. # numpy.savetxt(r'bpnn_param\output_correction.txt', (nn.output_correction), fmt='%s')
  212. # 将数据保存到新的excel表格里
  213. te_pre = numpy.concatenate((te, numpy.array(pre)), axis=1)
  214. save_excel(te_pre, 'test_result.xls')
  215. # 绘制准确率曲线
  216. x_axis_data = [i for i in range(35)]
  217. y_axis_data1 = te[:, :1] # 真实结果
  218. y_axis_data2 = pre # 预测结果
  219. plt.xlabel('测试集数', fontproperties='SimHei')
  220. plt.ylabel('预测分类', fontproperties='SimHei')
  221. plt.plot(x_axis_data, y_axis_data1, color='blue', label='真实结果' )
  222. plt.plot(x_axis_data, y_axis_data2, color='red', label='预测结果')
  223. plt.show()

3.心得分享

        经过自己的学习和研究,感觉可以先看懂公式,然后把程序导进去,用好断点,一步一步步进或者调试模式,看看得到的程序的结果和应该得出的结果得维数是不是相同,数据是否合理,研究透之后可以多自己写一写练一练,基本就没啥问题啦~

        up也是刚开始学习,有什么问题可以多多交流,互相学习~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/105628
推荐阅读
相关标签
  

闽ICP备14008679号