我使用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中使用自定义激活功能?我真的很感激任何帮助。
答案 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.成本并更新它(如果它不在你应该调查的那个集合中)。