Tensorflow:过滤器不得大于输入

时间:2016-09-25 23:14:28

标签: python machine-learning tensorflow deep-learning convolution

我想沿着形状[n * 1]的训练样本执行卷积并且也应用零填充。到目前为止,没有结果。

我正在构建一个角色级别的CNN(想法来自here

我的数据基本上是推文,最初的长度均为140。 我过滤所有非字母字符(用空字符串''替换),所有字母字符我转换为小写并编码为一个热字符编码器。

所以我的数据是n * m,其中n是训练样本的数量,m = 140 * 26 = 3640,因为每个字母字符被编码为一个热矢量。

现在,我正在尝试进行卷积,这就是我遇到问题的地方。实质上: 1)我尝试在其周围用零填充一条推文。 2)那么我想做的是沿着推文使用过滤器3 * 3进行卷积,我希望它的大小为3642 * 3,其中宽度= 3642,高度= 3后填充。

F = 3 # filter size
S = 1 # stride
P = 1 # zero-pading
MAX_DOCUMENT_LENGTH = 3640
IMAGE_WIDTH = MAX_DOCUMENT_LENGTH
IMAGE_HEIGHT = 1
N_FILTERS = 20
FILTER_SHAPE1 = F
BATCH_SIZE = 257

def conv_model(X, y):
    X = tf.cast(X, tf.float32)
    y = tf.cast(y, tf.float32)
    # reshape X to 4d tensor with 2nd and 3rd dimensions being image width and height
    # final dimension being the number of color channels
    X = tf.reshape(X, [-1, IMAGE_WIDTH, IMAGE_HEIGHT, 1])
   # first conv layer will compute N_FILTERS features for each FxF patch
    with tf.variable_scope('conv_layer1'):
            h_conv1 = tf.contrib.layers.conv2d(inputs=X,num_outputs=N_FILTERS, 
                                  kernel_size=[3,3], padding='VALID')

我收到错误:ValueError: Filter must not be larger than the input: Filter: (3, 3) Input: (3640, 1)

为什么不应用零填充?至少,其应用结果不起作用......

所以我将过滤器大小更改为[3,1],然后调用:

h_conv1 = tf.contrib.layers.conv2d(inputs=X, num_outputs=N_FILTERS, kernel_size=[3,1], padding='VALID')

我没有得到错误。

有人可以解释一下发生了什么吗?

另外,为什么我们需要将输入重新整形为X = tf.reshape(X,[ - 1,IMAGE_WIDTH,IMAGE_HEIGHT,1])?

1 个答案:

答案 0 :(得分:2)

  

为什么不应用零填充?

在conv2d中使用padding = 'SAME'进行零填充。

  

有人可以解释一下发生了什么吗?

对于“平面”图像,您无法使用3x3滤镜。要使用3x3滤镜,输入的宽度和高度尺寸应大于3。

  

另外,为什么我们需要将输入重新整形为X = tf.reshape(X,[-1,   IMAGE_WIDTH,IMAGE_HEIGHT,1])?

单张图像的形状为[宽度,高度,number_of_channels]。额外尺寸代表小批量尺寸。 -1只保留总大小。