Настраиваемый сверточный слой в TensorFlow - PullRequest
1 голос
/ 09 апреля 2019

Давайте предположим, что я хочу создать следующий слой в нейронной сети: вместо того, чтобы иметь квадратный сверточный фильтр, который перемещается по некоторому изображению, я хочу, чтобы форма фильтра была какой-то другой формы, скажем, прямоугольника, круга, треугольника.и т. д. (это, конечно, глупый пример; реальный случай, который я имею в виду, это нечто иное)Как мне реализовать такой слой в 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.Однако я не знаю, пострадает ли этот подход из-за проблем с производительностью.

1 Ответ

0 голосов
/ 11 апреля 2019

Просто используйте обычный конв.слои с квадратными фильтрами и обнуляют некоторые значения после каждого обновления веса:

   g = tf.get_default_graph()
   sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
   conv1_filter = g.get_tensor_by_name('conv1:0')
   sess.run(tf.assign(conv1_filter, tf.multiply(conv1_filter, my_mask)))

, где my_mask - двоичный тензор (той же формы и типа, что и ваши фильтры), который соответствует желаемому шаблону.

РЕДАКТИРОВАТЬ: если вы не знакомы с tenorflow, вы можете запутаться в использовании кода выше.Я рекомендую взглянуть на этот пример и, в частности, на способ построения модели (если вы сделаете это так, вы можете получить доступ к фильтрам первого слоя как 'conv1 / weights').Также я рекомендую перейти на PyTorch:)

...