代码之家  ›  专栏  ›  技术社区  ›  Borja_042

NLP情绪分析网没有学习

  •  0
  • Borja_042  · 技术社区  · 6 年前

    我想训练一个用于情绪分析的神经网络。我遵循了keras网页上的教程,但我必须根据我的用例调整代码,以便以后能够使用网络。

    为此,我将imdb数据集中的文本从keras从数字解码回文本,然后对文本进行词干化,因为我需要使用词干化的文本。在那之后,因为我想控制我做单词嵌入的方式,而不是使用文本序列和pad序列,所以我训练了一个doc2vec嵌入,并在训练集中使用它,这样我就可以从我想要分类的文本中获得嵌入。

    问题是,网络没有学到任何东西,准确性没有提高,我无法减少损失函数。我尝试了很多东西,比如网络的结构,所有的超参数,把最后一层从2个网络改成1个,从稀疏的分类熵改成二进制交叉熵。让我们看看是否有人能帮我解决问题。我在这里插入代码,并提前表示感谢。

    from keras.datasets import imdb
    max_features = 40000
    (training_data, training_targets), (testing_data, testing_targets) = imdb.load_data(num_words=max_features)
    
    import numpy as np
    data = np.concatenate((training_data, testing_data), axis=0)
    targets = np.concatenate((training_targets, testing_targets), axis=0)
    
    
    index = imdb.get_word_index()
    reverse_index = dict([(value, key) for (key, value) in index.items()])
    decoded = " ".join([reverse_index.get(i - 3, "") for i in data[0]])
    
    import nltk
    from nltk .stem import LancasterStemmer
    
    toke_corpus = list()
    lan = LancasterStemmer()
    
    from tqdm import tqdm
    lista_reviews = list()
    
    for review in tqdm(data):
      lista_reviews.append(np.array([lan.stem(reverse_index.get(i - 3, '')) for i in review][1:]))
    
    train_x, test_x = lista_reviews[10000:], lista_reviews[:10000]
    train_y, test_y = targets[10000:], targets[:10000]
    
     from gensim.models.callbacks import CallbackAny2Vec
    
     class EpochLogger(CallbackAny2Vec):
         '''Callback to log information about training'''
         def __init__(self):
             self.epoch = 0
         def on_epoch_begin(self, model):
             print("Epoch #{} start".format(self.epoch))
         def on_epoch_end(self, model):
             print("Epoch #{} end".format(self.epoch))
             self.epoch += 1
    
    
    from gensim.models.doc2vec import Doc2Vec, TaggedDocument
    
    documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(lista_reviews)]
    print("DOcuments already built")
    epoch_logger = EpochLogger()
    model = Doc2Vec(documents, vector_size=512, window=5, min_count=3, workers=8, epochs = 7, callbacks=[epoch_logger])
    
    
    encoded_x_train, encoded_x_test = list(), list()
    from tqdm import tqdm
    for i in tqdm(train_x):
        encoded_x_train.append(model.infer_vector(i))
    for k in tqdm(test_x):
        encoded_x_test.append(model.infer_vector(k))
    
    import keras
    
    reduce_lr = keras.callbacks.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.50, patience=2, verbose=1, mode='auto', cooldown=0, min_lr=0.00001)
    
    early = keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=4, verbose=1, mode='auto')
    
    from keras import models
    from keras.models import Sequential
    from keras import layers
    from keras.layers import Embedding, Bidirectional, Dense, LSTM, Conv1D, MaxPooling1D, Flatten
    
    model1 = Sequential()
    model1.add(Embedding(input_dim = max_features, input_length=512, output_dim=128, trainable=False))
    
    model1.add(Conv1D(filters=64,
                     kernel_size=5,
                     padding='valid',
                     activation='linear',
                     strides=1))
    model1.add(MaxPooling1D(pool_size=4))
    model1.add(Dense(64, activation='linear'))
    model1.add(LSTM(32, activation='tanh'))
    # model1.add(Dense(32, activation='relu'))
    # model1.add(Flatten())
    # model1.add(Dense(1, activation='sigmoid'))
    model1.add(Dense(2, activation='softmax'))
    model1.summary()
    
    
    from keras import optimizers
    # sgd = optimizers.SGD(lr=0.001, decay=1e-6, momentum=0.9, nesterov=True)
    adam = optimizers.Adam(learning_rate=0.01, beta_1=0.9, beta_2=0.999, amsgrad=False)
    
    
    model1.compile(loss='sparse_categorical_crossentropy',
                  optimizer=adam,
                  metrics=['accuracy'])
    
    history  = model1.fit( np.array(encoded_x_train), np.array(train_y),
     epochs= 20,
     batch_size = 500,
     validation_data = (np.array(encoded_x_test), np.array(test_y)), callbacks = [reduce_lr, early]
    )
    
    0 回复  |  直到 6 年前
        1
  •  1
  •   Marco Cerliani    6 年前

    您可以使用Doc2Vec创建示例嵌入。因此,我不认为嵌入层、Conv1D层和maxpoolg1d层在您的网络中有用。它们对word2vec很有用,在word2vec中,您可以提取每个令牌的嵌入,并在网络中使用它们。

    试着用这种方式直接为你的网络提供信息

    model1 = Sequential()
    model1.add(Dense(128, activation='relu', input_shape=(512,)))
    # ....
    model1.add(Dense(2, activation='softmax'))
    
    adam = optimizers.Adam(learning_rate=0.01, beta_1=0.9, beta_2=0.999, amsgrad=False)
    
    model1.compile(loss='sparse_categorical_crossentropy',
                  optimizer=adam,
                  metrics=['accuracy'])
    
    history  = model1.fit( np.array(encoded_x_train), np.array(train_y),
     epochs= 20,
     batch_size = 500,
     validation_data = (np.array(encoded_x_test), np.array(test_y)), callbacks = [reduce_lr, early]
    )