【深度学习 激活函数】激活函数tensorflow使用宝典

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。人工智能教程

1、总体效果比较

 ELU > leaky ReLU(及其变体)> ReLU > tanh > sigmoid。

如果你关心运行时性能,那么你可能喜欢 leaky ReLU超过ELU。 如果你不想调整另一个超参数,你可以使用前面提到的默认的 α 值(leaky ReLU 为 0.01,ELU 为 1)。 如果你有充足的时间和计算能力,你可以使用交叉验证来评估其他激活函数,特别是如果你的神经网络过拟合,则为RReLU; 如果您拥有庞大的训练数据集,则为 PReLU。

2、详细介绍

2.1 sigmod 激活函数

激活函数sigmod 曲线,可以看到当输入变大(负或正)时,函数饱和在 0或 1,导数非常接近 0。因此,当反向传播开始时, 它几乎没有梯度通过网络传播回来,而且由于反向传播通过顶层向下传递,所以存在的小梯度不断地被稀释,因此较低层确实没有任何东西可用。

import tensorflow as tf
hidden1 = tf.layers.dense(X, n_hidden1, activation=tf.nn.sigmoid, name="hidden1")

2.2 tanh 激活函数

import tensorflow as tf
hidden1 = tf.layers.dense(X, n_hidden1, activation=tf.nn.tanh, name="hidden1")

2.3 relu 激活函数

ReLU激活功能并不完美。 它有一个被称为 “ReLU 死区” 的问题:在训练过程中,一些神经元有效地死亡,意味着它们停止输出 0 以外的任何东西。在某些情况下,你可能会发现你网络的一半神经元已经死亡,特别是如果你使用大学习率。 在训练期间,如果神经元的权重得到更新,使得神经元输入的加权和为负,则它将开始输出 0 。当这种情况发生时,由于当输入为负时,ReLU函数的梯度为0,神经元不可能恢复生机。

import tensorflow as tf
hidden1 = tf.layers.dense(X, n_hidden1, activation=tf.nn.relu, name="hidden1")

2.4 leakyrelu 激活函数

为了解决这个问题,你可能需要使用 ReLU 函数的一个变体,比如 leaky ReLU。这个函数定义为 LeakyReLUα(z)= max(αz,z)
TensorFlow 没有针对 leaky ReLU 的预定义函数,但是很容易定义:

import tensorflow as tf
def leaky_relu(z, name=None):
	return tf.maximum(0.01 * z, z, name=name)

hidden1 = tf.layers.dense(X, n_hidden1, activation=leaky_relu, name="hidden1")

2.5 ELU 激活函数

2015 年的一篇论文中提出了一种称为指数线性单元(exponential linear unit,ELU)的新的激活函数,在他们的实验中表现优于所有的 ReLU 变体:训练时间减少,神经网络在测试集上表现的更好。
ELU 激活函数的主要缺点是计算速度慢于 ReLU 及其变体(由于使用指数函数),但是在训练过程中,这是通过更快的收敛速度来补偿的。 然而,在测试时间,ELU 网络将比 ReLU 网络慢。

TensorFlow 提供了一个可以用来建立神经网络的 elu() 函数。

import tensorflow as tf
hidden1 = tf.layers.dense(X, n_hidden1, activation=tf.nn.elu, name="hidden1")

你可能感兴趣的:(【深度学习 激活函数】激活函数tensorflow使用宝典)