Tensorflow实现BP神经网络

摘要:深度学习中基本模型为BP深度神经网络,其包括输入层、隐含层和输出层。输入层的神经元个数取决于数据集属性特征的个数,输出层神经元个数取决于划分类标的个数。BP神经网络通过梯度下降法不断调整权重矩阵和偏向进行调参,实现神经网络的训练。
  本人为初学者,自己尝试编写了tensorflow实现BP神经网络,输入层为三个神经元。隐含层为四个神经元、输出层为两个神经元,权重矩阵和偏向均为正态分布随机数。
  本人对神经网络进行的剖析,深度神经网络的详细解读:深度神经网络。
1、main函数:

#code by WangJianing
#email:851019059@qq.com or lygwjn@126.com
#time:2018.11.24import tensorflow as tf
import numpy as np
from neural_network import NN
#从文件中读取数据
def readFile(filename):"""read file from txt"""input_x = []input_y = []with open(filename,'r') as f:while True:line = f.readline()if line == '':breakelse:line = line.replace('\n','')sample = line.split(' ')                    x = sample[0:3]x = list(map(np.float32, x))y = sample[3]y = list(map(np.int32, y))input_x.append(x)input_y.append(y)return input_x,input_y#main函数
if __name__ == '__main__':config = tf.ConfigProto()config.gpu_options.allow_growth = Trueconfig.gpu_options.per_process_gpu_memory_fraction = 0.2  # need ~700MB GPU memorytrain_x,train_y = readFile('./data.txt')test_x,test_y = readFile('./data_test.txt')sample_size = [len(train_y),len(test_y)]print(sample_size)train_x = np.transpose(train_x)input_y = np.zeros([2,sample_size[0]])test_x = np.transpose(test_x)test_y = np.transpose(test_y)for ei,i in enumerate(train_y):input_y[i[0]][ei]=1# print(ei,i)#build neural networkn = NN(train_x, input_y, test_x, test_y, 'GradientDescentOptimizer', sample_size, config, learning_rate=0.05)#trainn.train1()#testn.test()

2、神经网络类:

