как сделать "половинный" пул в нейронной сети? - PullRequest
3 голосов
/ 11 июля 2019

Я хочу сделать максимальный пул в моей сети, например:

enter image description here

Моя сеть 1D (вы можете подумать, что приведенный выше пример одинпредложение с 6 словами, в то время как каждое слово имеет 3 встраивания) Я не знаю длину фича (не каждое предложение имеет одинаковую длину), поэтому я не могу установить размер пула в tf.layers.MaxPooling1D (https://www.tensorflow.org/api_docs/python/tf/layers/MaxPooling1D)

Я просто хочу объединить каждую половину функций (или половину предложения). Есть ли какая-либо функция или метод для этого?

1 Ответ

0 голосов
/ 11 июля 2019

(Примечание. В моем предыдущем ответе была ошибка, которая могла привести к неправильным окнам пула. С этим должно быть все в порядке.)

Вот один из возможных способов, записанных в тензорном потоке "низкого уровня".Возможно, вам придется обернуть это в слой keras (или просто использовать Lambda), чтобы интегрировать его в вашу модель.

x = ...  # input, shape batch x n_words x features
x = tf.reshape(x, [batch, 2, n_words//2, features])  # need to get these dimensions, can get them from tf.shape(x) as well
x = tf.reduce_max(x, axis=2)

Это позволит реализовать максимальное объединение;Вы также можете использовать reduce_mean для среднего пула, например.

Это имеет одно ограничение, а именно, оно не будет работать, если n_words нечетно.В этом случае вам, возможно, придется проверить, есть ли это, и использовать tf.pad, чтобы добавить один элемент в ось слова, чтобы сделать его четным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...