Как создать пользовательский слой для выборки в Keras Tensorflow? - PullRequest
1 голос
/ 07 марта 2019

Я создаю CNN в Керасе с бэкэндом Tensorflow, и я хотел бы представить пользовательский слой, который должен выполнять следующее:

  • Вывести тензор такой же формы и типа, каквходной тензор.
  • Выход состоит из нескольких выборок входного тензора, скажем, 25%.Остальная часть выходного тензора должна быть равна нулю.
  • Выборки должны выбираться случайным образом, , чтобы пиксель с наивысшими значениями выбирался с большей вероятностью .Другими словами, распределением вероятностей должен быть сам входной тензор (нормализованный).

На данный момент мне удалось создать макет, в котором я выбираю верхние 25% пикселей входного тензора и создаю из них выходной тензор того же размера.Но это не случайная выборка.

В идеале я хотел бы использовать тензор потока, эквивалентный: np.random.choice(input_tensor, num_samples, input_tensor_normalized), где третий аргумент - это распределение вероятности, которому нужно следовать.Обратите внимание, что это работает только на 1D np.array.

Я слышал о tf.random.multinomial, но он устарел и tf.random.categorical принимает logits в качестве входных данных (я не думаю, что это мой случай) и не предлагает распределение вероятностей.

Можно изменить форму входного тензора как вектора, выполнить 1D-выборку в Tensorflow, если есть способ, построить аналогичный вектор с выборочными значениями по соответствующему индексу и нулям в других местах, а затем изменить форму кактензор потом.

Есть еще идеи?

Должен ли я перейти на PyTorch?

Большое спасибо

1 Ответ

0 голосов
/ 07 марта 2019

Вы все еще можете использовать tf.random.categorical.Логиты - это просто ненормализованные вероятности журналов.Поэтому, если у вас уже есть готовое распределение вероятностей, вы можете выполнить:

samples = tf.random.categorical(tf.log(input_tensor_normalized), num_samples)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...