Сгруппированные свертки в Tensorflow 2: Количество каналов в фильтре должно соответствовать последнему измерению входного сигнала

#python #tensorflow

Вопрос:

Я пытаюсь использовать сгруппированные 3D-свертки в Tensorflow 2, но я изо всех сил пытаюсь понять, почему все работает не так, как ожидалось. Вот соответствующая часть функции построения модели, где я указываю количество фильтров f1 .

 ... # f1 is an integer, specifying the number of filters x = Conv3D(f1, kernel_size=(1, 1, 1))(x) x = BatchNormalization()(x) print(x.shape) x = Conv3D(3*f1, kernel_size=(3, 3, 3), padding='same', groups=3)(x) print(x.shape) ...  

Согласно документации (и интуиции тоже), при использовании groups параметра,

[…] Каждая группа свернута отдельно с фильтрами / фильтрами групп. Результатом является объединение результатов всех групп вдоль оси канала. Входные каналы и фильтры должны быть разделены на группы.

В частности, предположим, что f1=12 , input channels=12 и filters=36 , которые оба делятся на количество групп (3). Вывод print утверждений на самом деле

 (None, 35, 35, 19, 12) (None, 35, 35, 19, 36)  

и поэтому я ожидаю, что он будет работать должным образом. Вместо этого я получаю

Количество каналов в фильтре (4) должно соответствовать последнему размеру входного сигнала (12)

что как-то противоречит моему здравому смыслу. Похоже, что «4» канала в каждом фильтре получаются из деления 12 на количество групп (3), которое, как ожидает Tensorflow, тем не менее будет равно количеству самих входных каналов (12). Я пробовал использовать различные комбинации входных и выходных фильтров, всегда делящихся на 3, но это никогда не срабатывает.

Я определенно что-то здесь упускаю. Большое вам спасибо, если у вас есть какие-либо предложения о том, что я могу делать неправильно!