赞
踩
实验四 BP神经网络
第一个http://www.pianshen.com/article/903699656/,源代码有错误
参考:http://www.mamicode.com/info-detail-2417017.html
seaborn官网上有更完整的示例,有兴趣可以查看:http://seaborn.pydata.org/generated/seaborn.pairplot.html
安装Keras:
http://www.mamicode.com/info-detail-2180288.html
https://blog.csdn.net/violetmokkkk/article/details/81709915
注意查看anaconda中的py版本,高于该版本安装会出现错误
安装pandas:
ModuleNotFoundError: No module named 'pandas'
Anaconda Prompt中输入activate tensorflow |
conda install pandas缺啥就安装啥
报错:
(tensorflow) C:\Users\laugo>conda install sklearn Solving environment: failed PackagesNotFoundError: The following packages are not available from current channels: - sklearn |
解决:
(tensorflow) C:\Users\laugo>pip install sklearn |
一、实验目的与要求
1)掌握BP神经网络的原理。
2)了解BP神经网络的结构,以及前向传播和反向传播的过程。
3)学会利用BP神经网络建立训练模型,并对模型进行评估。
4)学会使用BP神经网络做预测。
二、实验内容
df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None),可直接用。
# 包引入,导入鸢尾花的数据 import pandas as pd import numpy as np import matplotlib.pyplot as plt import os
#读入数据集 df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None) #查看前十项,给出截图 df.head(10) #使用seaborn对数据进行观察 import seaborn as sns sns.pairplot(dataset.iloc[:, 1:6], hue='Species')
#生成测试数据 X = dataset.iloc[:, 1:4].values y = dataset.iloc[:,4].values #将y字符串数组转换成整数数组,在这里我们可以使用sklearn的LabelEncoder库 from sklearn.preprocessing import LabelEncoder encoder = LabelEncoder() y1 = encoder.fit_transform(y) y1 #最后将y1转成神经网络需要的数组结构 Y = pd.get_dummies(y1).values
#将训练数据与测试数据做分割 #请填入代码 from sklearn.model_selection import train_test_split#分割所需要的包
#创建神经网络模型 #请填入代码
#训练模型,并使用这个模型进行预测,并打印结果 #请填入代码
#对模型进行评估 #请填入代码 |
具体数据集见mnist_dataset压缩包
mnist_train.csv, mnist_test.csv(大样本,训练集为60000个.)
import numpy as np import scipy.special as S import matplotlib.pyplot as plt class neuralNetwork: #初始化神经网络,构造函数 def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate): #设置每个输入、隐藏、输出层中的节点数 self.inodes = inputnodes self.hnodes = hiddennodes self.onodes = outputnodes
#链接权重矩阵,wih和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 = np.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes)) self.who = np.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes))
#学习率 self.lr = learningrate
#创建激活函数(函数的另一种定义方法,这样以后可以直接调用) self.activation_function = lambda x: S.expit(x)
pass #训练神经网络 def train(self, inputs_list, targets_list): #将输入列表转换成二维数组 inputs = np.array(inputs_list, ndmin = 2).T targets = np.array(targets_list, ndmin = 2).T
#将输入信号计算到隐藏层 hidden_inputs = np.dot(self.wih, inputs) #计算隐藏层中输出的信号(使用激活函数计算) hidden_outputs = self.activation_function(hidden_inputs) #将传输的信号计算到输出层 final_inputs = np.dot(self.who, hidden_outputs) #计算输出层中输出的信号(使用激活函数) final_outputs = self.activation_function(final_inputs)
#计算输出层的误差:(target - actual)(预期目标输出值-实际计算得到的输出值) output_errors = targets - final_outputs #隐藏层的误差:是输出层误差按权重分割,在隐藏节点上重新组合 hidden_errors = np.dot(self.who.T, output_errors)
#反向传播,更新各层权重 #更新隐层和输出层之间的权重 self.who += self.lr*np.dot((output_errors*final_outputs*(1.0 - final_outputs)), np.transpose(hidden_outputs)) #更新输入层和隐藏层之间的权重 self.wih += self.lr*np.dot((hidden_errors*hidden_outputs*(1.0 - hidden_outputs)), np.transpose(inputs)) #pass一般用于占位置,定义一个空函数程序会报错,当没有想好函数的内容可以用pass填充,使得程序正常运行 pass
#查询神经网络:接受神经网络的输入,返回神经网络的输出 def query(self, inputs_list): #将输入列表转换成二维数组 inputs = np.array(inputs_list, ndmin = 2).T
#将输入信号计算到隐藏层 hidden_inputs = np.dot(self.wih, inputs) #将信号从隐藏层输出 hidden_outputs = self.activation_function(hidden_inputs) #将信号引入到输出层 final_inputs = np.dot(self.who, hidden_outputs) #将信号从输出层输出 final_outputs = self.activation_function(final_inputs) #返回输出层的输出值 return final_outputs #请设置输入、隐藏、输出层中的节点数,和学习率 input_nodes = hidden_nodes = output_nodes = learning_rate = #将mnist的训练数据CSV文件加载到一个列表中 #请输入代码 #训练神经网络 #请输入代码 #进行测试,输出测试结果 #请输入代码 |
三、实验结果(截图+模型评估)
四、结果分析
请分别对预测结果进行分析。
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- import seaborn as sns
- from sklearn.preprocessing import LabelEncoder
- from sklearn.model_selection import train_test_split
- from keras.models import Sequential
- from keras.layers import Dense
- from keras.optimizers import Adam
- from sklearn.metrics import classification_report
-
- dataset = pd.read_csv('iris.csv')
- sns.pairplot(dataset.iloc[:, 1:6], hue='Species')
- X=dataset.iloc[:, 1:5].values
- y=dataset.iloc[:,5].values
- encoder=LabelEncoder()
- y1=encoder.fit_transform(y)
- Y=pd.get_dummies(y1).values
- X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=0)
-
-
- model = Sequential()
- model.add(Dense(10, input_shape=(4,), activation='relu'))
- model.add(Dense(8, activation='relu'))
- model.add(Dense(6, activation='relu'))
- model.add(Dense(3, activation='softmax'))
-
- model.compile(Adam(lr=0.04), 'categorical_crossentropy', metrics=['accuracy'])
- model.summary()
-
- model.fit(X_train, y_train, epochs=100)
- y_pred=model.predict(X_test)
- y_pred_class=np.argmax(y_pred,axis=1)
- y_test_class=np.argmax(y_test,axis=1)
- report=classification_report(y_test_class, y_pred_class)
- print(report)
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
- import numpy as np
- import scipy.special as S
- import matplotlib.pyplot as plt
- class neuralNetwork:
- #初始化神经网络,构造函数
- def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
- #设置每个输入、隐藏、输出层中的节点数
- self.inodes = inputnodes
- self.hnodes = hiddennodes
- self.onodes = outputnodes
-
- #链接权重矩阵,wih和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 = np.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes))
- self.who = np.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes))
- #学习率
- self.lr = learningrate
- #创建激活函数(函数的另一种定义方法,这样以后可以直接调用)
- self.activation_function = lambda x: S.expit(x)
-
- pass
- #训练神经网络
- def train(self, inputs_list, targets_list):
- #将输入列表转换成二维数组
- inputs=np.array(inputs_list, ndmin = 2).T
- targets=np.array(targets_list, ndmin = 2).T
-
- #将输入信号计算到隐藏层
- hidden_inputs = np.dot(self.wih, inputs)
- #计算隐藏层中输出的信号(使用激活函数计算)
- hidden_outputs = self.activation_function(hidden_inputs)
- #将传输的信号计算到输出层
- final_inputs = np.dot(self.who, hidden_outputs)
- #计算输出层中输出的信号(使用激活函数)
- final_outputs = self.activation_function(final_inputs)
-
- #计算输出层的误差:(target - actual)(预期目标输出值-实际计算得到的输出值)
- output_errors = targets - final_outputs
- #隐藏层的误差:是输出层误差按权重分割,在隐藏节点上重新组合
- hidden_errors = np.dot(self.who.T, output_errors)
-
- #反向传播,更新各层权重
- #更新隐层和输出层之间的权重
- self.who += self.lr*np.dot((output_errors*final_outputs*(1.0 - final_outputs)), np.transpose(hidden_outputs))
- #更新输入层和隐藏层之间的权重
- self.wih += self.lr*np.dot((hidden_errors*hidden_outputs*(1.0 - hidden_outputs)), np.transpose(inputs))
- #pass一般用于占位置,定义一个空函数程序会报错,当没有想好函数的内容可以用pass填充,使得程序正常运行
- pass
-
- #查询神经网络:接受神经网络的输入,返回神经网络的输出
- def query(self, inputs_list):
- #将输入列表转换成二维数组
- inputs = np.array(inputs_list, ndmin = 2).T
-
- #将输入信号计算到隐藏层
- hidden_inputs = np.dot(self.wih, inputs)
- #将信号从隐藏层输出
- hidden_outputs = self.activation_function(hidden_inputs)
- #将信号引入到输出层
- final_inputs = np.dot(self.who, hidden_outputs)
- #将信号从输出层输出
- final_outputs = self.activation_function(final_inputs)
- #返回输出层的输出值
- return final_outputs
- #请设置输入、隐藏、输出层中的节点数,和学习率
- input_nodes=784
- hidden_nodes=200
- output_nodes=10
- learning_rate=0.3
- n=neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)
- #将mnist的训练数据CSV文件加载到一个列表中
- training_data_file = open("mnist_train.csv", 'r')
- training_data_list = training_data_file.readlines()
- training_data_file.close()
- #请输入代码
- #训练神经网络
- epochs = 5
- for e in range(epochs):
- for record in training_data_list:
- all_values = record.split(',')
- inputs = (np.asfarray(all_values[1:]) / 255.0*0.99) + 0.01
- targets = np.zeros(output_nodes) + 0.01
- targets[int(all_values[0])] = 0.99
- n.train(inputs, targets)
- pass
- pass
- #请输入代码
- #进行测试,输出测试结果
- test_data_file = open("mnist_test.csv", 'r')
- test_data_list = test_data_file.readlines()
- test_data_file.close()
-
- scorecard = []
-
- #检测测试数据集中的所有数据
- for record in test_data_list:
- all_values = record.split(',')
- correct_label = int(all_values[0])
- inputs = (np.asfarray(all_values[1:]) / 255.0*0.99) + 0.01
- outputs = n.query(inputs)
- outputs_max_label = np.argmax(outputs)
- if (outputs_max_label == correct_label):
- scorecard.append(1)
- else:
- scorecard.append(0)
- pass
- pass
-
- scorecard_array=np.asarray(scorecard)
- print("performace=", scorecard_array.sum()/scorecard_array.size)
- #请输入代码
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。