Сеть LSTM по предварительно обученному встраиванию слов - PullRequest
0 голосов
/ 27 сентября 2018

Я новичок в углубленном изучении.Я пытаюсь сделать очень простую сеть LSTM на функции встраивания слов.Я написал следующий код для модели, но не могу его запустить.

from keras.layers import Dense, LSTM, merge, Input,Concatenate
from keras.layers.recurrent import LSTM
from keras.models import Sequential, Model
from keras.layers import Dense, Dropout, Flatten


max_sequence_size = 14
classes_num = 2

LSTM_word_1 = LSTM(100, activation='relu',recurrent_dropout = 0.25, dropout = 0.25)
lstm_word_input_1 = Input(shape=(max_sequence_size, 300))
lstm_word_out_1 = LSTM_word_1(lstm_word_input_1)


merged_feature_vectors = Dense(50, activation='sigmoid')(Dropout(0.2)(lstm_word_out_1))

predictions = Dense(classes_num, activation='softmax')(merged_feature_vectors)

my_model = Model(input=[lstm_word_input_1], output=predictions)
print my_model.summary()

Я получаю ошибку ValueError: Error when checking input: expected input_1 to have 3 dimensions, but got array with shape (3019, 300).При поиске я обнаружил, что люди использовали Flatten(), который сжимает все 2-D объекты (3019,300) для плотного слоя.Но я не могу решить проблему.

Объясняя, пожалуйста, дайте мне знать, как работает измерение.

По запросу:

У моего X_training были проблемы с измерениями, поэтому я предоставляю приведенный ниже код, чтобы очиститьиз путаницы,

def makeFeatureVec(words, model, num_features):
    # Function to average all of the word vectors in a given
    # paragraph
    #
    # Pre-initialize an empty numpy array (for speed)
    featureVec = np.zeros((num_features,),dtype="float32")
    #
    nwords = 0.
    #
    # Index2word is a list that contains the names of the words in
    # the model's vocabulary. Convert it to a set, for speed
    index2word_set = set(model.wv.index2word)
    #
    # Loop over each word in the review and, if it is in the model's
    # vocaublary, add its feature vector to the total
    for word in words:
        if word in index2word_set:
            nwords = nwords + 1.
            featureVec = np.add(featureVec,model[word])
    #
    # Divide the result by the number of words to get the average
    featureVec = np.divide(featureVec,nwords)
    return featureVec

Я думаю, что следующий код дает двумерный массив NumPy, поскольку я инициализирую его таким образом

def getAvgFeatureVecs(reviews, model, num_features):
    # Given a set of reviews (each one a list of words), calculate
    # the average feature vector for each one and return a 2D numpy array
    #
    # Initialize a counter
    counter = 0.
    #
    # Preallocate a 2D numpy array, for speed
    reviewFeatureVecs = np.zeros((len(reviews),num_features),dtype="float32")

    for review in reviews:

       if counter%1000. == 0.:
           print "Question %d of %d" % (counter, len(reviews))

       reviewFeatureVecs[int(counter)] = makeFeatureVec(review, model, \
           num_features)

       counter = counter + 1.
    return reviewFeatureVecs


def getCleanReviews(reviews):
    clean_reviews = []
    for review in reviews["question"]:
        clean_reviews.append( KaggleWord2VecUtility.review_to_wordlist( review, remove_stopwords=True ))
    return clean_reviews

Моя цель - использовать предварительно подготовленную модель Gensimдля LSTM на некоторые комментарии, которые у меня есть.

trainDataVecs = getAvgFeatureVecs( getCleanReviews(train), model, num_features )

1 Ответ

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

Вы должны попробовать использовать Embedding layer перед слоем LSTM.Кроме того, поскольку у вас есть предварительно обученные векторы 300 измерений для комментариев 3019, вы можете инициализировать веса для встраивания слоя с этой матрицей.

inp_layer = Input((maxlen,))
x = Embedding(max_features, embed_size, weights=[trainDataVecs])(x)
x = LSTM(50, dropout=0.1)(x)

Здесь maxlen - максимальная длина ваших комментариев, max_features - это максимальное количество уникальных слов или размер словаря вашего набора данных, а embed_size - это размеры ваших векторов, в вашем случае это 300.

Обратите внимание, что форма trainDataVecs должна быть (max_features, embed_size), так что если у вас есть предварительно обученные векторы слов, загруженные в trainDataVecs, это должно сработать.

...