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

本文以某企业组织建设为研究对象,采用大数据神经网络算法中的BP算法, 基于该算法建立了企业组织建设评价模型,最后基于Tensorflow的神经网络开发包实现模型并训练。根据评价结果可评价企业组织建设状况,从而采取相应的预防措施,对今后企业管理有着积极的作用。

举例如下图所示“企业组织建设”评价指标体系为两级指标,其中,二级指标是人工量化打分或者实际取值,得出一级指标得分,最后给出总评价量化得分。模型设计为:二级指标得分为输入数据,一级指标和总评分是预测输出,而且输出为回归问题数值型(与分类问题区别)。
在这里插入图片描述

数据集处理

对于神经网络训练数据集,使用Excel表存储,如下图所示二维表。
在这里插入图片描述
在这里插入图片描述

    del_name = ['总评价','持证上岗','组织赋能','合规管理','员工赋能','绩效管理']
    #拆分特征与标签
    labels = pd.DataFrame(data,columns = del_name)
    labels = labels.values
    
    #labels = labels.reshape(labels.shape[0],-1) #单列处理方式,转换为多行
    inputs = data.drop(del_name,axis = 1).values
  1. 输入数据:
    表中G到V,16列数据。
  2. 输出数据:
    表中A到F,6列数据[‘总评价’,‘持证上岗’,‘组织赋能’,‘合规管理’,‘员工赋能’,‘绩效管理’]。

神经网络模型

反向传播算法(即BP神经网络)适合于多层神经元网络的一种学习算法,它建立在梯度下降法的基础上。BP网络的输入输出关系实质上是一种映射关系:一个n输入m输出的BP神经网络所完成的功能是从n维欧氏空间向m维欧氏空间中一有限域的连续映射,这一映射具有高度非线性。它的信息处理能力来源于简单非线性函数的多次复合,因此具有很强的函数复现能力。
在这里插入图片描述

关于激活函数

常见问题类型的最后一层激活和损失函数,下表可以帮我们你进行选择正确的最后一层激活和损失函数。详见[4]

问题类型最后一层激活损失函数
二分类问题sigmoidbinary_crossentropy
多分类、单标签问题softmaxcategorical_crossentropy
多分类、多标签问题sigmoidbinary_crossentropy
回归到任意值mse
回归到0~1、范围内的值sigmoidmse或binary_crossentropy
  1. tanh
    g ( x ) = e x − e − x e x + e − x g(x)=\frac{e^{x}-e^{-x}}{e^x + e^{-x}} g(x)=ex+exexex ,如下图所示。
    在这里插入图片描述
  2. sigmoid
    g ( x ) = 1 1 + e − x g(x)=\frac{1}{1+e^{-x}} g(x)=1+ex1 ,如下图所示。
    在这里插入图片描述

Tensorflow实现说明

搭建N×K×M三层BP神经网络

(1)定义神经元参数
神经元基本定义是 y = w x + b y=wx+b y=wx+b,这里主要是定义参数 w w w b b b

#定义神经元
def NN(h_in,h_out,layer='1'):
    w = tf.Variable(tf.truncated_normal([h_in,h_out],stddev=0.1),name='weights' +layer )
    b = tf.Variable(tf.zeros([h_out],dtype=tf.float32),name='biases' + layer)
    
    return w,b

(2)定义隐藏层神经元
y = t a n h ( w 1 x + b 1 ) y=tanh(w_{1}x + b_{1}) y=tanh(w1x+b1),Tensorflow实现如下所示,这里的 x x x y y y是张量。

    #定义网络参数
    w1,b1 = NN(in_units,layers[0],'1')   #定义第一层参数
    #定义网络隐藏层
    #定义前向传播过程
    h1 = tf.nn.tanh(tf.add(tf.matmul(x,w1),b1))

训练并持久化(保存)模型

    saver = tf.train.Saver()  #定义saver
    #随机梯度下降算法训练参数
    with tf.Session() as sess:
         ......
         saver.save(sess, 'save_m/BP_model.ckpt') #模型储存位置   

使用(加载)持久化模型

# 根据输入预测结果
def BPNN_Pprediction(input_x):    
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        saver = tf.train.import_meta_graph('save_m/BP_model.ckpt.meta')
        saver.restore(sess,tf.train.latest_checkpoint('save/'))
      
        graph = tf.get_default_graph()
        # 获取保存到模型中所定义变量名称
        x = graph.get_tensor_by_name("x:0")
        y_ = graph.get_tensor_by_name("y_:0")
        # 输出预测结果
        y_conv = graph.get_tensor_by_name('y_conv:0')
        keep_prob = graph.get_tensor_by_name("keep_prob:0")

        ret = sess.run(y_conv, feed_dict={x:input_x,keep_prob:1.0})
        #y = sess.run(tf.argmax(ret,1))  # 用于分类问题,取最大概率
        print("预测结果:{}".format(ret))

