Как использовать векторизатор TF IDF с LSTM в Keras Python - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь обучить модель Seq2Seq, используя LSTM в библиотеке Keras из Python. Я хочу использовать векторное представление предложений TF IDF в качестве входных данных для модели и получения ошибки.

X = ["Good morning", "Sweet Dreams", "Stay Awake"]
Y = ["Good morning", "Sweet Dreams", "Stay Awake"]

vectorizer = TfidfVectorizer()
vectorizer.fit(X)
vectorizer.transform(X)
vectorizer.transform(Y)
tfidf_vector_X = vectorizer.transform(X).toarray() #shape - (3,6)
tfidf_vector_Y = vectorizer.transform(Y).toarray() #shape - (3,6)
tfidf_vector_X = tfidf_vector_X[:, :, None] #shape - (3,6,1) since LSTM cells expects ndims = 3
tfidf_vector_Y = tfidf_vector_Y[:, :, None] #shape - (3,6,1)

X_train, X_test, y_train, y_test = train_test_split(tfidf_vector_X, tfidf_vector_Y, test_size = 0.2, random_state = 1)
model = Sequential()
model.add(LSTM(output_dim = 6, input_shape = X_train.shape[1:], return_sequences = True, init = 'glorot_normal', inner_init = 'glorot_normal', activation = 'sigmoid'))
model.add(LSTM(output_dim = 6, input_shape = X_train.shape[1:], return_sequences = True, init = 'glorot_normal', inner_init = 'glorot_normal', activation = 'sigmoid'))
model.add(LSTM(output_dim = 6, input_shape = X_train.shape[1:], return_sequences = True, init = 'glorot_normal', inner_init = 'glorot_normal', activation = 'sigmoid'))
model.add(LSTM(output_dim = 6, input_shape = X_train.shape[1:], return_sequences = True, init = 'glorot_normal', inner_init = 'glorot_normal', activation = 'sigmoid'))
adam = optimizers.Adam(lr = 0.001, beta_1 = 0.9, beta_2 = 0.999, epsilon = None, decay = 0.0, amsgrad = False)
model.compile(loss = 'cosine_proximity', optimizer = adam, metrics = ['accuracy'])
model.fit(X_train, y_train, nb_epoch = 100)

Приведенный выше код выдает:

Error when checking target: expected lstm_4 to have shape (6, 6) but got array with shape (6, 1)

Может кто-нибудь сказать мне, что не так и как это исправить?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

enter image description here

Как показано на диаграмме выше, сеть ожидает конечный уровень как выходной уровень . В качестве выходного размера вы должны указать размер конечного слоя.

В вашем случае это будет количество строк * 1 , как показано в ошибке (6,1) - ваше измерение.

Изменить размер вывода на 1 в вашем последнем слое

Используя keras, вы можете создать свою собственную сеть. Поэтому вы должны нести ответственность за создание скрытых конечных слоев с выходным слоем.

0 голосов
/ 05 сентября 2018

В настоящее время вы возвращаете последовательности измерения 6 в вашем последнем слое. Возможно, вы захотите вернуть последовательность размерности 1, соответствующую вашей целевой последовательности. Я не уверен на 100%, потому что у меня нет опыта работы с моделями seq2seq, но, по крайней мере, код работает таким образом. Может быть, посмотрите на учебник по seq2seq в блоге Keras .

Кроме того, есть два небольших момента: при использовании Sequential API вам нужно только указать input_shape для первого слоя вашей модели. Кроме того, аргумент output_dim слоя LSTM устарел и должен быть заменен аргументом units:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split

X = ["Good morning", "Sweet Dreams", "Stay Awake"]
Y = ["Good morning", "Sweet Dreams", "Stay Awake"]

vectorizer = TfidfVectorizer().fit(X)

tfidf_vector_X = vectorizer.transform(X).toarray()  #//shape - (3,6)
tfidf_vector_Y = vectorizer.transform(Y).toarray() #//shape - (3,6)
tfidf_vector_X = tfidf_vector_X[:, :, None] #//shape - (3,6,1) 
tfidf_vector_Y = tfidf_vector_Y[:, :, None] #//shape - (3,6,1)

X_train, X_test, y_train, y_test = train_test_split(tfidf_vector_X, tfidf_vector_Y, test_size = 0.2, random_state = 1)

from keras import Sequential
from keras.layers import LSTM

model = Sequential()
model.add(LSTM(units=6, input_shape = X_train.shape[1:], return_sequences = True))
model.add(LSTM(units=6, return_sequences=True))
model.add(LSTM(units=6, return_sequences=True))
model.add(LSTM(units=1, return_sequences=True, name='output'))
model.compile(loss='cosine_proximity', optimizer='sgd', metrics = ['accuracy'])

print(model.summary())

model.fit(X_train, y_train, epochs=1, verbose=1)
...