TypeError при сборке кодировщика Keras из автоэнкодера - PullRequest
0 голосов
/ 07 мая 2020

Я построил базовый c автоэнкодер в Керасе. Он правильно строит, компилирует и обучается. Но когда я загружаю сохраненную модель из диска c, а затем пытаюсь извлечь только часть кодировщика, я получаю ошибку TypeError.

Exception has occurred: TypeError
object of type 'Embedding' has no len()
  File "concept_autoencoder.py", line 47, in get_encoder
    encoder = Model(inputs=self.model.input, outputs=self.model.get_layer(ENC_OUT_LAYER).output)
  File "concept_autoencoder.py", line 73, in encode_ontology_concepts
    encoder = autoencoder.get_encoder()
  File "concept_autoencoder.py", line 188, in <module>
    encode_ontology_concepts(english_concepts_file, merged_metadata_file, ontology_sequence_file)

Я включу весь класс, потому что он относительно короткий.

class ConceptAutoencoder:
    def __init__(self, model):
        self.model = model

    @staticmethod
    def build_model(vlen, vocab_size, embedding_dims, hidden_dims):
        input = Input(shape=(vlen,))
        embedding = Embedding(vocab_size, embedding_dims, input_length=vlen, mask_zero=True, name=EMB_LAYER)(input)
        lstm1 = LSTM(hidden_dims, name=ENC_OUT_LAYER)(embedding)

        repeat = RepeatVector(vlen, name=DEC_IN_LAYER)(lstm1)
        lstm2 = LSTM(embedding_dims, return_sequences=True)(repeat)
        dense = TimeDistributed(Dense(vocab_size, activation='softmax'))(lstm2)

        model = Model(inputs=input, outputs=dense)
        return ConceptAutoencoder(model)

    def save_to_file(self, out_file):
        self.model.save(out_file)

    @staticmethod
    def load_from_file(in_file):
        model = keras.models.load_model(in_file)
        return ConceptAutoencoder(model)

    def get_embedding_weights(self):
        weights = self.model.get_layer(EMB_LAYER).get_weights()[0]
        return weights

    def get_encoder(self):
        encoder = Model(inputs=self.model.input, outputs=self.model.get_layer(ENC_OUT_LAYER).output)
        return encoder

    def get_decoder(self, hidden_dims):
        decoder_input = Input(shape=(hidden_dims,))

        for index, layer in enumerate(self.model.layers):
            if layer.name == DEC_IN_LAYER:
                dec_in_index = index
                break

        prev_layer = decoder_input
        for i in range(dec_in_index, len(self.model.layers)):
            next_layer = self.model.layers[i](prev_layer)
            prev_layer = next_layer

        decoder = Model(inputs=decoder_input, outputs=prev_layer)
        return decoder

Что особенно сбивает с толку, так это то, что если я вызываю get_encoder () из только что созданной модели, я не получаю TypeError. Это происходит только тогда, когда я сохраняю модель на dis c, а затем перезагружаю ее. Я теряю некоторые важные метаданные в процессе сохранения / загрузки? Или есть лучший / более надежный способ структурирования кодировщика и декодера в рамках полной модели автоэнкодера?

...