Notes
- 用卷积处理一维数据(文本、时序序列),类似 image 空间的以为卷积
- 文本预处理(大略):
- 针对预料库建立字典,将 word 映射成数字(index,此时一般不用
0
,留作他用),于是 sentence 从 word 序列变成整数序列(Tokenizer) - 将句子处理成等长(pad_sequences()),长了截断,短了在前或在后补足(一般补
0
) - 有时将 index 处理成 one-hot 的
- 可用 Embedding 将 index 或 one-hot 向量映射成实数向量,从离散表示转成连续表示。感觉类似于 image 从 pixel 空间映射到另一个什么空间
- Conv1D 的 input shape 是
(batch_size, steps, input_dim)
step
即句子长度input_dim
类似 image 的channel
,可以是 embedding 之后的维度,若未经 embedding、处理成 one-hot 则对应 alphabet size 吧(文本 alphabet 那维类比图像 channel 那维)- 卷积核大小即「滑动窗口」大小(类似「感受野」)
- IMDb 数据库是「评论(text)」对应「情绪(0/1)」,情绪只有
正面 / 负面
两种,即二分类
Code
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Embedding, Conv1D, GlobalMaxPooling1D
from keras.datasets import imdb
ALPHABET_SIZE = 5000
MAXLEN = 400
EMB_DIM = 200
(trX, trY), (teX, teY) = imdb.load_data(num_words=ALPHABET_SIZE)
trX = pad_sequences(trX, maxlen=MAXLEN)
teX = pad_sequences(teX, maxlen=MAXLEN)
print(trX.shape)
m = Sequential([
Embedding(ALPHABET_SIZE, EMB_DIM),
Conv1D(128,
5,
padding='valid',
activation='relu',
strides=1),
GlobalMaxPooling1D(),
Dense(256, activation='tanh'),
Dense(1, activation='sigmoid')
])
m.summary()
m.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['acc'])
m.fit(trX, trY,
batch_size=64,
epochs=10,
verbose=1,
validation_data=(teX, teY))
loss, acc = m.evaluate(teX, teY)
print('loss:', loss)
print('acc:', acc)
References
- keras/examples/imdb_cnn.py
- 如何理解一维卷积神经网络的输入?
- IMDB 电影评论情感分类数据集
- What is global max pooling layer and what is its advantage over maxpooling layer?