#python #tensorflow #machine-learning #keras #embedding
Вопрос:
В моей модели входные данные встроены в перчатки, а затем передаются на уровень LSTM. Я получаю следующую ошибку несоответствия входных данных при передаче выходных данных слоя встраивания на слой lstm,
raise ValueError('Input ' str(input_index) ' of layer '
ValueError: Input 0 of layer lstm is incompatible with the layer:
expected ndim=3, found ndim=4. Full shape received: (None, None, 3834, 50)
Вот основной код, поэтому я создаю слой встраивания и передаю его create_lstm_vae()
методу, который фактически создает модель.
embedding_layer, input_dim = word_vectors.glove_encode("data/glove.6B.50d.txt",input_dim,char2id,glove_size=50)
vae, enc, gen, stepper = create_lstm_vae(embedding_layer, input_dim,
batch_size=batch_size,
intermediate_dim=intermediate_dim,
latent_dim=latent_dim)
Создание модели выглядит следующим образом
def create_lstm_vae(embedding_layer, input_dim, batch_size, # нам это нужно для выборки intermediate_dim, latent_dim):
x = Input(shape=(None, input_dim,))
# using glove embeddings
embedded_sequences = embedding_layer(x)
# LSTM encoding
h = LSTM(units=intermediate_dim)(embedded_sequences)
# etc. it crashes here
Ниже приведена моя реализация вложений в перчатки,
def glove_encode(path_to_glove_file, num_tokens, word_index, glove_size=50, input_length=None):
embeddings_index = {}
with open(path_to_glove_file, encoding='utf-8') as f:
for line in f:
word, coefs = line.split(maxsplit=1)
coefs = np.fromstring(coefs, "f", sep=" ")
embeddings_index[word] = coefs
embedding_dim = glove_size
hits = 0
misses = 0
# Prepare embedding matrix
embedding_matrix = np.zeros((num_tokens, embedding_dim))
for word, i in word_index.items():
embedding_vector = embeddings_index.get(word)
if embedding_vector is not None:
# Words not found in embedding index will be all-zeros.
# This includes the representation for "padding" and "OOV"
embedding_matrix[i] = embedding_vector
hits = 1
else:
misses = 1
embedding_layer = Embedding(
input_dim=num_tokens, # num tokens in dict ( 1)
output_dim=embedding_dim, # dimension of the dense embedding
embeddings_initializer=tensorflow.keras.initializers.Constant(embedding_matrix),
embeddings_regularizer=None,
embeddings_constraint=None,
input_length=input_length,# length of input sequences if fixed length
trainable=False,
)
return embedding_layer, num_tokens
Поскольку embedding_layer
это результат Embedding()
вызова , он должен иметь размер (None, embedding_dim, input_length)
, на самом деле он имеет размер (None, None, 3834, 50)
. 50-это embedding_dim для перчатки 50.
Есть какие-нибудь подсказки или способы дальнейшей отладки этого ?
Комментарии:
1. LSTM ожидает входные данные:
3D
тензор с формой[batch, timesteps, feature]
. В ваших данных заменитеx = Input(shape=(None, input_dim,))
наx = Input(shape=(input_dim,))
. Спасибо!