import pandas as pd
import numpy as np
import matplotlib.pyplot as plt def sigmoid(x): # 定义网络激活函数
return 1/(1+np.exp(-x)) data_tr = pd.read_csv('C:/Users/CHEN/Documents/WeChat Files/wxid_t1xqjm4fkg2v22/FileStorage/File/2022-03/3.3 data_tr.txt') # 训练集样本
data_te = pd.read_csv('C:/Users/CHEN/Documents/WeChat Files/wxid_t1xqjm4fkg2v22/FileStorage/File/2022-03/3.3 data_te.txt') # 测试集样本
n = len(data_tr)
yita = 0.85 # 自己设置学习速率 out_in = np.array([0.0, 0, 0, 0, -1]) # 输出层的输入,即隐层的输出
w_mid = np.zeros([3,4]) # 隐层神经元的权值&阈值
w_out = np.zeros([5]) # 输出层神经元的权值&阈值 delta_w_out = np.zeros([5]) # 输出层权值&阈值的修正量
delta_w_mid = np.zeros([3,4]) # 中间层权值&阈值的修正量
Err = []
'''
模型训练
'''
for j in range(1000):
error = []
for it in range(n):
net_in = np.array([data_tr.iloc[it, 0], data_tr.iloc[it, 1], -1]) # 网络输入
real = data_tr.iloc[it, 2]
for i in range(4):
out_in[i] = sigmoid(sum(net_in * w_mid[:, i])) # 从输入到隐层的传输过程
res = sigmoid(sum(out_in * w_out)) # 模型预测值
error.append(abs(real-res))#误差 print(it, '个样本的模型输出:', res, 'real:', real)
delta_w_out = yita*res*(1-res)*(real-res)*out_in # 输出层权值的修正量
delta_w_out[4] = -yita*res*(1-res)*(real-res) # 输出层阈值的修正量
w_out = w_out + delta_w_out # 更新,加上修正量 for i in range(4):
delta_w_mid[:, i] = yita*out_in[i]*(1-out_in[i])*w_out[i]*res*(1-res)*(real-res)*net_in # 中间层神经元的权值修正量
delta_w_mid[2, i] = -yita*out_in[i]*(1-out_in[i])*w_out[i]*res*(1-res)*(real-res) # 中间层神经元的阈值修正量,第2行是阈值
w_mid = w_mid + delta_w_mid # 更新,加上修正量
Err.append(np.mean(error))
print(w_mid,w_out)
plt.plot(Err)#训练集上每一轮的平均误差
plt.show()
plt.close() '''
将测试集样本放入训练好的网络中去
'''
error_te = []
for it in range(len(data_te)):
net_in = np.array([data_te.iloc[it, 0], data_te.iloc[it, 1], -1]) # 网络输入
real = data_te.iloc[it, 2]
for i in range(4):
out_in[i] = sigmoid(sum(net_in * w_mid[:, i])) # 从输入到隐层的传输过程
res = sigmoid(sum(out_in * w_out)) # 模型预测值
error_te.append(abs(real-res))
plt.plot(error_te)#测试集上每一轮的误差
plt.show()
np.mean(error_te)

