Давайте предположим, что я хочу создать следующий слой в нейронной сети: вместо того, чтобы иметь квадратный сверточный фильтр, который перемещается по некоторому изображению, я хочу, чтобы форма фильтра была какой-то другой формы, скажем, прямоугольника, круга, треугольника.и т. д. (это, конечно, глупый пример; реальный случай, который я имею в виду, это нечто иное)Как мне реализовать такой слой в TensorFlow?
Я обнаружил, что можно определить пользовательские слои в Keras, расширив tf.keras.layers.Layer
, но документация довольно ограничена без множества примеров.Реализация сверточного уровня на Python, например, путем расширения tf.keras.layer.Layer
, вероятно, также поможет, но кажется, что сверточные уровни реализованы в C. Означает ли это, что я должен реализовать свой пользовательский уровень в C, чтобы получить какой-либо разумныйскорости или будет достаточно операций Python TensorFlow?
Редактировать: Возможно, этого достаточно, если я могу просто определить тензор весов, но где я могу настроить записи в тензоре, которые идентичны нулю, и некоторые веса отображаются внесколько мест в этом тензоре, тогда я должен быть в состоянии вручную построить сверточный слой и другие слои.Как бы мне это сделать, а также включить эти переменные в тренинг?
Edit2: Позвольте мне добавить еще несколько уточнений.Мы можем взять пример построения сверточного слоя 5x5 с одним выходным каналом с нуля.Если входное значение скажем 10x10 (плюс отступы, так что выход также 10x10)), я хотел бы представить это путем создания матрицы размером 100x100.Затем я бы заполнил 25 весов в правильных местах в этой матрице (поэтому некоторые записи равны нулю, а некоторые записи равны, то есть все 25 весов будут отображаться во многих местах в этой матрице).Затем я умножаю ввод с этой матрицей, чтобы получить вывод.Поэтому мой вопрос будет двойным: 1. Как мне сделать это в TensorFlow
?2. Будет ли это очень неэффективно, и рекомендуется какой-то другой подход (при условии, что я хочу позже настроить внешний вид этого фильтра, и, таким образом, стандарт conv2d
недостаточно хорош).
Edit3: Кажется выполнимымиспользуя разреженные тензоры и присваивая значения через ранее определенный tf.Variable
.Однако я не знаю, пострадает ли этот подход из-за проблем с производительностью.