基于Tensorflow实现多层感知机网络MLPs

正文共1232张图,1张图,预计阅读时间7分钟。

github:https://github.com/sladesha/deep_learning

之前在基于Tensorflow的神经网络解决用户流失概率问题写了一个MLPs的网络,很多人在问,其实这个网络看起来很清晰,但是却写的比较冗长,这边优化了一个版本更方便大家修改后直接使用。

多层感知机网络

直接和大家过一遍核心部分:

1din_all = tf.layers.batch_normalization(inputs=din_all, name='b1')
2
3layer_1 = tf.layers.dense(din_all, self.layers_nodes[0], activation=tf.nn.sigmoid,use_bias=True,kernel_regularizer=tf.contrib.layers.l2_regularizer(self.regularzation_rate),name='f1')
4layer_1 = tf.nn.dropout(layer_1, keep_prob=self.drop_rate[0])
5
6layer_2 = tf.layers.dense(layer_1, self.layers_nodes[1], activation=tf.nn.sigmoid,use_bias=True,kernel_regularizer=tf.contrib.layers.l2_regularizer(self.regularzation_rate),name='f2')
7layer_2 = tf.nn.dropout(layer_2, keep_prob=self.drop_rate[1])
8
9layer_3 = tf.layers.dense(layer_2, self.layers_nodes[2], activation=tf.nn.sigmoid,use_bias=True,kernel_regularizer=tf.contrib.layers.l2_regularizer(self.regularzation_rate),name='f3')

上次我们计算过程中,通过的是先定义好多层网络中每层的weight,在通过tf.matual进行层与层之间的计算,最后再通过tf.contrib.layers.l2_regularizer进行正则;而这次我们直接通过图像识别中经常使用的全连接(FC)的接口,只需要确定每层的节点数,通过layers_nodes进行声明,自动可以计算出不同层下的weight,更加清晰明了。另外,还增加了dropout的部分,降低过拟合的问题。

tf.layers.dense接口信息如下:

 1tf.layers.dense(
 2inputs,
 3units,
 4activation=None,
 5use_bias=True,
 6kernel_initializer=None,
 7bias_initializer=tf.zeros_initializer(),
 8kernel_regularizer=None,
 9bias_regularizer=None,
10activity_regularizer=None,
11kernel_constraint=None,
12bias_constraint=None,
13trainable=True,
14name=None,
15reuse=None
16)
  • inputs:必需,即需要进行操作的输入数据。
  • units:必须,即神经元的数量。
  • activation:可选,默认为 None,如果为 None 则是线性激活。
  • use_bias:可选,默认为 True,是否使用偏置。
  • kernel_initializer:可选,默认为 None,即权重的初始化方法,如果为 None,则使用默认的 Xavier 初始化方法。
  • bias_initializer:可选,默认为零值初始化,即偏置的初始化方法。
  • kernel_regularizer:可选,默认为 None,施加在权重上的正则项。
  • bias_regularizer:可选,默认为 None,施加在偏置上的正则项。
  • activity_regularizer:可选,默认为 None,施加在输出上的正则项。
  • kernel_constraint,可选,默认为 None,施加在权重上的约束项。
  • bias_constraint,可选,默认为 None,施加在偏置上的约束项。
  • trainable:可选,默认为 True,布尔类型,如果为 True,则将变量添加到 GraphKeys.TRAINABLE_VARIABLES 中。
  • name:可选,默认为 None,卷积层的名称。
  • reuse:可选,默认为 None,布尔类型,如果为 True,那么如果 name 相同时,会重复利用。

除此之外,之前我们定义y和y_的时候把1转化为[1,0],转化为了[0,1],增加了工程量,这次我们通过:

1cross_entropy_mean = -tf.reduce_mean(self.y_ * tf.log(self.output + 1e-24))
2self.loss = cross_entropy_mean

直接进行计算,避免了一些无用功。

最后,之前对于梯度的值没有进行限制,会导致整体模型的波动过大,这次优化中也做了修改,如果大家需要也可以参考一下:

1# 我们用learning_rate_base作为速率η,来训练梯度下降的loss函数解,对梯度进行限制后计算loss
2opt = tf.train.GradientDescentOptimizer(self.learning_rate_base)
3trainable_params = tf.trainable_variables()
4gradients = tf.gradients(self.loss, trainable_params)
5clip_gradients, _ = tf.clip_by_global_norm(gradients, 5)
6self.train_op = opt.apply_gradients(zip(clip_gradients, trainable_params), global_step=self.global_step)

MLPs是入门级别的神经网络算法,实际的工业开发中使用的频率也不高,后面我准备和大家过一下常见的FM、FFM、DeepFM、NFM、DIN、MLR等在工业开发中更为常见的网络,欢迎大家持续关注。

完整代码已经上传到Github中。(见文初提示)

原文链接:https://www.jianshu.com/p/5613f7eed046

查阅更为简洁方便的分类文章以及最新的课程、产品信息,请移步至全新呈现的“LeadAI学院官网”: www.leadai.org

原文发布于微信公众号 - 人工智能LeadAI(atleadai)

原文发表时间:2018-08-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据结构与算法

P1032 字串变换

题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则):      A1 -> B1      A2 -> B2 规则的含义为:在 A$中的子...

3356
来自专栏Deep Learning 笔记

CNN+MNIST+INPUT_DATA数字识别

TALK IS CHEAP,SHOW ME THE CODE,先从MNIST数据集下载脚本Input_data开始

3363
来自专栏北京马哥教育

python实现拼写检查器21行轻松搞定

引入 大家在使用谷歌或者百度搜索时,输入搜索内容时,谷歌总是能提供非常好的拼写检查,比如你输入 speling,谷歌会马上返回 spelling。 下面是用...

3524
来自专栏AI派

Numpy 修炼之道 (9)—— 广播机制

我们都知道,Numpy中的基本运算(加、减、乘、除、求余等等)都是元素级别的,但是这仅仅局限于两个数组的形状相同的情况下。

3163
来自专栏北京马哥教育

隐马尔科夫模型 python 实现简单拼音输入法

在网上看到一篇关于隐马尔科夫模型的介绍,觉得简直不能再神奇,又在网上找到大神的一篇关于如何用隐马尔可夫模型实现中文拼音输入的博客(http://sobuhu....

4257
来自专栏闪电gogogo的专栏

tensorflow

3201
来自专栏人工智能LeadAI

深度学习框架之一:Theano | Lasagne简单教程

参考Lasagne官网(http://lasagne.readthedocs.io/en/latest/)tutorial进行总结而来。 01 简介 Lasag...

4785
来自专栏有趣的Python

15- 深度学习之神经网络核心原理与算法-多gpu实现CNN图片分类

4703
来自专栏北京马哥教育

python实现拼写检查器21行轻松搞定

除了这段代码外,作为机器学习的一部分,肯定还应该有大量的样本数据,准备了big.txt作为我们的样本数据。

1534
来自专栏Python中文社区

基于matplotlib的2D/3D抽象网格和能量曲线绘制程序

專 欄 ❈PytLab,Python 中文社区专栏作者。主要从事科学计算与高性能计算领域的应用,主要语言为Python,C,C++。熟悉数值算法(最优化方法,蒙...

2677

扫码关注云+社区