Я использую 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: индекс кортежа вне диапазона