Устранить один аргумент из kwargs. Это возможно? - PullRequest
1 голос
/ 11 октября 2019

Я работаю со встроенными функциями в Keras для создания ансамблей XCeption. В моем ансамбле каждая сеть Xception будет иметь разные подходы к инициализации весов. Методы инициализации следующие:

switcher = {
            0: Orthogonal(gain=1.0, seed=None),
            1: lecun_uniform(seed=None),
            2: VarianceScaling(scale=1.0, mode='fan_in', distribution='normal', seed=None),
            3: RandomNormal(mean=0.0, stddev=0.05, seed=None),
            4: RandomUniform(minval=-0.05, maxval=0.05, seed=None),
            5: TruncatedNormal(mean=0.0, stddev=0.05, seed=None),
            6: glorot_normal(seed=None),
            7: glorot_uniform(seed=None),
            8: he_normal(seed=None),
            9: he_uniform(seed=None) 
        }

Хорошо, поэтому для каждого из нескольких CNN в моем ансамбле я создаю сеть Xception следующим образом.

base_model=xception.Xception(include_top=False, weights=None, kernelinitializer=xception_ensemble.switcher.get(init_var))

Чтобы включитьАргумент kernelinitializer для инициализации весов Xception мне пришлось внести несколько изменений в мой файл python3.6 / site-packages / keras_applications / xception.py.

Первая модификация включала переменную kernelinitializer в конструктор CNN, как показано ниже:

def Xception(include_top=True,
             weights='imagenet',
             input_tensor=None,
             input_shape=None,
             pooling=None,
             classes=1000, kernel_initializer="he_normal", **kwargs):

Я поставил "he_normal" только потому, что он должен иметь значение по умолчанию, если не сообщается.

Затем следующим шагом было добавление значения kernel_initializer для инициализации любого сверточного слоя Xception CNN. Например:

residual = layers.Conv2D(256, (1, 1), strides=(2, 2),
                             padding='same', use_bias=False, kernel_initializer=kernel_initializer)(x)

Однако здесь есть одна проблема. Код выполняет следующее:

backend, layers, models, keras_utils = get_submodules_from_kwargs(kwargs)

Итак, эта функция рассматривает в качестве входных данных все аргументы (включая мой чужой) для построения подмодулей CNN. Тем не менее, мой аргумент (очевидно) не распознается функцией. Итак, возникает следующая ошибка:

Файл "venv / lib / python3.6 / site-packages / keras_applications / init .py", строка 20, в get_submodules_from_kwargs поднять TypeError('Недопустимый аргумент ключевого слова:% s', ключ) TypeError: ('Недопустимый аргумент ключевого слова:% s', 'kernelinitializer')

Есть ли способ исключить мою переменную kernelinitializer из этих kwards? Есть ли способ решить эту проблему?

1 Ответ

3 голосов
/ 11 октября 2019

Вы можете использовать диктовку, чтобы получить копию своих kwargs без определенного предмета:

{key: value for key, value in kwargs.items() if key != 'kernelinitializer'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...