CNN句子分類TensorFlow網絡解析

概要:

這篇博客主要分析瞭如何用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)

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章