程序分析
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)
- 先说说参数:
1path
: 如果不指定,默认的path是~/.keras/datasets/,
即一个隐藏文件夹
2nb_words
:整数或者None, 即要考虑的最常见的单词数,比如作者就写了nb_words=max_features(20000)
,也就是只考虑最常见的20000个单词
3skip_top
整数,默认是0.忽略最常出现的若干单词,这些单词江北编码成oov_char
的值.
- 再说说输出:
1X_train,X_test
:是一个数组,数组的每个元素都是一段编码后的影评,shape=(25000, ),
2y_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)
网友评论