Я создаю 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?
Большое спасибо