【机器学习】基于AutoEncoder的BP神经网络的tensorflow实现
【机器学习】基于AutoEncoder的BP神经网络的tensorflow实现
- 一、基于AutoEncoder的BP神经网络
- 1.1、BP神经网络
- 1.1.1、BP神经网络结构
- 1.1.2、BP神经网络的训练
- 1.2、AutoEncoder(自编码器)
- 二、基于AutoEncoder的BP神经网络的tensorflow实现
- 参考资料
一、基于AutoEncoder的BP神经网络
1.1、BP神经网络
1.1.1、BP神经网络结构
设有数据集{(X1,Y1),(X2,Y2),⋯ ,(Xm,Ym)}\left\{ {\left( {{X_1},{Y_1}} \right),\left( {{X_2},{Y_2}} \right), \cdots ,\left( {{X_m},{Y_m}} \right)} \right\}{(X1,Y1),(X2,Y2),⋯,(Xm,Ym)},每个样本特征有nnn个特征,即Xi={x1,x2,⋯ ,xn}{X_i} = \left\{ {{x_1},{x_2}, \cdots ,{x_n}} \right\}Xi={x1,x2,⋯,xn},对应的样本标签为Yi={o1,⋯ ,oj}{Y_i} = \left\{ {{o_1}, \cdots ,{o_j}} \right\}Yi={o1,⋯,oj}。
BP神经网络的结构图如上所示。BP神经网络是三层结构:输入层、隐含层和输出层。
输入层:节点数等于样本的特征维度数nnn,输入每一个样本的特征。
隐含层:节点数可以根据需要设置(本博文中设为k)。
输出层:节点数等于标签维度数jjj。
输入层到隐含层之间的权重矩阵W1W_1W1,偏置b1b_1b1,W1W_1W1的维度为n∗kn*kn∗k,b1b_1b1的维度为1∗k1*k1∗k;隐含层到输出层之间的权重矩阵W2W_2W2,偏置b2b_2b2,W2W_2W2的维度为k∗jk*jk∗j,b2b_2b2的维度为1∗j1*j1∗j。
本博文中隐含层和输出层的节点激活函数为sigmoid函数。
1.1.2、BP神经网络的训练
前向传播求误差:
对于样本XiX_iXi。
隐含层的输入:Hin=Xi⋅W1+b1{H_{in}} = {X_i} \cdot {W_1} + {b_1}Hin=Xi⋅W1+b1
隐含层的输出:Houtput=sigmoid(Hin){H_{output}} = sigmoid\left( {{H_{in}}} \right)Houtput=sigmoid(Hin)
输出层的输入:Oin=Houtput⋅W2+b2{O_{in}} = {H_{output}} \cdot {W_2} + {b_2}Oin=Houtput⋅W2+b2
输出层的输出:Ooutput=sigmoid(Oin){O_{output}} = sigmoid\left( {{O_{in}}} \right)Ooutput=sigmoid(Oin)
反向传播训练模型参数:
本博文采用tensorflow的tf.Session()入口训练模型参数,tensorflow模型构建与训练的流程方法可参考本人之前的博文。
1.2、AutoEncoder(自编码器)
上面提到的基础的BP神经网络中输入层到隐含层的权值是随机设置的,如果权值的初始值与模型的最优权值相差较远,需要大量的迭代训练才能得到最优参数。如何合理地给权值设定初始值,减少模型训练时的迭代。
AutoEncoder是将输入向量经过权重W1W_1W1和偏置b1b_1b1映射到隐含层上,隐含层到输出层的权重矩阵W2W_2W2为W1W_1W1的转置矩阵,损失函数为网络输出与输入向量的欧式距离(参考资料【1】)。
可以将输入层到隐含层理解为编码过程,隐含层到输出层理解为解码过程。
基于AutoEncoder的BP神经网络,输入层到隐含层的初始权值矩阵和偏置为AutoEncoder训练好的权重W1W_1W1和b1b_1b1。
二、基于AutoEncoder的BP神经网络的tensorflow实现
tensorflow代码地址:https://github.com/shiluqiang/BP_NN_tensorflow
本博文代码参考(资料【2】)
首先利用AutoEncoder训练输入层到隐含层权重和偏置。
class Denoising_AutoEncoder():def __init__(self,n_hidden,input_data,keep_prob):'''类参数定义'''self.W = None #输入层到隐含层的权重self.b = None #输入层到隐含层的偏置self.encode_r = None #隐含层输出self.n_hidden = n_hidden #隐含层节点数self.input_data = input_data #输入样本self.keep_prob = keep_prob #特征保持不变的比例self.W_eval = None #权重W的值self.b_eval = None #偏置b的值def fit(self):'''降噪自编码器训练'''# 1.创建输入输出占位符和参数变量#输入层节点个数n_visible = (self.input_data).shape[1]#输入数据占位符X = tf.placeholder('float',[None,n_visible],name = 'X')#用于将部分输入数据置为0mask = tf.placeholder('float',[None,n_visible],name = 'mask')#创建输入层到隐含层的权重和偏置W_init_max = 4.0 * np.sqrt(6.0 / (n_visible + self.n_hidden))W_init = tf.random_uniform(shape = [n_visible,self.n_hidden], minval = - W_init_max, maxval = W_init_max)self.W = tf.Variable(W_init,name = 'W') #输入层到隐含层权重self.b = tf.Variable(tf.zeros([self.n_hidden]), name = 'b')#隐含层到输出层的权重和偏置W_prime = tf.transpose(self.W)b_prime = tf.Variable(tf.zeros([n_visible]), name = 'b_prime')# 2.构建前向传播的计算图#信号前向传播tilde_X = mask * X #对输入样本加入噪音 Y = tf.nn.sigmoid(tf.matmul(tilde_X,self.W) + self.b)Z = tf.nn.sigmoid(tf.matmul(Y,W_prime) + b_prime) # 3.声明损失函数和优化算法#损失函数(均方误差)cost = tf.reduce_mean(tf.pow(X - Z,2))#最小化损失函数train_op = tf.train.GradientDescentOptimizer(0.01).minimize(cost)#导入样本数据trX = self.input_data# 4.反向传播求参数with tf.Session() as sess:#初始化所有参数tf.global_variables_initializer().run()for i in range(30):for start,end in zip(range(0,len(trX),128),range(128,len(trX) + 1,128)):input_ = trX[start:end] # 输入mask_np = np.random.binomial(1,self.keep_prob,input_.shape) # 设置masksess.run(train_op, feed_dict = {X: input_, mask: mask_np})if i % 5 == 0:mask_np = np.random.binomial(1,1,trX.shape)print('Loss function at step %d is %s'%(i,sess.run(cost,feed_dict = {X: trX, mask: mask_np})))#保存输入层到隐含层的权重和偏置,保存隐含层的输出self.W_eval = (self.W).eval()self.b_eval = (self.b).eval() mask_np = np.random.binomial(1,1,trX.shape)self.encode_r = Y.eval({X: trX, mask: mask_np})#获得参数def get_value(self):return self.W_eval,self.b_eval
然后,构造BP神经网路并训练参数。
class Denosing_AutoEncoder_NN():def __init__(self,hidden_nodes,keep_prob,input_data_trainX,input_data_trainY,input_data_testX,input_data_testY):self.hidden_nodes = hidden_nodes #隐含层节点数self.keep_prob = keep_prob # 特征保持不变的比例self.input_data_trainX = input_data_trainX #训练样本的特征self.input_data_trainY = input_data_trainY #训练样本的标签self.input_data_validX = input_data_trainX #验证样本的特征self.input_data_validY = input_data_trainY #验证样本的标签self.input_data_testX = input_data_testX #测试样本的特征self.input_data_testY = input_data_testY #测试样本的标签def fit(self):# 1.训练降噪自编码器获得输入层到隐含层的初始权重与偏置data_train = self.input_data_trainXdae = Denoising_AutoEncoder(self.hidden_nodes,data_train,self.keep_prob)dae.fit()W1_DA,b1_DA = dae.get_value()# 2. 生命输入输出的占字符n_input = (self.input_data_testX).shape[1]n_output = (self.input_data_testY).shape[1]X = tf.placeholder('float',[None,n_input],name = 'X')Y = tf.placeholder('float',[None,n_output],name = 'Y')# 3.参数变量设置#输入层到隐含层参数W1 = tf.Variable(W1_DA,name = 'W1')b1 = tf.Variable(b1_DA,name = 'b1')#隐含层到输出层参数W2 = tf.Variable(tf.truncated_normal([self.hidden_nodes,n_output],stddev = 0.1),name = 'W2')b2 = tf.Variable(tf.constant(0.1,[1,n_output]),name = 'b2')# 4.构建前向传播的计算图H = tf.nn.sigmoid(tf.matmul(X,W1) + b1) #隐含层输出y_pred = tf.nn.sigmoid(tf.matmul(H,W2) + b2) #输出层输出# 5.生命代价函数和优化算法cost = tf.reduce_mean(tf.pow(Y - y_pred,2))train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cost)model_predictions = tf.argmax(y_pred,1)correct_predictions = tf.equal(model_predictions,tf.argmax(Y,1))accuracy = tf.reduce_mean(tf.cast(correct_predictions,'float'))# 6.反向传播参数微调trX = self.input_data_trainXtrY = self.input_data_trainYvaX = self.input_data_validXvaY = self.input_data_validYteX = self.input_data_testXteY = self.input_data_testYwith tf.Session() as sess:tf.global_variables_initializer().run()for i in range(50):for start,end in zip(range(0,len(trX),128),range(128,len(trX) + 1,128)):sess.run(train_step, feed_dict = {X: trX[start:end],Y: trY[start:end]})if i % 5.0 == 0:print('Accuracy at step %s on validation set:%s'%(i,sess.run(accuracy,feed_dict={X:vaX,Y:vaY})))print('Accuracy on test set is :%s'%(sess.run(accuracy,feed_dict={X:teX,Y:teY})))
参考资料
1、https://blog.csdn.net/google19890102/article/details/49738323
2、《python机器学习算法》
【机器学习】基于AutoEncoder的BP神经网络的tensorflow实现相关推荐
- matlab 神经网络dpi,基于DPI和BP神经网络的P2P流量识别研究
研究与开发 现代计算机 2019.04 上 文章编号:1007-1423(2019)10-0031-05 DOI:10.3969/j.issn.1007-1423.2019.10.007 基于 DPI ...
- Python基于PyTorch实现BP神经网络ANN分类模型项目实战
说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 在人工神经网络的发展历史上,感知机(Multilayer Per ...
- Python基于PyTorch实现BP神经网络ANN回归模型项目实战
说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 在人工神经网络的发展历史上,感知机(Multilayer Per ...
- 【毕业设计/Matlab系列】基于PCA和BP神经网络的人脸识别系统(附matlab代码)
Date: 2022.4.26 文章目录 前言 1.总体介绍 2.详细分析 2.1.训练程序 2.2.测试程序 3.测试效果图 4.测试部分matlab代码 前言 在毕业设计中实现了基于PCA和BP神 ...
- 【笔记】基于边缘检测和BP神经网络的大豆杂草识别研究
<基于边缘检测和BP神经网络的大豆杂草识别研究> 单位:吉林农业大学信息技术学院 作者:侯雨 数据获取 设备:大疆 DJI 精灵3 相机:EXMOR 1/2.3 RGB 相机 拍照:飞行高 ...
- gwo算法matlab源代码,智能优化算法应用:基于GWO优化BP神经网络 - 附代码
智能优化算法应用:基于GWO优化BP神经网络 - 附代码 智能优化算法应用:基于GWO优化BP神经网络 - 附代码 智能优化算法应用:基于GWO优化BP神经网络 文章目录智能优化算法应用:基于GWO优 ...
- 生猪价格matlab,基于时间序列的BP神经网络猪肉价格预测
科技创新 2m6钎第20期I科技创新与应用 基于时间序列的BP神经网络猪肉价格预测 张津张瑞斌 (成都理工大学管理科学学院,四川成都610059) 摘要:猪肉价格是不稳定的,起伏变化的,猪肉价格的预测 ...
- 【智能控制实验】基于MATLAB的BP神经网络设计
实验五:基于MATLAB的BP神经网络设计 一.实验要求: 重点是掌握BP神经网络的学习算法原理和代码设计方法,应用MATLAB编写BP神经网络训练方法:应用神经网络工具箱设计BP神经网络实现对输入输 ...
- 基于遗传算法的BP神经网络齿轮箱故障诊断实例
一.BP神经网络概述 BP网络是一类多层的前馈神经网络.它的名字源于在网络训练的过程中,调整网络的权值的算法是误差的反向传播的学习算法,即为BP学习算法.BP算法是 Rumelhart等人在1986年 ...
最新文章
- 设计模式我学过呀,就是没用过
- [Winform]检测exe是否已经运行,并将其置顶
- “幕后英雄”之Backing Fields【Microsoft Entity Framework Core随笔】
- Linux ALSA声卡驱动之四:Control设备的创建
- 搜python题_python知识点汇总(可以搜Python题答案的APP)
- Eclipse安装Tomcat插件全攻略
- 高手常用的15 种 SQL 优化
- 2021中国AI商业落地典型案例
- php淘口令,淘口令使用说明
- c语言——求逆矩阵,伴随矩阵,行列式
- IDEA社区版配置Spring Boot开发
- git cz 代替 git commit,让提交信息更加明确
- Windows服务器无法配置IP
- 用计算机写作文教学难点,《用计算机写作文》教学设计
- matlab fill 图案填充,Matlab条形图中填充图案
- 怎样在word中批量替换文字?Word替换文字这一招你会吗?
- 机械硬盘通过USB外接到电脑,显示不出来
- 学计算机西电和中南,放弃中南大学等985高校,去南航、西电的强势专业到底值不值得呢?...
- PAT a1134
- erp系统服务器性能指标,ERP系统体检的三大关键指标