整理自唐宇迪老师的视频课程,感谢他!
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.