Слой встраивания Keras - ValueError: Ошибка при проверке ввода: ожидается, что он имеет 2 измерения, но получен (39978, 20, 20) - PullRequest
2 голосов
/ 17 января 2020

Я пытаюсь создать модель LSTM / GRU в керасе для классификации данных статей в одном из 4 классов.

input > embedding layer > LSTM/GRU layer > [context vector] > Dense(softmax activation) > output class

Во входных данных обучения имеется 39978 статей, в каждой статье 20 предложений и в каждом предложении 20 слов. Что касается целевой переменной, то существует 4 целевых класса.

x_train.shape равно (39978, 20, 20) и

y_train.shape равно (39978, 4)

embedding_matrix.shape равно (27873, 100) embedding_matrix создается в словаре с glove.6B.100d.txt

Я пытаюсь создать последовательную модель, как показано ниже

vocab_size = len(tokenizer.word_index.keys()) # 27873
MAX_SENT_LENGTH = 20

model = Sequential()
embedding_dimentations = embedding_matrix.shape[1]
e = Embedding(vocab_size, 
              embedding_dimentations, 
              weights=[embedding_matrix], 
              input_length=MAX_SENT_LENGTH, 
              trainable=False)
model.add(e)

model.add(Bidirectional(GRU(embedding_dimentations, dropout=0.25, recurrent_dropout=0.25)))
model.add(Dense(4, activation='softmax'))

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

на модели выше, если я выполнить подбор

batch_size = 128
epochs = 3

print('Training.....')
model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=epochs,
          validation_split=.2)

Я получаю следующую ошибку

ValueError: Ошибка при проверке ввода: ожидалось, что embedding_6_input имеет 2 измерения, но получил массив с формой (39978, 20, 20)

Я попытался указать кортеж входной формы в Embedding (), но он не работает. Может кто-нибудь направить меня в правильном направлении?

Спасибо

1 Ответ

0 голосов
/ 19 января 2020
vocab_size = len(tokenizer.word_index.keys()) # 27873
MAX_SENT_LENGTH = 20
embedding_dimentations = embedding_matrix.shape[1]

model = Sequential()

encoder_inputs = Input(shape=(20, 20))
x1 = Reshape((400,))(encoder_inputs)
x2 = Embedding(vocab_size, 
              embedding_dimentations, 
              weights=[embedding_matrix], 
              input_length=400, 
              trainable=False)(x1)

# should use Bidirectional GRU
encoder = GRU(embedding_dimentations, dropout=0.25, recurrent_dropout=0.25, return_state=True)
encoder_outputs, state_h = encoder(x2)

predictions = Dense(4, activation='softmax')(encoder_outputs)

model = Model(inputs=encoder_inputs, outputs=predictions)
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

Используется слой Reshape перед слоем Embedding, чтобы получить данные в правильной форме. Этот подход работает для меня.

...