CNN英文垃圾邮件分类(卷积池化全连接)

版权声明:转载请注明出处 https://blog.csdn.net/The_lastest/article/details/81661705

整理自唐宇迪老师的视频课程,感谢他!

1.思路

有了前一篇对数据的预处理,我么将得到形如如下的预处理结果:

print(x[:3]

[[ 1  2  3  4  5  6  1  7  8  9 10 11 12 13 14  9 15  5 16 17 18 19 20 21
  22 23 24 25 26 27 28 29 30  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
   0  0  0  0  0  0  0  0]
 [ 1 31 32 33 34  1 35 34  1 36 37  3 38 39 13 17 40 34 41 42 43 44 45 46
  47 48 49  9 50 51 34 52 53 53 54  9 55 56  0  0  0  0  0  0  0  0  0  0
   0  0  0  0  0  0  0  0]
 [57 58 59 60 61  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
   0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
   0  0  0  0  0  0  0  0]]

print(y[:3]
[[0 1]
 [0 1]
 [0 1]]

接下来,就是先随机初始化一个形状为shape=[len(vocab_processor.vocabulary_),128]的矩阵。然后对于每个batch_size的邮件,按照每封邮件对应单词的索引构造出batch_size个二维矩阵。然后进行后面的一系列操作。

2. 构造二维矩阵并进行卷积池化全连接

2.1 构造二维矩

首先随机初始化一个形状为shape=[len(vocab_processor.vocabulary_),128]的矩阵。(此处为了演示说明,就举一个稍微小点的矩阵)

W = tf.Variable(tf.truncated_normal([5,9]))

[[0.074 0.313 0.931 0.48  0.284 0.251 0.668 0.453 0.189]
 [0.137 0.005 0.559 0.842 0.869 0.362 0.692 0.203 0.445]
 [0.086 0.353 0.479 0.27  0.181 0.941 0.165 0.304 0.217]
 [0.555 0.283 0.408 0.575 0.894 0.816 0.21  0.997 0.   ]
 [0.583 0.743 0.896 0.959 0.341 0.862 0.147 0.666 0.099]]

假设我们现在一个batch有2个样本input_x=[[2,3,1,0],[3,2,0,0]],那么我们怎么一下得到这两个样本对应的矩阵呢?此时我们就要用到TensorFlow中的另外一个函数tf.nn.embedding_lookup(),只要是类似相关的操作,都可以用这个函数来完成。此时,我们只需要 embedded_chars = tf.nn.embedding_lookup(W,input_x)就能得到了。但是,由于在TensorFlow中进行卷积池化操作时,对于每一批输入的图片都要求是4维的,即[batch_size,length,width,channel]。可此处,并没有包含channel通道这个维度([2,4,9]),所以要在最后加上一个维度embedded_chars_expanded = tf.expand_dims(embedded_chars, -1)(此时为[2,4,9,1])。

2.2 卷积池化全连接

经过上面的处理之后,对于每一个邮件样本,我们可以得到一个对应的形状为[1,59,128,1]的矩阵,下面就先进行卷积,然后池化。

对于卷积,我们采用了如下3个尺寸的卷积核[2,128,1,128],[3,128,1,128],[4,128,1,128]。具体讲解参见此文使用多个不同尺寸的卷积核卷积后的全连接处理

3 训练

按照训练集测试集9:1的比例,经过训练大概10万次的迭代,在测试集上的结果居然达到了1.

源码

猜你喜欢

转载自blog.csdn.net/The_lastest/article/details/81661705