2017-01-18 4 views
0

Я пытаюсь понять, как я могу создать сверточную нейронную сеть для обработки естественного языка (NLP). В начало, я использую стандартную архитектуру, где а фильтр F скользит входную матрицу S для того, чтобы создать сверточную карту фильтра:Почему вывод conv2d (?, 6, 1, 1) вместо (?, 5, 1, 1)

enter image description here

Код ниже предполагается осуществить шаг свертки, но Я не совсем понимаю размеры вывода. Пожалуйста, не смущайтесь с изображением. В моем коде строки представляют собой вставки слов слов в отличие от изображения, где слово вложения - это столбцы.

filter_shape = [ 
    context_window_size, 
    word_embedding_size, 
    1, 
    num_filters 
] # filter_shape: [5, 300, 1, 1] 

F = tf.Variable(
    tf.truncated_normal(filter_shape, stddev=0.1), name="F") 
b = tf.Variable(
    tf.constant(1.0, shape=[num_filters], name="b")) # b: (1,) 

conv = tf.nn.conv2d(  
    input_S,    # input_S: (?, 10, 300, 1) 
    F,     # F: (5, 300, 1, 1) 
    strides=[1, 1, 1, 1], 
    padding="VALID", 
    name="conv" 
) # conv: (?, 6, 1, 1) 

h = tf.nn.relu(tf.nn.bias_add(conv, b), name="relu") # h: (?, 6, 1, 1) 

Что ожидать для [5x300] размера фильтра F скользящего по [10x300] входной матрице, где 10 является числом слов-векторов и 300 их соответствующего измерения, является [5x1] сверточным вектором признаков. Если фильтр помещается «в начале» входной матрицы, и он накладывается на него по 1 шагу за раз, фильтр может выполнять только 5 шагов без превышения входной матрицы.

Как вы можете видеть из комментариев в коде, я получаю сверточный векторный вектор. Из-за этого я совершенно уверен, что я неправильно понял, что здесь происходит.

Почему стоит conv(?, 6, 1, 1) и не (?, 5, 1, 1)?

ответ

0

Если вы напишете все комбинации последовательных интервалов (индексация с 0), вы получите 6 случаев:

[0,4], [1,5], [2,6], [3,7], [4,8], [5,9]

Смежные вопросы