2017-01-13 5 views
1

Я пытаюсь построить CLDNN, что исследованный в работе hereTensorflow уменьшить размеры ранга 3 тензора

После сверточных слоев, особенности пройти через слой тускло-восстановительным. В момент, когда функции покидают конверовские слои, размеры составляют [?, N, M]. N представляет количество окон, и я думаю, что сеть требует уменьшения размера M, поэтому размеры объектов после тусклого красного слоя составляют [?,N,Q], где Q < M.

У меня есть два вопроса.

  1. Как это сделать в TensorFlow? Я попытался с помощью гири с

    W = tf.Variable(tf.truncated_normal([M,Q],stddev=0.1)) 
    

    Я думал, что умножение tf.matmul(x,W) даст [?, N, Q] но [?, N, M] и [M, Q] не являются допустимыми размерами для умножения. Я хотел бы сохранить N постоянным и уменьшить размер M.

  2. Какую нелинейность следует применять к исходу tf.matmul(x,W)? Я думал об использовании ReLU, но я даже не мог сделать # 1.

ответ

0

Согласно связанной бумаги (TN Sainath и др:. "Конволюционное, Long кратковременная память, полностью Connected Deep Neural Networks"),

[...] сокращения размерность, такая, что мы имеем 256 выходов из линейного слоя, была подходящей.

Это означает, что, независимо от размера входного сигнала, т.е. [?, N, M] или любой другой размерности (всегда при условии, что первое измерение представляет собой число выборок в мини-партии, обозначаемой ?), выход будет [?, Q], где обычно Q=256.

Поскольку мы уменьшаем размерность путем умножения ввода на весовую матрицу, пространственная информация не сохраняется. Это означает, что не имеет значения, является ли каждый вход матрицей или вектором, поэтому мы можем изменить вход на линейный слой x, чтобы иметь размеры [?, N*M]. Затем мы можем создать простую матрицу умножения tf.matmul(x, W) где W является матрица с размерами [N*M, Q].

W = tf.Variable(tf.truncated_normal([N*M, Q], stddev=0.1)) 
x_vec = tf.reshape(x, shape=(-1, N*M)) 
y = tf.matmul(x_vec, W) 

Наконец, что касается вопроса 2: в документе, уровень уменьшения размерности является линейным слоем, то есть вы не применить нелинейность к выходу.