import numpy as np
import scipy.special
import pylab
import matplotlib.pyplot as plt
#%%
class NeuralNetwork():
# 初始化神经网络
def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
# 设置输入层节点,隐藏层节点和输出层节点的数量和学习率
self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes
self.lr = learningrate #设置神经网络中的学习率
# 使用正态分布,进行权重矩阵的初始化
self.wih = np.random.normal(0.0, pow(self.hnodes, -0.5), (self.hnodes, self.inodes)) #(mu,sigma,矩阵)
self.who = np.random.normal(0.0, pow(self.onodes, -0.5), (self.onodes, self.hnodes))
self.activation_function = lambda x: scipy.special.expit(x) #激活函数设为Sigmod()函数
pass
# 定义训练神经网络
print("************Train start******************")
def train(self,input_list,target_list):
# 将输入、输出列表转换为二维数组
inputs = np.array(input_list, ndmin=2).T #T:转置
targets = np.array(target_list,ndmin= 2).T
hidden_inputs = np.dot(self.wih, inputs) #计算到隐藏层的信号,dot()返回的是两个数组的点积
hidden_outputs = self.activation_function(hidden_inputs) #计算隐藏层输出的信号
final_inputs = np.dot(self.who, hidden_outputs) #计算到输出层的信号
final_outputs = self.activation_function(final_inputs) 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))#transpose()转置
#输入层和隐藏层权重更新
self.wih += self.lr * np.dot((hidden_errors*hidden_outputs*(1.0-hidden_outputs)),
np.transpose(inputs))#转置
pass #查询神经网络
def query(self, input_list): # 转换输入列表到二维数
inputs = np.array(input_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 = 100 #隐藏层神经元个数
output_nodes = 10 #输出层神经元个数
learning_rate = 0.3 #学习率为0.3
# 创建神经网络
n = NeuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)
#%%
#读取训练数据集 转化为列表
training_data_file = open(r"C:\Users\CHEN\Documents\WeChat Files\wxid_t1xqjm4fkg2v22\FileStorage\File\2022-03\mnist_train.csv",'r')
training_data_list = training_data_file.readlines() #方法用于读取所有行,并返回列表
#print("training_data_list:",training_data_list)
training_data_file.close()
#%%
#训练次数
i = 2
for e in range(i):
#训练神经网络
for record in training_data_list:
all_values = record.split(',') #根据逗号,将文本数据进行拆分
#将文本字符串转化为实数,并创建这些数字的数组。
inputs = (np.asfarray(all_values[1:])/255.0 * 0.99) + 0.01
#创建用零填充的数组,数组的长度为output_nodes,加0.01解决了0输入造成的问题
targets = np.zeros(output_nodes) + 0.01 #10个元素都为0.01的数组
#使用目标标签,将正确元素设置为0.99
targets[int(all_values[0])] = 0.99#all_values[0]=='8'
n.train(inputs,targets)
pass
pass
#%%
test_data_file = open(r"C:\Users\CHEN\Documents\WeChat Files\wxid_t1xqjm4fkg2v22\FileStorage\File\2022-03\mnist_test.csv",'r')
test_data_list = test_data_file.readlines()
test_data_file.close() all_values = test_data_list[2].split(',') #第3条数据,首元素为1
# print(all_values)
# print(len(all_values))
# print(all_values[0]) #输出目标值
#%%
score = []
print("***************Test start!**********************")
for record in test_data_list:
#用逗号分割将数据进行拆分
all_values = record.split(',')
#正确的答案是第一个值
correct_values = int(all_values[0])
# print(correct_values,"是正确的期望值")
#做输入
inputs = (np.asfarray(all_values[1:])/255.0 * 0.99) + 0.01
#测试网络 作输入
outputs= n.query(inputs)#10行一列的矩阵
#找出输出的最大值的索引
label = np.argmax(outputs)
# print(label,"是网络的输出值\n")
#如果期望值和网络的输出值正确 则往score 数组里面加1 否则添加0
if(label == correct_values):
score.append(1)
else:
score.append(0)
pass
pass
print(outputs)
#%%
# print(score)
score_array = np.asfarray(score)
#%%
print("正确率是:",(score_array.sum()/score_array.size)*100,'%')

