Нужно ли добавлять собственные градиенты для этой операции?

У меня есть сверточный слой, который производит 16 выходных карт объектов, и я хочу взять эти карты и преобразовать их в 4 карты следующим образом:

  1. Разделите 16 карт функций на 4 группы по 4 карты в каждой.
  2. Умножьте каждую группу на маску, чтобы обнулить некоторые значения.
  3. Добавьте получившиеся карты объектов в каждую группу, чтобы получить 4 карты.

Или я могу сначала умножить все 16 карт на маску, а затем разделить результат на 4 группы, чтобы сделатьужную_сумму для каждой группы. Полученные 4 карты будут использоваться в качестве входных данных для следующего сверточного слоя или слоя объединения.

Сможет ли Tensorflow автоматически рассчитать градиент для этой комбинации tf.split, tf.multiply и tf.reduce_sum?

РЕДАКТИРОВАТЬ: вот серия операций, где conv это выход из tf.layers.conv2d, а также mask является двоичным массивом NumPy такой же формы, как conv (полный код здесь):

conv_masked = mask * conv
conv_grouped = tf.reshape(conv_masked, (batch_size, num_groups, fs*fs, dim, dim))
out = tf.reduce_sum(conv_grouped, axis=2)

1 ответ

Решение

Все операции с тензорным потоком уже имеют реализованную формулу градиента. Пока все ваши операции выполняются, вы в порядке.

Также, как вы можете видеть здесь, тензор потока перегружает основные операции.

masked_tensor = tensor * mask
masked_tensor = tf.multiply(tensor, mask)

Если задействованные элементы являются тензорами, то два приведенных выше выражения эквивалентны.

Что касается типа, используемого для маски

mask = tf.constant(array)
mask = np.array(array)

Для меня использование python 3.6.3 и tenenflow 1.3.0 сгенерировало один и тот же результат операции. Но я не нашел ничего в документации, которая явно говорит о том, что np.arrays всегда принимаются, поэтому я бы избегал этого.

Однако следует отметить, что маска, на которую вы умножаете, должна быть необучаемой переменной. В противном случае оптимизатор изменит вашу маску.

Другие вопросы по тегам