Выходной размер встраивания Tensorflow keras для подачи слоя LSTM

#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,)) . Спасибо!