Нужно ли добавлять собственные градиенты для этой операции?
У меня есть сверточный слой, который производит 16 выходных карт объектов, и я хочу взять эти карты и преобразовать их в 4 карты следующим образом:
- Разделите 16 карт функций на 4 группы по 4 карты в каждой.
- Умножьте каждую группу на маску, чтобы обнулить некоторые значения.
- Добавьте получившиеся карты объектов в каждую группу, чтобы получить 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 всегда принимаются, поэтому я бы избегал этого.
Однако следует отметить, что маска, на которую вы умножаете, должна быть необучаемой переменной. В противном случае оптимизатор изменит вашу маску.