как преобразовать последовательный API Keras в функциональный API - PullRequest
0 голосов
/ 24 января 2019

Я новичок в nlp и пытаюсь выучить пропущенный грамм с сайта:

https://towardsdatascience.com/understanding-feature-engineering-part-4-deep-learning-methods-for-text-data-96c44370bbfa

Я пытаюсь реализовать пропущенный грамм, и проблема, с которой я сталкиваюсь, заключается в том, чтоприведенный ниже код является последовательным API-интерфейсом keras, и он не поддерживает слияние (далее в коде, показанном ниже)

word_model.add(Embedding(vocab_size, embed_size,
                         embeddings_initializer="glorot_uniform",
                         input_length=1))
word_model.add(Reshape((embed_size, )))

, поэтому я пытаюсь преобразовать его в функциональный API

word_model = Embedding(input_dim=vocab_size, output_dim=embed_size,
                         embeddings_initializer="glorot_uniform",
                         input_length=1)

word_model = Reshape(target_shape= (embed_size,))(word_model)

однако я получаю приведенную ниже ошибку. Неожиданно обнаружен экземпляр типа <class 'keras.layers.embeddings.Embedding'>.Ожидается символьный экземпляр тензора.

Я попытался изменить форму слоя, а также фона, но все еще не работает.

, пожалуйста, предложите, как преобразовать это или заставить его работать.

спасибозаранее.

from keras.layers import Merge
from keras.layers.core import Dense, Reshape
from keras.layers.embeddings import Embedding
from keras.models import Sequential

# build skip-gram architecture
word_model = Sequential()
word_model.add(Embedding(vocab_size, embed_size,
                         embeddings_initializer="glorot_uniform",
                         input_length=1))
word_model.add(Reshape((embed_size, )))

context_model = Sequential()
context_model.add(Embedding(vocab_size, embed_size,
                  embeddings_initializer="glorot_uniform",
                  input_length=1))
context_model.add(Reshape((embed_size,)))

model = Sequential()
model.add(Merge([word_model, context_model], mode="dot"))
model.add(Dense(1, kernel_initializer="glorot_uniform", activation="sigmoid"))
model.compile(loss="mean_squared_error", optimizer="rmsprop")

# view model summary
print(model.summary())

# visualize model structure
from IPython.display import SVG
from keras.utils.vis_utils import model_to_dot

SVG(model_to_dot(model, show_shapes=True, show_layer_names=False, 
                 rankdir='TB').create(prog='dot', format='svg'))

1 Ответ

0 голосов
/ 24 января 2019

Сначала вам понадобится входной слой, а затем передайте его на слой внедрения.Ниже приведен пример использования двух входных данных (один для целевого слова и один для контекстного слова):

target_input = keras.layers.Input(input_shape)
context_input = keras.layers.Input(input_shape)

target_emb = Embedding(input_dim=vocab_size, output_dim=embed_size,
                         embeddings_initializer="glorot_uniform",
                         input_length=1)(target_input)
target_emb = Reshape((embed_size,))(target_emb)

context_emb = Embedding(input_dim=vocab_size, output_dim=embed_size,
                         embeddings_initializer="glorot_uniform",
                         input_length=1)(context_input)
context_emb = Reshape((embed_size,))(target_emb)

# Add the remaining layers here...

model = keras.models.Model(inputs=[target_input, context_input], outputs=output)
...