#code by WangJianing
#email:851019059@qq.com or lygwjn@126.com
#time:2018.11.24import tensorflow as tf
import numpy as npclass NN(object):"""docstring for NN"""def __init__(self, train_x, train_y, test_x, test_y, optimize, sample_size, config, learning_rate=0.05):super(NN, self).__init__()self.train_x = tf.to_float(train_x, name='ToFloat1')self.train_y = tf.to_float(train_y, name='ToFloat2')self.test_x = tf.to_float(test_x, name='ToFloat3')self.test_y = tf.to_float(test_y, name='ToFloat4')self.learning_rate = learning_rateself.optimize = optimizeself.sess = tf.Session()        self.sample_size = sample_sizeself.config = configself.para = [[],[],[],[],0]self.bildGraph()# self.train()#创建计算图(训练时)def bildGraph(self):self.parameter_op()self.towards_op()self.loss_op()self.backwords_op()# self.test_towords()self.init_op()#创建评估测试计算图def testBuildGraph(self):self.parameter_op()self.towards_op()#创建参数初始化结点def parameter_op(self):self.weight1 = tf.Variable(tf.random_normal([4, 3], stddev=0.03), dtype=tf.float32, name='weight1')self.bias1 = tf.Variable(tf.random_normal([4, 1]), dtype=tf.float32, name='bias1')self.weight2 = tf.Variable(tf.random_normal([2, 4], stddev=0.03), dtype=tf.float32, name='weight2')self.bias2 = tf.Variable(tf.random_normal([2, 1]), dtype=tf.float32, name='bias2')self.input_xx = tf.Variable(self.train_x,name='xx1')self.input_xx_test = tf.Variable(self.test_x,name='xx3')self.input_yy = tf.Variable(self.train_y,name='xx2')#该方法是将一个一维向量v复制size次并拼起来def appendVector(self, v, size, kind):_v = tf.transpose(v)[0]# print('_v=',_v)new_v = []if kind == 0:for i in range(size):new_v.append(_v)self.bias1_train = tf.Variable(new_v, dtype=tf.float32, name='bias1_train')self.bias1_train = tf.transpose(self.bias1_train)elif kind == 1:for i in range(size):new_v.append(_v)self.bias2_train = tf.Variable(new_v, dtype=tf.float32, name='bias2_train')self.bias2_train = tf.transpose(self.bias2_train) elif kind == 2:for i in range(size):new_v.append(_v)self.bias1_test = tf.Variable(new_v, dtype=tf.float32, name='bias1_test')self.bias1_test = tf.transpose(self.bias1_test) elif kind == 3:for i in range(size):new_v.append(_v)self.bias2_test = tf.Variable(new_v, dtype=tf.float32, name='bias2_test')self.bias2_test = tf.transpose(self.bias2_test)  #前向传播def towards_op(self):self.m1 = tf.matmul(self.weight1, self.input_xx, name='matmul1')# print('m1=',self.m1)self.appendVector(self.bias1, self.sample_size[0], 0)# print('self.bias1_train=',self.bias1_train)self.z1 = tf.add(self.m1 ,self.bias1_train, name='z1')self.a1 = tf.nn.sigmoid(self.z1,name='a1')self.appendVector(self.bias2, self.sample_size[0], 1)self.z2 = tf.add(tf.matmul(self.weight2, self.a1, name='matmul2'),self.bias2_train, name='z2')self.a2 = tf.transpose(tf.nn.softmax(tf.transpose(self.z2,[1,0]),name='a2'),[1,0])#测试时前向传播def test_towords(self):self.t_m1 = tf.matmul(self.para[0], self.input_xx_test, name='matmul3')self.appendVector(self.para[2], self.sample_size[1], 2)self.t_z1 = tf.add(self.t_m1 ,self.bias1_test, name='z1')self.t_a1 = tf.nn.sigmoid(self.t_z1,name='a1')self.appendVector(self.para[3], self.sample_size[1], 3)self.t_z2 = tf.add(tf.matmul(self.para[1], self.t_a1, name='matmul4'),self.bias2_test, name='z2')self.t_a2 = tf.transpose(tf.nn.softmax(tf.transpose(self.t_z2,[1,0]),name='a2'),[1,0])#损失函数def loss_op(self):self.loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=self.train_y, logits=self.a2))self.optimizer = tf.train.GradientDescentOptimizer(self.learning_rate)#反向传播def backwords_op(self):self.train = self.optimizer.minimize(self.loss)#初始化所有全局变量def init_op(self):self.init_op = tf.global_variables_initializer()#训练def train1(self):with tf.Session(config=tf.ConfigProto(gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction=0.333))) as sess:sess.run(self.init_op)for i in range(10):sess.run(self.train)self.para = [sess.run(self.weight1),sess.run(self.weight2),sess.run(self.bias1),sess.run(self.bias2),sess.run(self.loss)]print("==========step",i,"==========")print("weight1:\n",self.para[0],"\nb1:\n",self.para[2])print("\nweight2:\n",self.para[1],"\nb2:\n",self.para[3])print("\nloss=",self.para[4])#测试def test(self):self.test_towords()with tf.Session(config=tf.ConfigProto(gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction=0.333))) as sess:sess.run(tf.global_variables_initializer())sess.run([self.bias1_test,self.bias2_test])#每个样本的每个类标取值的概率predict_proba = sess.run(self.t_a2)         #预测每个样本的类标(0或1)predict_proba = np.transpose(predict_proba)print('\npredict_proba=',predict_proba)predict_value = np.argmax(predict_proba,axis=1)print('\npredic_value=',predict_value)#计算准确率:# accuracy = 0# # print(test_y[0][0])# for ei,i in enumerate(predict_value):#     if i == self.test_y[0][ei]:#         accuracy += 1# accuracy  /= sample_size# print('\naccuracy=',accuracy)

  可以详细阅读程序,并尝试在自己的PC上运行。若使用自己的数据集,可修改程序中的相应超参数(学习率、神经网络各层的神经网络个数、train1函数中迭代次数、参数初始化方式、最优化策略、损失函数等)。

博客记录着学习的脚步,分享着最新的技术,非常感谢您的阅读,本博客将不断进行更新,希望能够给您在技术上带来帮助。

