想了解如何使用 python 中的 tensorflow 为具有两个可学习参数的神经网络定义用户定义的激活函数。
任何参考资料或案例研究都会有帮助吗?
谢谢
答案 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()