0

Я хочу выполнить свертку вдоль учебного образца, имеющего форму [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])?

ответ

2

Why is zero-padding not applied?

Использование padding = 'SAME' в conv2d для нулевого заполнения.

Could someone please explain what is happening?

Вы не можете использовать фильтр 3x3 в случае «плоского» изображения. Для использования фильтра 3x3 вход должен иметь размеры больше 3 по ширине и высоте.

Also, why do we need to reshape the input as X = tf.reshape(X, [-1, IMAGE_WIDTH, IMAGE_HEIGHT, 1])?

Одно изображение имеет форму [ширина, высота, число_каналов]. Дополнительный размер означает размер мини-бара. -1 просто сохраняет общий размер.