BP神经网络及手工搭建神经网络的更多相关文章

  1. TensorFlow笔记-05-反向传播,搭建神经网络的八股

    TensorFlow笔记-05-反向传播,搭建神经网络的八股 反向传播 反向传播: 训练模型参数,在所有参数上用梯度下降,使用神经网络模型在训练数据上的损失函数最小 损失函数:(loss) 计算得到的 ...

  2. (转)一文学会用 Tensorflow 搭建神经网络

    一文学会用 Tensorflow 搭建神经网络 本文转自:http://www.jianshu.com/p/e112012a4b2d 字数2259 阅读3168 评论8 喜欢11 cs224d-Day ...

  3. 用Tensorflow搭建神经网络的一般步骤

    用Tensorflow搭建神经网络的一般步骤如下: ① 导入模块 ② 创建模型变量和占位符 ③ 建立模型 ④ 定义loss函数 ⑤ 定义优化器(optimizer), 使 loss 达到最小 ⑥ 引入 ...

  4. Tensorflow 搭建神经网络及tensorboard可视化

    1. session对话控制 matrix1 = tf.constant([[3,3]]) matrix2 = tf.constant([[2],[2]]) product = tf.matmul(m ...

  5. 一文学会用 Tensorflow 搭建神经网络

    http://www.jianshu.com/p/e112012a4b2d 本文是学习这个视频课程系列的笔记,课程链接是 youtube 上的,讲的很好,浅显易懂,入门首选, 而且在github有代码 ...

  6. 用Keras搭建神经网络 简单模版(二)——Classifier分类(手写数字识别)

    # -*- coding: utf-8 -*- import numpy as np np.random.seed(1337) #for reproducibility再现性 from keras.d ...

  7. Tensorflow学习:(二)搭建神经网络

    一.神经网络的实现过程 1.准备数据集,提取特征,作为输入喂给神经网络       2.搭建神经网络结构,从输入到输出       3.大量特征数据喂给 NN,迭代优化 NN 参数       4.使 ...

  8. 用Keras搭建神经网络 简单模版(六)——Autoencoder 自编码

    import numpy as np np.random.seed(1337) from keras.datasets import mnist from keras.models import Mo ...

  9. 【pytorch】学习笔记(四)-搭建神经网络进行关系拟合

    [pytorch学习笔记]-搭建神经网络进行关系拟合 学习自莫烦python 目标 1.创建一些围绕y=x^2+噪声这个函数的散点 2.用神经网络模型来建立一个可以代表他们关系的线条 建立数据集 im ...

  10. keras搭建神经网络快速入门笔记

    之前学习了tensorflow2.0的小伙伴可能会遇到一些问题,就是在读论文中的代码和一些实战项目往往使用keras+tensorflow1.0搭建, 所以本次和大家一起分享keras如何搭建神经网络 ...

随机推荐

  1. 如何完美运行黑苹果 macOS Catalina

    2018年年初,我在闲鱼 APP 上,以799元的价格,购买了一台二手的联想 ThinkPad 11e 笔记本电脑.这是一台美版的教育用途电脑,成色较新,根据自带硬盘记录,该电脑使用时长仅有230+小 ...

  2. RocketMQ - 消费者概述

    消费流程 消费者组: 一个逻辑概念,在使用消费者时需要指定一个组名.一个消费者组可以订阅多个Topic. 消费者实例: 一个消费者组程序部署了多个进程,每个进程都可以称为一个消费者实例. 订阅关系: ...

  3. nvm管理node和npm

    安装nvm 下载地址:https://github.com/coreybutler/nvm-windows/releases 下载前卸载调node,安装时注意记住所在路径,傻瓜式安装.安装后nvm - ...

  4. LG P2839 [国家集训队]middle

    \(\text{Solution}\) 不考虑起点区间和终点区间的限制,求区间中位数 可以二分中位数,大于等于中位数的位置赋为 \(1\),小于的位置赋 \(-1\) 当区间和大于等于 \(0\) 时 ...

  5. JZOJ 4276【NOIP2015模拟10.28A组】递推

    [NOIP2015模拟10.28A组]递推 思路一 对于 \(30%\) 的数据,由于 \(n\) 和 \(x_i\) 都比较小,所以依题暴力枚举每个整点的坐标算贡献即可 思路二 对于额外 \(20% ...

  6. [NOI Online 提高组]冒泡排序

    题目 洛谷等许多 \(OJ\) 都有 思路 考试题,今日无意又做了一次 然后发现自己读错题了······ 其实询问时只要 \(k\) 轮排序后的逆序对个数并不需要真的对序列进行更改 很显然 \(k\) ...

  7. ENCOURAGE研究: 病情中度活动RA获得深度缓解后有望实现停药

    标签: 类风湿关节炎; TNF拮抗剂; 维持期减停 病情中度活动的RA患者在获得深度缓解后有望实现停用生物制剂 电邮发布日期: 2016年2月3日 病情中度活动的类风湿关节炎(RA)患者通过传统DMA ...

  8. centos7 安装MariaDB数据库

    1.添加 MariaDB yum源 #添加MariaDB.repo配置文件 vim /etc/yum.repos.d/MariaDB.repo #添加内容 [mariadb] name = Maria ...

  9. openssl国密算法库

    openssl国密算法库 一.开发背景 openssl是一个功能丰富且自包含的开源安全工具箱.它提供的主要功能有:SSL协议实现(包括SSLv2.SSLv3和TLSv1).大量软算法(对称/非对称/摘 ...

  10. Electron 应用图标修改

    1,首先给窗口添加图标: 1) 窗口图标是图片jpg或者png格式,如果没有图标去[https://www.aigei.com/icon/?wd=icon%E7%BD%91&bd_vid=10 ...