我使用TensorFlow/Keras的函數API來構建CNN模型。在這個模型中,我試圖在輸出層上應用自定義激活(帶有約束)。
在閱讀了各種資源(1,2)之后,我對是否需要通過簡單的python函數或層應用激活感到困惑。
我嘗試通過如下子類化Layer類來實現它,
class MapToBounds(layers.Layer):
def __init__(self, lower_bound, upper_bound, **kwargs):
super().__init__(**kwargs)
self.lower_bound = lower_bound
self.upper_bound = upper_bound
def call(self, inputs, *args, **kwargs):
return tf.add(self.lower_bound, tf.multiply(tf.sigmoid(inputs), self.upper_bound))
并在模型中稱之為
x = MapToBounds(lower_bound=-3.0, upper_bound=20.0)(x)
其中x
是前一層實例。
我的問題是:
- 這是正確的方法嗎?
- 在這種方法中,我必須設置
training=False
嗎? - 有什么簡單的方法可以用python函數而不是層來實現它嗎?
你的方法實際上相當干凈。您也可以直接在張量上使用
tf.add
,但自定義層更優雅(IMO):結論:兩種解決方案均有效。關于標志
training=False
,我認為你不必擔心它,除非你希望你的激活函數在訓練和推理過程中表現不同。