注意:此处加载方法是加载模型定义和模型参数,有别于只加载模型参数的方法。解释说明详见参加文档[2]

代码

import numpy as np
import tensorflow as tf
import pandas as pd
#数据源:以专家投票频次与评分标准向量积算出指标评分,与PCE保持一致。
def get_DataFromExcel():
    df = pd.read_excel('BP_random.xlsx') 

    return df
# 生成样例数据集
def generate_data():
    data = get_DataFromExcel()
    del_name = ['总评价','持证上岗','组织赋能','合规管理','员工赋能','绩效管理']
    #拆分特征与标签
    labels = pd.DataFrame(data,columns = del_name)
    labels = labels.values
    
    #labels = labels.reshape(labels.shape[0],-1) #单列处理方式,转换为多行
    inputs = data.drop(del_name,axis = 1).values
       
    return inputs, labels

#定义神经元
def NN(h_in,h_out,layer='1'):
    w = tf.Variable(tf.truncated_normal([h_in,h_out],stddev=0.1),name='weights' +layer )
    b = tf.Variable(tf.zeros([h_out],dtype=tf.float32),name='biases' + layer)
    
    return w,b

#定义BP神经网络
def BP_NN(in_units,layers=[10,5,6],dropout=True):
    #定义输入变量
    x = tf.placeholder(dtype=tf.float32,shape=[None,in_units],name='x')
    num = len(layers)   # 网络层数
    #定义网络参数
    w1,b1 = NN(in_units,layers[0],'1')   #定义第一层参数
    w2,b2 = NN(layers[0],layers[1],'2')   #定义第二层参数
    #定义网络隐藏层
    #定义前向传播过程
    h1 = tf.nn.tanh(tf.add(tf.matmul(x,w1),b1))
    #定义dropout保留的节点数量
    keep_prob = tf.placeholder(dtype=tf.float32,name='keep_prob')
    if dropout:
            #使用dropout
            h1_drop = tf.nn.dropout(h1,rate = 1 - keep_prob)        #Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.
    else:
        h1_drop = h1
    # 针对三层网络
    if num > 2:
        w3,b3 = NN(layers[1],layers[2],'3')   #定义第三一层参数
        # 定义第二层隐藏层
        h2 = tf.nn.tanh(tf.add(tf.matmul(h1_drop,w2),b2))
        #h2 = tf.add(tf.matmul(h1_drop,w2),b2)
        # 定义输出层
        y_conv = tf.nn.sigmoid(tf.add(tf.matmul(h2,w3),b3),name='y_conv') 
    else:
        y_conv = tf.nn.sigmoid(tf.add(tf.matmul(h1_drop,w2),b2),name='y_conv') 
        #y_conv = tf.add(tf.matmul(h1_drop,w2),b2) 

    #定义输出变量    
    y_ = tf.placeholder(dtype=tf.float32,shape=[None,layers[num - 1]],name='y_')

    #定义损失函数及反向传播方法。
    loss_mse = tf.reduce_mean(tf.square(y_conv-y_)) 
    #均方误差MSE损失函数
    train_step = tf.train.GradientDescentOptimizer(0.002).minimize(loss_mse)    
    correct_pred = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
    
    return x,y_,loss_mse,train_step,correct_pred,keep_prob

def BPNN_train():
    inputs, labels = generate_data()
    # 定义周期、批次、数据总数、遍历一次所有数据需的迭代次数
    n_epochs = 3
    batch_size = 6
    
    # 使用from_tensor_slices将数据放入队列,使用batch和repeat划分数据批次,且让数据序列无限延续
    dataset = tf.data.Dataset.from_tensor_slices((inputs, labels))
    dataset = dataset.batch(batch_size).repeat()
    
    # 使用生成器make_one_shot_iterator和get_next取数据
    iterator = dataset.make_one_shot_iterator()
    next_iterator = iterator.get_next()
    
    #定义神经网络的参数
    in_units = 16  #输入16个指标,返回一个评分
        
    # 定义三层BP神经网络,层数及神经元个数通过layers参数确定,两层[5,3],只支持2或3层,其他无意义
    x,y_,loss_mse,train_step,correct_pred,keep_prob = BP_NN(in_units,layers=[8,8,6],dropout=False)
    
    saver = tf.train.Saver()  #定义saver
    #随机梯度下降算法训练参数
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
    
        for i in range(10000):
            batch_x,batch_y = sess.run(next_iterator)
    
            _,total_loss = sess.run([train_step,loss_mse], feed_dict={x:batch_x,y_:batch_y,keep_prob:0.8})
            
            if i%100 == 0:
                #train_accuracy = accuracy.eval(session = sess,feed_dict={x:batch_x, y_: batch_y, keep_prob: 1.0}) # 用于分类识别,判断准确率
                #print ("step {}, training accuracy {}".format(i, train_accuracy))
                print ("step {}, total_loss {}".format(i, total_loss))           # 用于趋势回归,预测值
            
        saver.save(sess, 'save_m/BP_model.ckpt') #模型储存位置

