Tensorflow自定义激活功能

时间:2018-04-19 14:45:47

标签: tensorflow activation-function

我使用TensorFlow实现了一个网络,并在我的代码中创建了以下模型:

def multilayer_perceptron(x, weights, biases):
    layer_1 = tf.add(tf.matmul(x, weights["h1"]), biases["b1"])
    layer_1 = tf.nn.relu(layer_1)
    out_layer = tf.add(tf.matmul(layer_1, weights["out"]), biases["out"])
    return out_layer

我初始化权重和偏见:

weights = {
    "h": tf.Variable(tf.random_normal([n_input, n_hidden_1])),
    "out": tf.Variable(tf.random_normal([n_hidden_1, n_classes]))
    }

biases = {
    "b": tf.Variable(tf.random_normal([n_hidden_1])),
    "out": tf.Variable(tf.random_normal([n_classes]))
    }

现在我想使用自定义激活功能。因此,我将tf.nn.relu(layer_1)替换为自定义激活函数custom_sigmoid(layer_1),其定义为:

def custom_sigmoid(x):
    beta = tf.Variable(tf.random.normal(x.get_shape[1]))
    return tf.sigmoid(beta*x)

beta是可训练的参数。我意识到这不起作用,因为我不知道如何实现衍生,以便TensorFlow可以使用它。

问题:如何在TensorFlow中使用自定义激活功能?我真的很感激任何帮助。

2 个答案:

答案 0 :(得分:2)

我试着回答我自己的问题。这就是我所做的以及似乎有用的东西:

首先我定义一个自定义激活功能:

$array1

然后我为激活函数创建权重:

def custom_sigmoid(x, beta_weights):
    return tf.sigmoid(beta_weights*x)

最后,我将beta_weights = { "beta1": tf.Variable(tf.random_normal([n_hidden_1])) } 添加到我的模型函数中,并替换beta_weights中的激活函数:

multilayer_perceptron()

答案 1 :(得分:1)

这就是自动差异化的美妙之处!只要您使用本质上可微分的所有张量流构造(在张量流中有一些函数只是非可微函数),您就不需要知道如何计算函数的导数。

对于其他一切,通过张量流为您计算导数,可以使用本质上可微分的任何操作组合,您永远不需要考虑渐变。通过在测试用例中使用tf.graidents来验证它,以显示tensorflow正在计算与成本函数相关的梯度。

对于好奇的自动区分,这是一个非常好的解释:

https://alexey.radul.name/ideas/2013/introduction-to-automatic-differentiation/

您可以通过检查它是否存在于集合tf.GraphKeys.TRAINABLE_VARIABLES中来确保beta是一个可训练的参数,这意味着优化器将计算其衍生w.r.t.成本并更新它(如果它不在你应该调查的那个集合中)。