Ниже следует выполнить:
def custom_activation(x):
return (K.sigmoid(x) * 5) - 1
class CustSig(Layer):
def __init__(self, my_activation, **kwargs):
super(CustSig, self).__init__(**kwargs)
self.supports_masking = True
self.activation = my_activation
def call(self, inputs):
return self.activation(inputs)
def get_config(self):
config = {'activation': activations.serialize(self.activation)}
base_config = super(Activation, self).get_config()
return dict(list(base_config.items()) + list(config.items()))
def compute_output_shape(self, input_shape):
return input_shape
Пояснение :
С исходный код , автоматическое именование работает следующим образом:
if not name:
self._name = backend.unique_object_name(
generic_utils.to_snake_case(self.__class__.__name__),
zero_based=zero_based)
else:
self._name = name
График Keras проверяется на наличие существующих объектов с тем же именем, что и у определяемого вами объекта - если таковой существует, продолжает увеличиваться на 1, пока ни один не совпадет. Уловка в том, что вы не можете указать name=
, так как это исключает автоматическое присвоение имен в соответствии с вышеуказанным условным условием.
Единственным обходным решением, вероятно, является определение собственного пользовательского слоя активации с использованием желаемого имени в качестве имени класса, как указано выше, которое проявляется следующим образом:
ipt = Input(shape=(1, 3, 256), name='spec')
x = Flatten('channels_last')(ipt)
for _ in range(3):
x = Dense(512)(x)
x = CustSig(custom_activation)(x)
out = Dense(256, activation='sigmoid', name='out')(x)
model = Model(ipt, out)
print(model.layers[3].name)
print(model.layers[5].name)
print(model.layers[7].name)
cust_sig
cust_sig_1
cust_sig_2