CNN句子分类TensorFlow网络解析

9 篇文章 0 订阅
2 篇文章 0 订阅

概要:

这篇博客主要分析了如何用TensorFlow对句子建模,模型为CNN,涉及到常用函数的参数及解释。

首先放入 序列,进入embedding层,得到维度为 [none,句子长度,词向量维度,1]的张量,多的维度是用来做卷积的。

[None,sentence_length,embed_size]
self.embedded_words_q = tf.nn.embedding_lookup(self.Embedding_q, self.input_x_q)#

#input data format:NHWC:[batch, height, width, channels];output:4-D
[None,sentence_length,embed_size,1). 
self.sentence_expanded_q=tf.expand_dims(self.embedded_words_q, -1) #
expand dimension so meet input requirement of 2d-conv

 然后定义CNN中的卷积核,是一个tensor,

具有[filter_height  窗口大小, filter_width窗口大小, in_channels输入通道, out_channels输出通道]

这样的shape。可以看出实际上窗口高就是词向量维度(图中的d)

# 相当于CNN中的卷积核,它要求是一个Tensor,
# 具有[filter_height, filter_width, in_channels, out_channels]
# 这样的shape
# 3 ,100 ,1 , 128
filter = tf.get_variable("filter-%s" % filter_size,[filter_size,self.embed_size,1,self.num_filters],initializer=self.initializer)

 经过卷积之后,因为padding是valid,所以垂直方向上会产生  length  - filter size +1 个结果,水平方向会产生1个结果,因为窗口大小是词向量维度。根据图上的第2,3步我们会发现window size 变大,输出的结果就变短.

# ?,28,1,128
# batch size,reduced height,??,out_channels
#shape:[batch_size,sequence_length - filter_size + 1,1,num_filters]
conv_q=tf.nn.conv2d(self.sentence_expanded_q, filter, strides=[1, 1, 1, 1], padding="VALID", name="conv") 

 b偏置的维度是128,和conv q的最后一个维度相同

# (128,)
b=tf.get_variable("b-%s"%filter_size,[self.num_filters]) #ADD 2017-06-09
# (?,28,1,128)
#   shape:[batch_size,sequence_length - filter_size + 1,1,num_filters].
h_q=tf.nn.relu(tf.nn.bias_add(conv_q,b),"relu") tf.nn.bias_add:adds `bias` to `value`\

 然后做最大值池化,跟前面一样。操作窗口的大小定义顺序为  batch size,高,宽,通道数。我们这里要将上一步卷积的k个region结果做池化,所以第二个参数为self.sequence_length-filter_size+1

# NHWC
# ksize: A list or tuple of 4 ints. The size of the window for each dimension
#  of the input tensor.
# (?,1,1,128)
pooled_q = tf.nn.max_pool(h_q, ksize=[1,self.sequence_length-filter_size+1,1,1], strides=[1,1,1,1], padding='VALID',name="pool")

 设置不同的窗口大小(邻居大小),把多个pooled q放入一个list中,然后拼接最后一个维度。现在在reshape下维度为1的轴自动消失,h pool被展平为h pool flat。最终得到了句子向量

#shape:[batch_size, 1, 1, num_filters].max_pool:
performs the max pooling on the input.
pooled_outputs_q.append(pooled_q)

(?,1,1,256)
 #shape:[batch_size, 1, 1, num_filters_total].

self.h_pool_q=tf.concat(pooled_outputs_q, 3) tf.concat=>concatenates tensors along one dimension.where num_filters_total=num_filters_1+num_filters_2+num_filters_3


self.h_pool_flat_q=tf.reshape(self.h_pool_q, [-1, self.num_filters_total]) #shape should be:[None,num_filters_total]. here this operation has some result as tf.sequeeze().e.g. x's shape:[3,3];tf.reshape(-1,x) & (3, 3)---->(1,9)

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值