Я построил базовый 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, а затем перезагружаю ее. Я теряю некоторые важные метаданные в процессе сохранения / загрузки? Или есть лучший / более надежный способ структурирования кодировщика и декодера в рамках полной модели автоэнкодера?