我正在使用 keras,我想将我自己的激活函数 myf 添加到 tensorflow 后端。如何定义新功能并使其可操作。所以而不是代码行:
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
我会写
model.add(layers.Conv2D(64, (3, 3), activation='myf')).
我正在使用 keras,我想将我自己的激活函数 myf 添加到 tensorflow 后端。如何定义新功能并使其可操作。所以而不是代码行:
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
我会写
model.add(layers.Conv2D(64, (3, 3), activation='myf')).
首先,您需要使用后端函数定义一个函数。例如,这是我实现 swish 激活函数的方式:
from keras import backend as K
def swish(x, beta=1.0):
return x * K.sigmoid(beta * x)
这允许您将激活函数添加到模型中,如下所示:
model.add(Conv2D(64, (3, 3)))
model.add(Activation(swish))
如果您想使用字符串作为自定义函数的别名,则必须使用 Keras 注册自定义对象。可以这样做:
from keras.utils.generic_utils import get_custom_objects
get_custom_objects().update({'swish': Activation(swish)})
这允许您按名称直接将激活添加到层:
model.add(Conv2D(64, (3, 3), activation='swish'))
对于更高级的激活函数,具有可训练的参数等,最好将它们实现为 Keras 层。这里 swish 函数在一个层中使用,允许在训练时学习 beta:
from keras.layers import Layer
class Swish(Layer):
def __init__(self, beta=1.0, trainable=False, **kwargs):
super(Swish, self).__init__(**kwargs)
self.supports_masking = True
self.beta = beta
self.trainable = trainable
def build(self, input_shape):
self.beta_factor = K.variable(self.beta,
dtype=K.floatx(),
name='beta_factor')
if self.trainable:
self._trainable_weights.append(self.beta_factor)
super(Swish, self).build(input_shape)
def call(self, inputs, mask=None):
return swish(inputs, self.beta_factor)
def get_config(self):
config = {'beta': self.get_weights()[0] if self.trainable else self.beta,
'trainable': self.trainable}
base_config = super(Swish, self).get_config()
return dict(list(base_config.items()) + list(config.items()))
def compute_output_shape(self, input_shape):
return input_shape
然后,您将添加与任何其他层相同的激活函数:
model.add(Conv2D(64, (3, 3)))
model.add(Swish(beta=1.0, trainable=True))
诀窍是使用backend
Keras 的功能:
from keras import backend as K
def my_function(x):
x = K.some_function(x)
return x
其中“ some_function
”是您需要的。你能详细说明一下吗?
然后你只需调用它:
model.add(Dense(10, activation = my_function))
您要实施什么激活?
from keras.layers.core import Activation
from keras.models import Sequential
import keras.backend as K
def myCustomActivation(x):
return ...
model = Sequential()
model.add(Dense(120))
model.add(Activation(myCustomActivation))
model.add(Dense(30, activation= myCustomActivation))
...
myCustomActivation
对于您使用 Keras 后端执行的所有操作,以便在 DAG 上执行操作。
或者
激活只是一个微不足道的层,因此您可以按照此处的说明将自定义激活定义为自定义层。
对于该call
方法中编写的所有操作,请使用 keras 后端(再次在 DAG 上完成所有操作)。