# 根据输入预测结果
def BPNN_Pprediction(input_x):    
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        saver = tf.train.import_meta_graph('save_m/BP_model.ckpt.meta')
        saver.restore(sess,tf.train.latest_checkpoint('save/'))
      
        graph = tf.get_default_graph()
        x = graph.get_tensor_by_name("x:0")
        y_ = graph.get_tensor_by_name("y_:0")
        # 输出预测结果
        y_conv = graph.get_tensor_by_name('y_conv:0')
        keep_prob = graph.get_tensor_by_name("keep_prob:0")

        ret = sess.run(y_conv, feed_dict={x:input_x,keep_prob:1.0})
        #y = sess.run(tf.argmax(ret,1))  # 用于分类问题,取最大概率
        print("预测结果:{}".format(ret))

def main():
    train = True
    #train = False
    
    if train:
        BPNN_train()
    
    input_x = [[0.54,0.56,0.78,0.44,0.48,0.72,0.72,0.54,0.44,0.68,0.68,0.8,0.84,0.84,0.74,0.8]]
    BPNN_Pprediction(input_x)
    
    return
        

if __name__ == '__main__':
    main()

注:对于隐藏层一般使用relu激活函数,对于输出层如果用于分类则采用sigmoid激活函数,用于回归则采用线性激活函数。

关于数据来源问题

本文训练集来源于《模糊层次综合分析法Python实践及相关优缺点分析》所获得的数据(文中的样例是模拟随机产生的数据),在实际工作中,可以通过这两种算法来验证评价结果。BP神经网络有较好的成长性,适应工作需要,便于调整指标,如果能通过大量模糊样本的学习,将使模型有较好的泛化能力。

由于作者水平有限,欢迎反馈讨论。

参考:
[1]《BP神经网络学习与实践》 CSDN博客 ,肖永威 2019年11月
[2]《如何使用训练好的Tensorflow模型的案例及分析》 CSDN博客 ,肖永威 2019年5月
[3]《TensorFlow CNN卷积神经网络实现工况图分类识别(一)》 CSDN博客 , 肖永威 ,2019年3月
[4]《《python深度学习》笔记》 CSDN博客 ,lxiao428 , 2019年3月

