Я следил за этим ответом, делая:
get_custom_objects().update(act_dispatcher)
Где act_dispatcher
— это словарь со всеми функциями активации, которые я хочу добавить, например {'fun_1':fun_1, 'fun_2': fun_2}
.
Первое, что привлекло мое внимание, это то, что в начале, если я ничего не добавляю, get_custom_objects()
возвращает пустой диктофон {}
. После добавления функции я проверяю, что каждый вызов get_custom_objects()
имеет то, что я сказал.
Тем не менее, я получаю ValueError: Unknown activation function:<my_fun>
я добавил строку
assert 'my_func', in get_custom_objects().keys()
tf.keras.layers.Dense(128, activation='my_func')
И утверждение проходит без проблем с ошибкой, упомянутой при инициализации keras Dense.
Ошибка возникает в deserialize_keras_object где:
custom_objects
это None
_GLOBAL_CUSTOM_OBJECTS
равно {}
(Возможно, это поле не должно быть пустым).module_objects.get(object_name)
возвращает None (швы module_objects правильные).Монтаж
Я использую среду анаконды. Из-за ошибки, которая у меня была сначала с from keras.utils.generic_utils import get_custom_objects
, я установил keras-applications
с conda install -c conda-forge keras-applications
Я могу запустить этот код без каких-либо ошибок, вы можете попробовать изменить from tensorflow.keras.utils.generic_utils import get_custom_objects
на from tensorflow.keras.utils import get_custom_objects
, посмотрите, поможет ли это:
from tensorflow.keras import backend as K
from tensorflow.keras.utils import get_custom_objects
from tensorflow.keras.layers import Activation, Conv2D
from tensorflow.keras.models import Sequential
def my_func(x, beta=1.0):
return x * K.sigmoid(beta * x)
model = Sequential()
model.add(Conv2D(64, (3, 3)))
model.add(Activation(my_func))
get_custom_objects().update({'my_func': Activation(my_func)})
model.add(Conv2D(64, (3, 3), activation='my_func'))
@AgustinBarrachina, как вы использовали свою пользовательскую функцию активации? это как model.add(my_fun)
или как model.add(Conv2D(64, (3, 3), activation='my_fun'))
? какую ошибку вы получили? также как выглядит ваша пользовательская функция?
model = tf.keras.Sequential([tf.keras.Input(shape), tf.keras.layers.Flatten, tf.keras.layers.Dense(128, activation='my_fun')])
Добавил информацию об ошибке, так же зашел в место Tensorflow
где возникает ошибка.
@AgustinBarrachina Я редактирую ответ, дайте мне знать, полезно это или нет
Хорошо, получил ошибку, я использовал keras.utils
вместо tensorflow.keras.utils
!!! Так неуклюже с моей стороны и невозможно отладить, потому что я не добавил импорт. Спасибо. Я оставлю вопрос, потому что это может помочь кому-то. Отмечено как решение.
Ага, я тоже заморочился около минуты, без проблем, рад помочь :)
Итак, я добавил конструктор активации, как вы сказали, но все равно ничего. После его добавления я получаю этот вывод для
print(get_custom_objects())
:{'my_fun': <tensorflow.python.keras.layers.core.Activation object at 0x7fbc3c24b6d0>}