正文共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)
除此之外,之前我们定义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