<ul style="color:rgba(0,0,0,.560784);font-size:14px;background-color:#FFFFFF;"> <li> <span>Tensorflow2.0介绍:</span> </li> </ul> <p style="color:rgba(0,0,0,.560784);font-size:14px;background-color:#FFFFFF;"> tensorflow是GOOGLE在2015年底发布的一款深度学习框架,也是目前全世界用得最多,发展最好的深度学习框架。2019年3月8日,GOOGLE发布最新tensorflow2版本。新版本的tensorflow有很多新特征,更快更容易使用更人性化。但是老版的tensorflow程序在新版本几乎都无法继续使用,所以我们有必要学习新版tensorflow2的新用法。 </p> <ul style="color:rgba(0,0,0,.560784);font-size:14px;background-color:#FFFFFF;"> <li> <span>课程介绍:</span> </li> </ul> <p style="color:rgba(0,0,0,.560784);font-size:14px;background-color:#FFFFFF;"> 我们的这门课程适合小白学习,也适合有基础的同学学习。课程会从0开始学习,从python环境安装,python入门,numpy,pandas,matplotlib使用,深度学习基础,一直讲到tensorflow基础,进阶,项目实战。不管你是0基础小白,想进入AI行业,还是有一定基础,想学习最新的tensorflow2的使用,都适合我们这门课程。 </p> <ul style="color:rgba(0,0,0,.560784);font-size:14px;background-color:#FFFFFF;"> <li> <span>讲师介绍:</span> </li> </ul> <p style="color:rgba(0,0,0,.560784);font-size:14px;background-color:#FFFFFF;"> 覃秉丰,物理系毕业转AI行业,想转行同学可以找我聊聊。机器学习、深度学习神经网络领域多年研究开发授课经验,精通算法原理与编程实践;曾完成过多项图像识别、目标识别、语音识别等企业项目,一线实战经验丰富;长期为多家包括世界五百强在内的大型企业总部做人工智能技术内训服务(国移动、国银行,华夏银行,国太平洋,国家电网、海油等)。上课特点:公式尽量一个一个符号推,代码尽量一行一行讲,希望所有人都能学有所得。 </p>
相关推荐
【目录】- MATLAB神经网络30个案例分析(开发实例系列图书) 第1章 BP神经网络的数据分类——语音特征信号分类1 本案例选取了民歌、古筝、摇滚和流行四类不同音乐,用BP神经网络实现对这四类音乐的有效分类。 第2章 BP神经网络的非线性系统建模——非线性函数拟合11 本章拟合的非线性函数为y=x21+x22。 第3章 遗传算法优化BP神经网络——非线性函数拟合21 根据遗传算法和BP神经网络理论,在MATLAB软件编程实现基于遗传算法优化的BP神经网络非线性系统拟合算法。 第4章 神经网络遗传算法函数极值寻优——非线性函数极值寻优36 对于未知的非线性函数,仅通过函数的输入输出数据难以准确寻找函数极值。这类问题可以通过神经网络结合遗传算法求解,利用神经网络的非线性拟合能力和遗传算法的非线性寻优能力寻找函数极值。 第5章 基于BP_Adaboost的强分类器设计——公司财务预警建模45 BP_Adaboost模型即把BP神经网络作为弱分类器,反复训练BP神经网络预测样本输出,通过Adaboost算法得到多个BP神经网络弱分类器组成的强分类器。 第6章 PID神经元网络解耦控制算法——多变量系统控制54 根据PID神经元网络控制器原理,在MATLAB编程实现PID神经元网络控制多变量耦合系统。 第7章 RBF网络的回归——非线性函数回归的实现65 本例用RBF网络拟合未知函数,预先设定一个非线性函数,如式y=20+x21-10cos(2πx1)+x22-10cos(2πx2)所示,假定函数解析式不清楚的情况下,随机产生x1,x2和由这两个变量按上式得出的y。将x1,x2作为RBF网络的输入数据,将y作为RBF网络的输出数据,分别建立近似和精确RBF网络进行回归分析,并评价网络拟合效果。 第8章 GRNN的数据预测——基于广义回归神经网络的货运量预测73 根据货运量影响因素的分析,分别取国内生产总值(GDP),工业总产值,铁路运输线路长度,复线里程比重,公路运输线路长度,等级公路比重,铁路货车数量和民用载货汽车数量8项指标因素作为网络输入,以货运总量,铁路货运量和公路货运量3项指标因素作为网络输出,构建GRNN,由于训练数据较少,采取交叉验证方法训练GRNN神经网络,并用循环找出最佳的SPREAD。 第9章 离散Hopfield神经网络的联想记忆——数字识别81 根据Hopfield神经网络相关知识,设计一个具有联想记忆功能的离散型Hopfield神经网络。要求该网络可以正确地识别0~9这10个数字,当数字被一定的噪声干扰后,仍具有较好的识别效果。 第10章 离散Hopfield神经网络的分类——高校科研能力评价90 某机构对20所高校的科研能力进行了调研和评价,试根据调研结果较为重要的11个评价指标的数据,并结合离散Hopfield神经网络的联想记忆能力,建立离散Hopfield高校科研能力评价模型。 第11章 连续Hopfield神经网络的优化——旅行商问题优化计算100 现对于一个城市数量为10的TSP问题,要求设计一个可以对其进行组合优化的连续型Hopfield神经网络模型,利用该模型可以快速地找到最优(或近似最优)的一条路线。 第12章 SVM的数据分类预测——意大利葡萄酒种类识别112 将这178个样本的50%做为训练集,另50%做为测试集,用训练集对SVM进行训练可以得到分类模型,再用得到的模型对测试集进行类别标签预测。 第13章 SVM的参数优化——如何更好的提升分类器的性能122 本章要解决的问题就是仅仅利用训练集找到分类的最佳参数,不但能够高准确率的预测训练集而且要合理的预测测试集,使得测试集的分类准确率也维持在一个较高水平,即使得得到的SVM分类器的学习能力和推广能力保持一个平衡,避免过学习和欠学习状况发生。 第14章 SVM的回归预测分析——上证指数开盘指数预测133 对上证指数从1990.12.20-2009.08.19每日的开盘数进行回归分析。 第15章 SVM的信息粒化时序回归预测——上证指数开盘指数变化趋势和变化空间预测141 在这个案例里面我们将利用SVM对进行模糊信息粒化后的上证每日的开盘指数进行变化趋势和变化空间的预测。 若您对此书内容有任何疑问,可以凭在线交流卡登录文论坛与作者交流。 第16章 自组织竞争网络在模式分类应用——患者癌症发病预测153 本案例给出了一个含有60个个体基因表达水平的样本。每个样本测量了114个基因特征,其前20个样本是癌症病人的基因表达水平的样本(其还可能有子类), 间的20个样本是正常人的基因表达信息样本, 余下的20个样本是待检测的样本(未知它们是否正常)。以下将设法找出癌症与正常样本在基因表达水平上的区
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页