Ошибка типа: __init __ () получила неожиданный аргумент ключевого слова «trainable» - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь загрузить архитектуру модели RNN, обученную в Керасе, с использованием keras.models.model_from_json, и я получаю указанную ошибку

with open('model_architecture.json', 'r') as f:
    model = model_from_json(f.read(), custom_objects={'AttLayer':AttLayer})

# Load weights into the new model
model.load_weights('model_weights.h5')

Вот пользовательский слой, который я использую

class AttLayer(Layer):
    def __init__(self, attention_dim):
        self.init = initializers.get('normal')
        self.supports_masking = True
        self.attention_dim = attention_dim
        super(AttLayer, self).__init__()

    def build(self, input_shape):
        assert len(input_shape) == 3
        self.W = K.variable(self.init((input_shape[-1], self.attention_dim)))
        self.b = K.variable(self.init((self.attention_dim, )))
        self.u = K.variable(self.init((self.attention_dim, 1)))
        self.trainable_weights = [self.W, self.b, self.u]
        super(AttLayer, self).build(input_shape)

    def compute_mask(self, inputs, mask=None):
        return None

    def call(self, x, mask=None):
        # size of x :[batch_size, sel_len, attention_dim]
        # size of u :[batch_size, attention_dim]
        # uit = tanh(xW+b)
        uit = K.tanh(K.bias_add(K.dot(x, self.W), self.b))
        ait = K.dot(uit, self.u)
        ait = K.squeeze(ait, -1)

        ait = K.exp(ait)

        if mask is not None:
            # Cast the mask to floatX to avoid float64 upcasting in theano
            ait *= K.cast(mask, K.floatx())
        ait /= K.cast(K.sum(ait, axis=1, keepdims=True) + K.epsilon(), K.floatx())
        ait = K.expand_dims(ait)
        weighted_input = x * ait
        output = K.sum(weighted_input, axis=1)

        return output

    def compute_output_shape(self, input_shape):
        return (input_shape[0], input_shape[-1])

    def get_config(self):
        config = {'attention_dim': self.attention_dim}
        base_config = super(AttLayer, self).get_config()
        return dict(list(base_config.items()) + list(config.items()))

ошибка:

File "scripts/Classifier.py", line 254, in test
    model = model_from_json(f.read(), custom_objects={'AttLayer':AttLayer})
  File "/home/biswadip/.local/lib/python2.7/site-packages/keras/models.py", line 345, in model_from_json
    return layer_module.deserialize(config, custom_objects=custom_objects)
  File "/home/biswadip/.local/lib/python2.7/site-packages/keras/layers/__init__.py", line 54, in deserialize
    printable_module_name='layer')
  File "/home/biswadip/.local/lib/python2.7/site-packages/keras/utils/generic_utils.py", line 139, in deserialize_keras_object
    list(custom_objects.items())))
  File "/home/biswadip/.local/lib/python2.7/site-packages/keras/engine/topology.py", line 2489, in from_config
    process_layer(layer_data)
  File "/home/biswadip/.local/lib/python2.7/site-packages/keras/engine/topology.py", line 2475, in process_layer
    custom_objects=custom_objects)
  File "/home/biswadip/.local/lib/python2.7/site-packages/keras/layers/__init__.py", line 54, in deserialize
    printable_module_name='layer')
  File "/home/biswadip/.local/lib/python2.7/site-packages/keras/utils/generic_utils.py", line 139, in deserialize_keras_object
    list(custom_objects.items())))
  File "/home/biswadip/.local/lib/python2.7/site-packages/keras/layers/wrappers.py", line 100, in from_config
    custom_objects=custom_objects)
  File "/home/biswadip/.local/lib/python2.7/site-packages/keras/layers/__init__.py", line 54, in deserialize
    printable_module_name='layer')
  File "/home/biswadip/.local/lib/python2.7/site-packages/keras/utils/generic_utils.py", line 139, in deserialize_keras_object
    list(custom_objects.items())))
  File "/home/biswadip/.local/lib/python2.7/site-packages/keras/engine/topology.py", line 2489, in from_config
    process_layer(layer_data)
  File "/home/biswadip/.local/lib/python2.7/site-packages/keras/engine/topology.py", line 2475, in process_layer
    custom_objects=custom_objects)
  File "/home/biswadip/.local/lib/python2.7/site-packages/keras/layers/__init__.py", line 54, in deserialize
    printable_module_name='layer')
  File "/home/biswadip/.local/lib/python2.7/site-packages/keras/utils/generic_utils.py", line 141, in deserialize_keras_object
    return cls.from_config(config['config'])
  File "/home/biswadip/.local/lib/python2.7/site-packages/keras/engine/topology.py", line 1254, in from_config
    return cls(**config)
TypeError: __init__() got an unexpected keyword argument 'trainable'

Версия:

Keras==2.0.8
tensorflow==1.4.1

Я пробовал тренироваться и загружаться, используя разные версии, но безуспешно. Наконец, я удалил «trainable» и «name» (пары «ключ-значение») из деталей пользовательского уровня в файле архитектуры модели (model_architecture.json), и модель, похоже, загружается без каких-либо ошибок. Но это похоже на исправление, и я должен делать это каждый раз, когда тренирую модель.

1 Ответ

0 голосов
/ 01 ноября 2018

Я думаю, вы упустили небольшую деталь в определении слоя. Ваш слой __init__ метод должен принимать аргументы ключевого слова (**kwargs), и вы должны передать эти аргументы ключевого слова родительскому классу __init__, например:

class AttLayer(Layer):
    def __init__(self, attention_dim, **kwargs):
        self.init = initializers.get('normal')
        self.supports_masking = True
        self.attention_dim = attention_dim
        super(AttLayer, self).__init__(**kwargs)

Таким образом, любой параметр универсального слоя будет правильно передан родительскому классу, в вашем случае, флаг trainable.

...