Использование вложений Elmo для сверточных нейронных сетей в Keras (Tensorflow) - PullRequest
0 голосов
/ 10 июля 2019

Я использую Keras с бэкэндом Tensorflow для создания модели классификации текста с несколькими метками, и я использую вложения Elmo, как на шаге 2: https://towardsdatascience.com/elmo-contextual-language-embedding-335de2268604

Когда я использую плотные слои, модель работает нормально, но когда я использую сверточные слои, я получаю разные ошибки в зависимости от того, использую ли я elmo "default" или elmo "elmo".

Я пытался настроить различные входные параметры (т. Е. 1, None, и использовать 1, 2 или 3 параметра и т. Д.), Но ничего не работает. Это модель, из которой я ухожу для CNN https://richliao.github.io/supervised/classification/2016/11/26/textclassifier-convolutional/

# Elmo Embedding
url = "https://tfhub.dev/google/elmo/2"
embed = hub.Module(url, trainable=True)
elmo_batch_size = 64
def ELMoEmbedding(x):
    return embed(tf.squeeze(tf.cast(x, tf.string)), signature="default", as_dict=True)["elmo"] 

# Input Layer
input_text = Input(batch_shape=(7780, 1), dtype="string")

# Embed Layer
embedding = Lambda(ELMoEmbedding, output_shape=(1024, None))(input_text)

# Middle Layers
l_cov1= Conv1D(128, 5, activation='relu', input_shape = (1024,None))(embedding)
l_pool1 = MaxPooling1D(5)(l_cov1)
l_cov2 = Conv1D(128, 5, activation='relu')(l_pool1)
l_pool2 = MaxPooling1D(5)(l_cov2)
l_cov3 = Conv1D(128, 5, activation='relu')(l_pool2)
l_pool3 = MaxPooling1D(35)(l_cov3)  # global max pooling
l_flat = Flatten()(l_pool3)
l_dense = Dense(128, activation='relu')(l_flat)
preds = Dense(2, activation='sigmoid')

model.compile(loss="binary_crossentropy", optimizer="adam", metrics=['accuracy'])

# Train
with tf.Session() as session:
    # Run model thorugh to train
    K.set_session(session)
    session.run(tf.global_variables_initializer())  
    session.run(tf.tables_initializer())
    history = model.fit(x_train, y_train, epochs=5, batch_size=32, shuffle=True, validation_data=(x_test, y_test))
    model.save_weights('elmo-model.h5')
    model_json = model.to_json()

# Test
with tf.Session() as session:
    K.set_session(session)
    session.run(tf.global_variables_initializer())
    session.run(tf.tables_initializer())
    model.load_weights('elmo-model.h5') 
    predicts = model.predict(x_test, batch_size=batch_size)
    y_pred=np.argmax(predicts, axis=1)
y_test=np.argmax(y_test, axis=1)

С elmo default я получаю:

ValueError: вход 0 несовместим со слоем conv1d_1: ожидаемый ndim = 3, найденный ndim = 2

Но когда я использую режим elmo, я получаю:

features = input_shape [2] IndexError: индекс кортежа вне диапазона

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...