使用tensorflow实现BP神经网络

前言:
前一篇博客使用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)

你可能感兴趣的:(深度学习)