ValueError: Форма веса слоя (43, 100) не совместима с предоставленной формой веса (412457, 400) - PullRequest
0 голосов
/ 21 января 2020

Я подготовил небольшой набор данных для проекта. И это дает

ValueError: Ошибка формы веса слоя (43, 100) не совместима с предоставленной формой веса (412457, 400)

ошибка. Я думаю, что есть проблема с токенизаторами.

X и Y для train_test_split

X = []
sentences = list(titles["title"])
for sen in sentences:
    X.append(preprocess_text(sen))

y = titles['Unnamed: 1']



X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)

Токенизатор здесь

tokenizer = Tokenizer(num_words=5000)
tokenizer.fit_on_texts(X_train)

X_train = tokenizer.texts_to_sequences(X_train)
X_test = tokenizer.texts_to_sequences(X_test)

vocab_size = len(tokenizer.word_index) + 1 #vocab_size 43

maxlen = 100

X_train = pad_sequences(X_train, padding='post', maxlen=maxlen)
X_test = pad_sequences(X_test, padding='post', maxlen=maxlen)

Итак, моя предварительно обученная модель word2ve c имеет (412457, 400) shape.

from numpy import array
from numpy import asarray
from numpy import zeros

from gensim.models import KeyedVectors
embeddings_dictionary = KeyedVectors.load_word2vec_format('drive/My Drive/trmodel', binary=True)

Я использовал мою предварительно обученную модель word2ve c вместо GloVe. (vocab_size: 43, 100, веса из embeddings_dictionary.vectors)

from keras.layers.recurrent import LSTM

model = Sequential()
embedding_layer = Embedding(vocab_size, 100, weights=[embeddings_dictionary.vectors], input_length=maxlen , trainable=False)
model.add(embedding_layer)
model.add(LSTM(128))

model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])

ValueError: Форма веса слоя (43, 100) не совместима с предоставленной формой веса (412457, 400)

1 Ответ

1 голос
/ 21 января 2020

Если вы хотите использовать предварительно обученные веса, то вы должны передать параметры подходящего размера слою Embedding, чтобы он мог назначить предварительно обученную матрицу весов матрице весов слоя внедрения.

Таким образом, вы должны сделать следующее:

embedding_layer = Embedding(412457, 400, weights=[embeddings_dictionary.vectors], input_length=maxlen , trainable=False)

Перед тренировкой вы должны изменить отступы, соответствующие его слою Embedding:

maxlen = 400

X_train = pad_sequences(X_train, padding='post', maxlen=maxlen)
X_test = pad_sequences(X_test, padding='post', maxlen=maxlen)
...