фильтры по глубине против обычных сверточных нейронных сетей - PullRequest
0 голосов
/ 20 июня 2019

Я немного запутался в различиях в фильтрах / ядрах, когда дело касается глубинных и сверточных нейронных сетей.Например, скажем, для каждого случая входное изображение имеет размер 8x8x3.По глубине будет 3 фильтра (скажем, 3x3x1), а в reg conv2d будет 1 фильтр (3x3x3).Это правильно?

По глубине каждый из 3 фильтров различен.В reg conv2d каждый фильтр 'канал' (это правильный термин?) Отличается?Или они все одинаковые?

Если они отличаются, чем отличаются эти 2 операции?Я знаю в dw, вы можете включить множитель канала (чтобы глубина вывода всегда была кратна его глубине ввода).В reg conv2d у вас может быть несколько фильтров 3x3x3, что также увеличивает глубину вывода.

Так что, в принципе, я немного запутался, в чем различия.

1 Ответ

0 голосов
/ 20 июня 2019

Различия заключаются в количестве параметров (и, следовательно, операций умножения и, следовательно, скорости) для достижения одинакового выходного размера, благодаря концепции отделимости. Если вы ветеран сверток изображений, вы, вероятно, знаете, что некоторые фильтры 3x3 можно разделить на два фильтра 1x3 (наиболее известный пример - фильтр sobel). Таким образом, такое же вычисление может быть выполнено только с 6 параметрами вместо 9. Глубоко применяет эту концепцию для отделения пространственной части свертки от части канала - выполняется пространственная свертка на одном канале за раз, затем добавляется стандартная свертка 1x1 слой, чтобы изменить количество каналов. Это использует гораздо меньше параметров и, следовательно, намного меньше умножений.

Ваш конкретный пример на самом деле неверен (или, по крайней мере, вводит в заблуждение), потому что 3 фильтра глубины дают выходной сигнал 8x8x3, в то время как фильтр с одинарной конвой дает выходной сигнал 8x8x1. Но даже в этом случае, как вы правильно намекали, можно действительно создать один стандартный слой свертки, который получает тот же ответ - дело в том, что последний имеет больше параметров и, следовательно, медленнее. В вашем примере, чтобы получить тот же результат, что и для случая с глубиной, вам потребуется 3 фильтра и, следовательно, 3х количество параметров для случая с глубиной, хотя мы немного обманываем относительно типичного случая, не имея дополнительного слоя 1x1, изменяющего канал так что давайте исправим это. В общем, если вы хотите переключить свой пример на вывод 8x8xN, стандартный метод будет использовать параметры Nx3x3x3, в то время как метод глубины будет использовать 3x3x3 + Nx3x1x1 - таким образом, 27N против (3N + 27).

В теории можно ожидать, что ограничение отделимости уменьшит способность к обучению, но я предполагаю, что на практике это либо не соответствует действительности, либо является исключительно минимальным и, следовательно, стоит компромисса со скоростью. Может быть, существует сильная тенденция к разделению «полезных» фильтров - опять же, Собел послужил бы отличным примером - но я лично не знаю каких-либо доказательств, подтверждающих это.

Эта статья является очень полезным и более полным объяснением: https://towardsdatascience.com/a-basic-introduction-to-separable-convolutions-b99ec3102728

...