使用Tensorflow实现卷积层

时间:2017-09-02 09:16:28

标签: tensorflow conv-neural-network

我正在尝试从此blog post实现文本分类的卷积层,并进行一些修改以满足我的需求。

在博客中,只有一个卷积层,而我希望有两个卷积层,然后是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:尺寸必须相等,但对于' convolution-block_16 / conv2'是256和1。 (op:' Conv2D')输入形状:[?,46,1,256],[5,100,1,256]。

我意识到我在图层的尺寸上犯了错误,但我无法修复它或放入正确的尺寸。

如果有人可以提供任何指导/帮助,那么它确实很有帮助。

谢谢。

1 个答案:

答案 0 :(得分: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")