Это мой простой воспроизводимый код:
from keras.callbacks import ModelCheckpoint
from keras.models import Model
from keras.models import load_model
import keras
import numpy as np
SEQUENCE_LEN = 45
LATENT_SIZE = 20
VOCAB_SIZE = 100
inputs = keras.layers.Input(shape=(SEQUENCE_LEN, VOCAB_SIZE), name="input")
encoded = keras.layers.Bidirectional(keras.layers.LSTM(LATENT_SIZE), merge_mode="sum", name="encoder_lstm")(inputs)
decoded = keras.layers.RepeatVector(SEQUENCE_LEN, name="repeater")(encoded)
decoded = keras.layers.Bidirectional(keras.layers.LSTM(VOCAB_SIZE, return_sequences=True), merge_mode="sum", name="decoder_lstm")(decoded)
autoencoder = keras.models.Model(inputs, decoded)
autoencoder.compile(optimizer="sgd", loss='mse')
autoencoder.summary()
x = np.random.randint(0, 90, size=(10, SEQUENCE_LEN,VOCAB_SIZE))
y = np.random.normal(size=(10, SEQUENCE_LEN, VOCAB_SIZE))
NUM_EPOCHS = 1
checkpoint = ModelCheckpoint(filepath='checkpoint/{epoch}.hdf5')
history = autoencoder.fit(x, y, epochs=NUM_EPOCHS,callbacks=[checkpoint])
и вот мой код, чтобы взглянуть на веса в слое кодировщика:
for epoch in range(1, NUM_EPOCHS + 1):
file_name = "checkpoint/" + str(epoch) + ".hdf5"
lstm_autoencoder = load_model(file_name)
encoder = Model(lstm_autoencoder.input, lstm_autoencoder.get_layer('encoder_lstm').output)
print(encoder.output_shape[1])
weights = encoder.get_weights()[0]
print(weights.shape)
for idx in range(encoder.output_shape[1]):
token_idx = np.argsort(weights[:, idx])[::-1]
здесь print(encoder.output_shape)
— это (None,20)
, а print(weights.shape)
— это (100, 80)
.
Я так понимаю, что get_weight
напечатает переход веса после слоя.
Часть, которую я не получил на основе этой архитектуры, это 80
. что это такое?
И являются ли weights
здесь весом, который соединяет уровень кодировщика с декодером? Я имел в виду связь между энкодером и декодером.
Я просмотрел этот вопрос здесь. поскольку это только простые плотные слои, я не мог связать эту концепцию с моделью seq2seq.
Обновление1
В чем разница между: encoder.get_weights()[0]
и encoder.get_weights()[1]
? первый - (100,80)
, а второй - (20,80)
как концептуально?
любая помощь приветствуется :)