使用tensorflow实现BP神经网络

mac2025-10-13  9

前言: 前一篇博客使用numpy实现了BP神经网络,梯度求解和参数的更新都需要自己来编程实现,一不小心就会搞错。然而,每一层的实现都有一个固定的套路,激活函数也就这么几个,有没有更好的框架来实现呢?额谷歌团队开发了一个深度学习框架tensorflow,将一些繁琐的东西封装好了供我们使用。tensorflow在工业界和学术界都使用广泛,所以,我们有必要学习使用tensorflow,今天小试牛刀,用tensorflow实现BP神经网络。

编程实现:

import tensorflow as tf import numpy as np #加载数据,2维特征,二分类 “”“ set,txt文件的数据格式形如: -0.017612 14.053064 0 -1.395634 4.662541 1 -0.752157 6.538620 0 -1.322371 7.152853 0 0.423363 11.054677 0 0.406704 7.067335 1 ”“” def loadData(): feature = [] lable = [] fr = open('set.txt') lines = fr.readlines() for line in lines: lineArr = line.strip().split() feature.append([lineArr[0], lineArr[1]]) lable.append([lineArr[-1]]) return np.array(feature, dtype='float32'), np.array(lable, dtype='float32') class BP(object): def __init__(self,layers): #每批次训练数据量 self.batch = 10 #设置特征和标签占位,方便在网络运行时喂数据 self.features = tf.placeholder(tf.float32,shape=[None,layers[0]],name='input') self.lables = tf.placeholder(tf.float32,shape=[None,layers[-1]],name='out') #分别设置2层连接的权重和偏置 self.W1 = tf.Variable(tf.random_normal([layers[0],layers[1]]),dtype=tf.float32,name='w1') self.b1 = tf.Variable(tf.constant(0.1,shape=[layers[1]])) self.W2 = tf.Variable(tf.random_normal([layers[1],layers[2]]),dtype=tf.float32,name='w2') self.b2 = tf.Variable(tf.constant(0.1,shape=[layers[2]])) #前向传播过程 self.hider = tf.matmul(self.features,self.W1)+self.b1 self.hider = tf.nn.sigmoid(self.hider) self.output = tf.matmul(self.hider,self.W2) + self.b2 self.output = tf.nn.sigmoid(self.output) #计算损失值 self.loss = tf.reduce_mean(tf.square(self.output-self.lables)) #最小化损失值,使用了梯度下降优化器 self.opt = tf.train.GradientDescentOptimizer(0.01).minimize(self.loss) #初始化以上变量,tensorflow 在运行网络之前一定要初始化变量 self.init = tf.global_variables_initializer() def train(self, features, lables): #开启一个会话 sess = tf.Session() sess.run(self.init) for i in range(1000): #随机抽取batch大小的数据,批量训练 rand_index = np.random.choice(len(features),size=self.batch) rand_features = features[rand_index] rand_lables = lables[rand_index] feed_dicts={self.features:rand_features,self.lables:rand_lables} #运行这个最小loss优化器 sess.run(self.opt,feed_dict=feed_dicts) #计算损失值 train_loss = sess.run(self.loss,feed_dicts) print('train_loss: ',train_loss) #保存模型 tf.train.Saver().save(sess,"model/") sess.close() if __name__== "__main__": features,lables = loadData() #特征2维,标签1维 bp = BP([2,7,1]) bp.train(features,lables)
最新回复(0)