Tensorflow实现BP神经网络相关推荐

  1. Tensorflow:BP神经网络权值初始化

    一.Tensorflow入门 1.计算图: 每一个计算都是计算图上的一个结点,而节点之间的边描述了计算之间的依赖关系. 支持通过tf.Graph生成新的计算图,不同计算图上的张量和运算不会共享. Te ...

  2. 基于Tensorflow框架的BP神经网络分类小案例--蚊子分类

    (案例):利用bp神经网络预测蚊子种类,第三列目标值为0.9的属于不咬人的A类,目标值为0.1的属于咬人的B类,特征集第一列是翼长,第二列是触角长 如下有20个样本数据: data=[[1.78,1. ...

  3. 8.3 TensorFlow BP神经网络构建与超参数的选取

    前言 之前的8.1 构建回归模型的重点在于计算图概念,8.2则介绍一些在整个流程中更靠后的部分:损失函数,优化函数,以及一些其他常用的函数.而本片中的重点在于构建计算图,与模型的训练与测试BP 代码与 ...

  4. TensorFlow使用--MNIST分类学习(BP神经网络)

    目录 测试结果:根据测试集和验证集的验证,训练好的模型识别率可以达到96% 代码块 代码分块解析 保存训练好的神经网络并调用 小测试:将MNIST数据集中的图片显示出来 传送门 激活函数相关 soft ...

  5. 【机器学习】基于AutoEncoder的BP神经网络的tensorflow实现

    [机器学习]基于AutoEncoder的BP神经网络的tensorflow实现 一.基于AutoEncoder的BP神经网络 1.1.BP神经网络 1.1.1.BP神经网络结构 1.1.2.BP神经网 ...

  6. BP神经网络实例及代码分析(python+tensorflow实现)

    代码功能:对山东某地区历史温度数据进行BP神经网络训练,通过前三小时温度数据,预测第四小时温度值. 数据来源:2016年4月份山东某地区温度数据,共30*24小时.1日到20日(20*24小时)数据为 ...

  7. 小生不才:tensorflow实战01-基于bp神经网络的手写数字识别

    前言 利用搭建网络八股,使用简单的bp神经网络完成手写数字的识别. 搭建过程 导入相应的包 获取数据集,划分数据集和测试集并进行简单处理(归一化等) 对数据进行乱序处理 定义网络结构 选择网络优化器以 ...

  8. Tensorflow BP神经网络多输出模型在生产管理中应用实践

    本文以某企业组织建设为研究对象,采用大数据神经网络算法中的BP算法, 基于该算法建立了企业组织建设评价模型,最后基于Tensorflow的神经网络开发包实现模型并训练.根据评价结果可评价企业组织建设状 ...

  9. 深度学习--TensorFlow(4)BP神经网络(损失函数、梯度下降、常用激活函数、梯度消失梯度爆炸)

    目录 一.概念与定义 二.损失函数/代价函数(loss) 三.梯度下降法 二维w与loss: 三维w与loss: 四.常用激活函数 1.softmax激活函数 2.sigmoid激活函数 3.tanh ...

最新文章

  1. J. Med. Chem. | 通过负向设计优化筛选化合物库
  2. 魔改ResNet反超Transformer再掀架构之争!作者说“没一处是创新”,这些优化trick值得学...
  3. catia过载属性使用方法_catia简明操作手册
  4. Qt Designer 编辑Tab顺序
  5. weka: FCBFSearch
  6. mysql配置多个域名访问吗,tomcat部署多个项目,通过域名解析访问,不同的网站...
  7. java 线程池 状态_【Java多线程】线程状态、线程池状态
  8. CF1313D:Happy New Year(状压dp)
  9. [css] sass是怎么定义变量的?
  10. golang https 代理_代理,生活中随处可见,Go中如何进行 HTTPS 代理呢?
  11. PHP学习总结(9)——PHP入门篇之WAMPServer服务控制面板介绍
  12. shell脚本一键安装二进制Apache
  13. 学生管理系统数据库设计
  14. 新员工入职表_员工离职率过高,只要三步骤,就能轻松有效控制
  15. java 合并excel单元格
  16. keil出现同一个宏定义赋值在多个文件中结果不一致问题
  17. 第三章 面向对象(上)
  18. 计算机网络安全在电子商务中的应用 魏娟,[网络安全最新技术论文]网络安全技术探究...
  19. JS之FormData对象
  20. 基于两阶段鲁棒优化算法的微网多电源容量配置(Matlab)

热门文章

  1. 中国科学技术大学计算机怎么样,中国科学技术大学计算机科学与技术学院
  2. 朗强科技:HDMI画面分割器原理、功能、分割模式、应用
  3. 百度地图 api php,百度地图API使用方法详解
  4. 【python实战】我在大学靠帮别人清理C盘赚够了伙食费
  5. 创建两个矩阵,编程实现两个矩阵相加。
  6. HADAMARD不等式的证明
  7. 禅道测试用例自动化录入
  8. 推荐一款自动向hackerone发送漏洞报告的扫描器
  9. 【调剂】福建省网络安全与密码技术重点实验室(福建师范大学)网络与信息安全团队招收硕士...
  10. PeopleSoft translate value 排序