【机器学习】基于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实现相关推荐

  1. matlab 神经网络dpi,基于DPI和BP神经网络的P2P流量识别研究

    研究与开发 现代计算机 2019.04 上 文章编号:1007-1423(2019)10-0031-05 DOI:10.3969/j.issn.1007-1423.2019.10.007 基于 DPI ...

  2. Python基于PyTorch实现BP神经网络ANN分类模型项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 在人工神经网络的发展历史上,感知机(Multilayer Per ...

  3. Python基于PyTorch实现BP神经网络ANN回归模型项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 在人工神经网络的发展历史上,感知机(Multilayer Per ...

  4. 【毕业设计/Matlab系列】基于PCA和BP神经网络的人脸识别系统(附matlab代码)

    Date: 2022.4.26 文章目录 前言 1.总体介绍 2.详细分析 2.1.训练程序 2.2.测试程序 3.测试效果图 4.测试部分matlab代码 前言 在毕业设计中实现了基于PCA和BP神 ...

  5. 【笔记】基于边缘检测和BP神经网络的大豆杂草识别研究

    <基于边缘检测和BP神经网络的大豆杂草识别研究> 单位:吉林农业大学信息技术学院 作者:侯雨 数据获取 设备:大疆 DJI 精灵3 相机:EXMOR 1/2.3 RGB 相机 拍照:飞行高 ...

  6. gwo算法matlab源代码,智能优化算法应用:基于GWO优化BP神经网络 - 附代码

    智能优化算法应用:基于GWO优化BP神经网络 - 附代码 智能优化算法应用:基于GWO优化BP神经网络 - 附代码 智能优化算法应用:基于GWO优化BP神经网络 文章目录智能优化算法应用:基于GWO优 ...

  7. 生猪价格matlab,基于时间序列的BP神经网络猪肉价格预测

    科技创新 2m6钎第20期I科技创新与应用 基于时间序列的BP神经网络猪肉价格预测 张津张瑞斌 (成都理工大学管理科学学院,四川成都610059) 摘要:猪肉价格是不稳定的,起伏变化的,猪肉价格的预测 ...

  8. 【智能控制实验】基于MATLAB的BP神经网络设计

    实验五:基于MATLAB的BP神经网络设计 一.实验要求: 重点是掌握BP神经网络的学习算法原理和代码设计方法,应用MATLAB编写BP神经网络训练方法:应用神经网络工具箱设计BP神经网络实现对输入输 ...

  9. 基于遗传算法的BP神经网络齿轮箱故障诊断实例

    一.BP神经网络概述 BP网络是一类多层的前馈神经网络.它的名字源于在网络训练的过程中,调整网络的权值的算法是误差的反向传播的学习算法,即为BP学习算法.BP算法是 Rumelhart等人在1986年 ...

最新文章

  1. 设计模式我学过呀,就是没用过
  2. [Winform]检测exe是否已经运行,并将其置顶
  3. “幕后英雄”之Backing Fields【Microsoft Entity Framework Core随笔】
  4. Linux ALSA声卡驱动之四:Control设备的创建
  5. 搜python题_python知识点汇总(可以搜Python题答案的APP)
  6. Eclipse安装Tomcat插件全攻略
  7. 高手常用的15 种 SQL 优化
  8. 2021中国AI商业落地典型案例
  9. php淘口令,淘口令使用说明
  10. c语言——求逆矩阵,伴随矩阵,行列式
  11. IDEA社区版配置Spring Boot开发
  12. git cz 代替 git commit,让提交信息更加明确
  13. Windows服务器无法配置IP
  14. 用计算机写作文教学难点,《用计算机写作文》教学设计
  15. matlab fill 图案填充,Matlab条形图中填充图案
  16. 怎样在word中批量替换文字?Word替换文字这一招你会吗?
  17. 机械硬盘通过USB外接到电脑,显示不出来
  18. 学计算机西电和中南,放弃中南大学等985高校,去南航、西电的强势专业到底值不值得呢?...
  19. PAT a1134
  20. erp系统服务器性能指标,ERP系统体检的三大关键指标

热门文章

  1. 增强环路现象!? 为你揭示云计算魔力!
  2. 设计模式-Builder Pattern
  3. Python的map() 函数
  4. Sparkstreaming实时开发详解
  5. 数据有什么特征和作用
  6. php连接mysql数据没反应_php无法连接mysql数据库的正确解决方法
  7. 高阶无模型自适应迭代学习控制学习记录
  8. btoa java,java的btoa、atob
  9. 磁盘一把锁一个感叹号_TBase中的一些锁
  10. Flink读写Mysql(Java版)