美文网首页
keras_imdb_lstm

keras_imdb_lstm

作者: 苟且偷生小屁屁 | 来源:发表于2017-10-16 18:58 被阅读0次

    程序分析

    from __future__ import print_function
    
    from keras.preprocessing import sequence
    
    from keras.models import Sequential
    
    from keras.layers import Dense, Embedding
    
    from keras.layers import LSTM
    
    from keras.datasets import imdb
    
    
    
    max_features = 20000
    
    maxlen = 80  
    
    batch_size = 32
    
    
    
    print('Loading data...')
    
    # 作者原版的意思是最多只选取前20000个出现频率最高的词建立数据库
    # (x_train, y_train), (x_test, y_test) = imdb.load_data(nb_words=max_features)
    
    

    这里简要的介绍一下imdb数据集:

    • IMDB的全称是(Internet Movie Database)即互联网电影数据集,这个数据集的全部组成部分是什么没有细查,我们这里只用到了IMDB的影评数据
    • 影评就是类似"I like this movie"这样的一段话, IMDB将影评中全部出现的字进行统计, 并给它们标号,比如"I like this movie"就可以用[1 4 23 6]这样的数组来表示.
    • 用法如下:
    > from keras.datasets import imdb
    > (X_train, y_train), (X_test, y_test) = imdb.load_data(path="imdb.npz",
                                                          nb_words=None,
                                                          skip_top=0,
                                                          maxlen=None,
                                                          test_split=0.1)
                                                          seed=113,
                                                          start_char=1,
                                                          oov_char=2,
                                                          index_from=3)
    
    • 先说说参数:
      1 path: 如果不指定,默认的path是~/.keras/datasets/,即一个隐藏文件夹
      2 nb_words:整数或者None, 即要考虑的最常见的单词数,比如作者就写了nb_words=max_features(20000),也就是只考虑最常见的20000个单词
      3 skip_top整数,默认是0.忽略最常出现的若干单词,这些单词江北编码成oov_char的值.
    • 再说说输出:
      1 X_train,X_test:是一个数组,数组的每个元素都是一段编码后的影评,shape=(25000, ),
      2 y_train,y_test:也是一个数组,shape=(25000, ),数组的每个元素是影评的正/负面,即1/0
    • 继续
    (x_train, y_train), (x_test, y_test) = imdb.load_data()
    
    print(len(x_train), 'train sequences')
    
    print(len(x_test), 'test sequences')
    
    
    
    print('Pad sequences (samples x time)')
    
    x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
    
    x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
    

    这里完成的是数据格式的转化
    特别注意到pad_sequences的用法

    填充序列pad_sequences
    keras.preprocessing.sequence.pad_sequences(sequences, maxlen=None, dtype='int32', padding='pre', truncating='pre', value=0.)
    显然,如果想用pad_sequences,必须首先对其调用
    from keras.preprocessing import sequence
    sequence.pad_sequences(一大堆参数)

    pad_sequences怎么用
    很明显,X_train有25000条,目前每一条的长度都不固定,因为影评的长度不固定
    我们现在想把这些影评的长度归一化
    参数maxlen,默认None就是这个长度,作者设置为maxlen=maxlen(80),也就是作者觉得80个字已经足够描述这段话的情感了
    如果maxlen不指定, 那么将会按照最长的那段话来计数
    大于此长度的序列将被截短,小于此长度的序列将在后部填0

    pad_sequences的输出
    将长为nb_samples的序列(标量序列)转化为形如(nb_samples,nb_timesteps)2D numpy array。
    在这里就是将(25000,)转化为(25000,80)这样的矩阵

    • 继续,下面就是模型
    print('x_train shape:', x_train.shape)
    
    print('x_test shape:', x_test.shape)
    
    print('Build model...')
    
    model = Sequential()
    
    model.add(Embedding(max_features, 128))
    
    • Embedding层
    #model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))
    
    model.add(LSTM(128))
    
    model.add(Dense(1, activation='sigmoid'))
    
    
    # try using different optimizers and different optimizer configs
    
    model.compile(loss='binary_crossentropy',
    
                  optimizer='adam',
    
                  metrics=['accuracy'])
    
    
    
    print('Train...')
    
    model.fit(x_train, y_train,
    
              batch_size=batch_size,
    
              nb_epoch=15,
    
              validation_data=(x_test, y_test))
    
    score, acc = model.evaluate(x_test, y_test,
    
                                batch_size=batch_size)
    
    print('Test score:', score)
    
    print('Test accuracy:', acc)
    

    相关文章

      网友评论

          本文标题:keras_imdb_lstm

          本文链接:https://www.haomeiwen.com/subject/eyakuxtx.html