2017-09-02 75 views
0

我試圖從blog post實現文本分類的卷積圖層,並進行了一些修改以適應我的需要。使用Tensorflow實現卷積圖層

在博客中,只有一個卷積層,而我希望我有兩個卷積層,其次是ReLU和最大池。

代碼到目前爲止是:

vocab_size = 2000 
embedding_size = 100 
filter_height = 5 
filter_width = embedding_size 
no_of_channels = 1 
no_of_filters = 256 
sequence_length = 50 
filter_size = 3 
no_of_classes = 26 


input_x = tf.placeholder(tf.int32, [None, sequence_length], name="input_x") 
input_y = tf.placeholder(tf.float32, [None, no_of_classes], name="input_y") 



# Defining the embedding layer: 

with tf.device('/cpu:0'), tf.name_scope("embedding"): 
    W = tf.Variable(tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0), name="W") 
    embedded_chars = tf.nn.embedding_lookup(W, input_x) 
    embedded_chars_expanded = tf.expand_dims(embedded_chars, -1) 


# Convolution block: 

with tf.name_scope("convolution-block"): 
    filter_shape = [filter_height, embedding_size, no_of_channels, no_of_filters] 
    W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W") 
    b = tf.Variable(tf.constant(0.1, shape=[no_of_filters]), name="b") 

    conv1 = tf.nn.conv2d(embedded_chars_expanded, 
        W, 
        strides = [1,1,1,1], 
        padding = "VALID", 
        name = "conv1") 

    conv2 = tf.nn.conv2d(conv1, 
        W, 
        strides = [1,1,1,1], 
        padding = "VALID", 
        name = "conv2") 

在此,W是濾波器矩陣。

然而,這給出了錯誤:

ValueError: Dimensions must be equal, but are 256 and 1 for 'convolution-block_16/conv2' (op: 'Conv2D') with input shapes: [?,46,1,256], [5,100,1,256].

我意識到我已經在該層的尺寸犯了錯誤,但我無法修復它或將在正確的尺寸。

如果任何人可以提供任何指導/幫助,它會非常有幫助。

謝謝。

回答

1

無法完全理解您的代碼,但如下所示更改將解決您的問題。

with tf.name_scope("convolution-block"): 
    filter_shape = [filter_height, embedding_size, no_of_channels, no_of_channels #change the output channel as input#] 
    W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W") 
    b = tf.Variable(tf.constant(0.1, shape=[no_of_filters]), name="b") 

    conv1 = tf.nn.conv2d(embedded_chars_expanded, 
        W, 
        strides = [1,1,1,1], 
        padding = "SAME", ##Change the padding scheme 
        name = "conv1") 

    conv2 = tf.nn.conv2d(conv1, 
        W, 
        strides = [1,1,1,1], 
        padding = "VALID", 
        name = "conv2")