如何在 Tensorflow 中使用可训练参数制作自定义激活函数

时间:2021-06-03 15:52:12

标签: python tensorflow machine-learning keras

想了解如何使用 python 中的 tensorflow 为具有两个可学习参数的神经网络定义用户定义的激活函数。

任何参考资料或案例研究都会有帮助吗?

谢谢

1 个答案:

答案 0 :(得分:2)

如果您在模型中创建 tf.Variable,Tensorflow 将跟踪其状态并将其作为任何其他参数进行调整。这样的 tf.Variable 可以是您的激活函数的参数。

让我们从一些玩具数据集开始。

import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Dense
import matplotlib.pyplot as plt
from tensorflow.keras import Model
from sklearn.datasets import load_iris
iris = load_iris(return_X_y=True)

X = iris[0].astype(np.float32)
y = iris[1].astype(np.float32)

ds = tf.data.Dataset.from_tensor_slices((X, y)).shuffle(25).batch(8)

现在,让我们创建一个 tf.keras.Model 并制作一个参数化 ReLU 函数,其斜率是可学习的,也是最小值(对于经典 ReLU 通常为 0)。现在让我们从 PReLU 斜率/最小值 0.1 开始。

slope_values = list()
min_values = list()


class MyModel(Model):
    def __init__(self):
        super(MyModel, self).__init__()
        self.prelu_slope = tf.Variable(0.1)
        self.min_value = tf.Variable(0.1)

        self.d0 = Dense(16, activation=self.prelu)
        self.d1 = Dense(32, activation=self.prelu)
        self.d2 = Dense(3, activation='softmax')

    def prelu(self, x):
        return tf.maximum(self.min_value, x * self.prelu_slope)

    def call(self, x, **kwargs):
        slope_values.append(self.prelu_slope.numpy())
        min_values.append(self.min_value.numpy())
        x = self.d0(x)
        x = self.d1(x)
        x = self.d2(x)
        return x


model = MyModel()

现在,让我们训练模型(在 Eager 模式下,我们可以保持斜率值)。

model.compile(loss='sparse_categorical_crossentropy',
              optimizer='adam', run_eagerly=True)

history = model.fit(ds, epochs=500, verbose=0)

让我们看看坡度。 Tensorflow 正在将其调整为该任务的最佳斜率。正如您将看到的,它以 1 的斜率逼近非参数 ReLU。

plt.plot(slope_values, label='Slope Value')
plt.plot(min_values, label='Minimum Value')
plt.legend()
plt.title('Parametric ReLU Parameters Across Time')
plt.show()

enter image description here