美文网首页
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

    程序分析 这里简要的介绍一下imdb数据集:IMDB的全称是(Internet Movie Database)即互...

网友评论

      本文标题:keras_imdb_lstm

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