Conv1D 简例:IMDb 分类

Notes

  • 用卷积处理一维数据(文本、时序序列),类似 image 空间的以为卷积
  • 文本预处理(大略):
    1. 针对预料库建立字典,将 word 映射成数字(index,此时一般不用0,留作他用),于是 sentence 从 word 序列变成整数序列(Tokenizer
    2. 将句子处理成等长(pad_sequences()),长了截断,短了在前或在后补足(一般补0
    3. 有时将 index 处理成 one-hot 的
    4. 可用 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

# -*- coding: utf-8 -*-
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  # 只留下前这么多种 word(按词频?)
MAXLEN = 400  # 句子统一处理成这个长度
EMB_DIM = 200  # 将离散句子表示嵌入到这个维度的欧氏空间

(trX, trY), (teX, teY) = imdb.load_data(num_words=ALPHABET_SIZE)
# print(trX.shape)  # (25000,) -> 伪·1D, 实质是 `ndarray` 套 `list` 的 2D 数据
# print(trY.shape)  # (25000,)
# print(type(trX))  # np.ndarray -> 1st dim
# print(type(trX[0]))  # list -> 2nd dim
# print(len(trX[0]))  # 218
# print(trX[0])
# print(trY[0])  # scalar

# print(trX[0])  # index but NOT one-hot
trX = pad_sequences(trX, maxlen=MAXLEN)
teX = pad_sequences(teX, maxlen=MAXLEN)
print(trX.shape)  # still NOT one-hot
# print(trX[0])

m = Sequential([
    Embedding(ALPHABET_SIZE, EMB_DIM),  # (batch_size, seq_len: 400, dim: 200)
    Conv1D(128,  # 卷积核数
		   5,  # 卷积核/滑动窗口 大小
           padding='valid',
           activation='relu',
           strides=1),  # (batch_size, 396, 128)
    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

  1. keras/examples/imdb_cnn.py
  2. 如何理解一维卷积神经网络的输入?
  3. IMDB 电影评论情感分类数据集
  4. What is global max pooling layer and what is its advantage over maxpooling layer?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值