что это значит, когда глубина ядра = 1 в conv3d pytorch

#machine-learning #deep-learning #computer-vision #pytorch

#машинное обучение #глубокое обучение #компьютерное зрение #pytorch

Вопрос:

Я хотел бы понять разницу между conv2d и conv3d в PyTorch.

В чем разница между:

 conv3d(in, out, kernel_size(1,3,3))
 

и

 conv2d(in,out,kernel_size(3,3))
 

Я проверил официальную документацию, но не совсем понял разницу между ними. Должен ли conv3d в этом случае быть таким же, как conv2d, поскольку глубина равна 1? Любая помощь будет оценена.

Ответ №1:

Ну, чтобы дать интуитивное представление о том, как работает ядро, я бы рекомендовал посмотреть, как получаются ячейки (они же нейроны) одного слоя объектов.

Для 2D свертки у вас есть высота и ширина слоя ядра (KL), который проходит через один слой объектов (FL) из 2D сверточных слоев (CL). Поскольку CL может иметь множество FLS, несколько KLS затем создаются параллельно и размещаются поверх разных FLS, чтобы он мог обрабатывать их параллельно. Эта параллельная обработка обычно иллюстрируется как «многоуровневая» структура KLs, которую обычно называют просто Kernel. Путаницу может привести не только необычность названия «ядро» из этой множественной структуры, но и тот факт, что параллельная обработка KLS обычно иллюстрируется как укладка KLS, создавая иллюзию измерения глубины. Поэтому важно помнить: это не третье измерение, это просто параллельная обработка KLS-FLS.

Для 3D-свертки вам теперь нужен 3D KL для обработки 3D FL. Теперь это настоящее третье измерение. Количество 3D-файлов, которые будут «сложены», будет автоматически скорректировано, чтобы он мог параллельно обрабатывать несколько 3D-файлов из вашей сети.

Что касается вашего вопроса: действительно, 3D-ядро с глубиной 1 такое же, как 2D-ядро, однако функции строятся по-разному для разных случаев. То есть 2D для изображений с двумя измерениями (высота, ширина) и 3D для изображений с тремя измерениями (высота, ширина, глубина).

Ответ №2:

В некоторых конкретных случаях они могут дать тот же результат.

Возьмем conv1d , conv2d к примеру, and: с a (1, n) в conv1d вы проходите через 1D ввод (т.е. w>0 and h=1 ), когда ядро достигло конца строки, его результат готов. Однако в con2d это 2D-ввод, над которым вы работаете (т.Е. w>0 И h>0 ), Он перейдет к следующей строке, пока не достигнет нижней строки. Таким образом, его результатом также является 2D-объект.

Слои добавляют глубину к вводу / выводу у вас может быть несколько in слоев, которые будут определять количество слоев на ядро, а out слой — количество ядер.

Если мои наблюдения верны, мы можем сказать, что однослойный d*h*w тензор, проходящий через conv3d 1x3x3 ядро (), совпадает с d многослойным h*w тензором, проходящим через conv2d ядро с d , d -многослойными 3x3 ядрами. Выходные формы будут (N, 1, d, h, w) vs (N, d, h, w) (где d используется как количество каналов в последнем).

В некоторых случаях вы можете получить те же результаты (операции). Однако при добавлении глубины к вашему conv3d (слои могут работать как 4-е измерение), вы не сможете сопоставить это с a conv2d , как следует из названия!

Ответ №3:

В каком-то смысле это одно и то же. У них есть отдельные реализации в базовой библиотеке cuDNN, поэтому могут быть некоторые различия в производительности (хотя это не всегда можно ожидать, см. Форум Pytorch здесь и здесь ).

Но я бы также сказал, что это также делает код лучше читаемым и предотвращает ошибки: вы ясно видите, что это 2D-свертка, и вы не можете ошибиться при определении формы ядра.