Я проходил документооборот по керасам и нашел два типа конвульсий Conv1D и Conv2D. Я выполнил поиск в Интернете, и это то, что я понимаю о Conv1D и Conv2D; Conv1D используется для последовательностей, а Conv2D - для изображений.
Я всегда думал, что нервные сети свертки использовались только для изображений и таким образом визуализировали CNN.
Изображение рассматривается как большая матрица, а затем фильтр скользит по этой матрице и вычисляет точечное произведение. Это я верю, что Керас упоминает как Conv2D. Если Conv2D работает таким образом, то каков механизм Conv1D и как мы можем представить его механизм?
Ответы:
Свертка - это математическая операция, в которой вы «суммируете» тензор, матрицу или вектор в меньший. Если ваша входная матрица одномерна, вы суммируете ее по измерениям, а если тензор имеет n измерений, вы можете суммировать по всем n измерениям. Conv1D и Conv2D суммируют (сворачивают) по одному или двум измерениям.
Например, вы можете свернуть вектор в более короткий вектор, как следует. Получите «длинный» вектор A с n элементами и сверните его, используя весовой вектор W с m элементами, в «короткий» (суммарный) вектор B с n-m + 1 элементами: гдебя= ∑j = m - 10aя + J∗ шJ i = [ 1 , n - m + 1 ]
Таким образом, если у вас есть вектор длины n, а ваша весовая матрица также имеет длину n , то в результате свертки будет получен скаляр или вектор длины 1, равный среднему значению всех значений во входной матрице. Это своего рода вырожденная свертка, если хотите. Если одна и та же весовая матрица короче входной, вы получите скользящую среднюю на выходе длины 2 и т. Д.веся= 1 / n
Вы можете сделать то же самое для трехмерного тензора (матрицы) таким же образом: гдебя к л= ∑J1= м1- 1J2= м2- 1J3= м4- 10aя + J1, K + J2, л + ж3∗ шJ1J2J3 я = [ 1 , н1- м1+ 1 ] , k = [ 1 , n2- м2+ 1 ] , l = [ 1 , n3- м3+ 1 ]
источник
Эта 1-мерная свертка экономит затраты, она работает таким же образом, но принимает одномерный массив, который умножает элементы. Если вы хотите визуализировать представление о матрице из строки или столбца, т.е. одного измерения, когда мы умножаем, мы получаем массив той же формы, но с более низкими или более высокими значениями, таким образом, это помогает максимизировать или минимизировать интенсивность значений.
Это изображение может помочь вам,
Подробнее см. Https://www.youtube.com/watch?v=qVP574skyuM.
источник
Я буду использовать перспективу Pytorch, однако логика остается той же.
При использовании Conv1d () мы должны помнить, что мы, скорее всего, будем работать с двумерными входами, такими как последовательности ДНК с горячим кодированием или черно-белые изображения.
Единственное отличие между более традиционными Conv2d () и Conv1d () состоит в том, что последний использует одномерное ядро, как показано на рисунке ниже.
Здесь высота ваших входных данных становится «глубиной» (или in_channels), а наши строки становятся размером ядра. Например,
Мы можем видеть, что ядро автоматически охватывает высоту изображения (так же, как в Conv2d () глубина ядра автоматически охватывает каналы изображения), и поэтому все, что нам остается, - это размер ядра по отношению к размеру строки
Нам просто нужно помнить, что если мы предполагаем двумерный ввод, наши фильтры становятся нашими столбцами, а наши строки - размером ядра.
источник
Я хотел бы объяснить разницу визуально и подробно (комментарии в коде) и очень очень простой подход.
Давайте сначала проверим Conv2D в TensorFlow .
И Conv1D является частным случаем Conv2D, как указано в этом параграфе из документа TensorFlow Conv1D .
Давайте посмотрим, как мы можем передать Conv1D также проблема Conv2D. Поскольку Conv1D обычно используется в сценариях НЛП, мы можем проиллюстрировать это в приведенной ниже проблеме НЛП.
Давайте сделаем это с помощью Conv1D (также в TensorFlow):
Мы можем видеть, что 2D в Conv2D означает, что каждый канал на входе и фильтре является двухмерным (как мы видим в примере с gif), а 1D в Conv1D означает, что каждый канал на входе и фильтре является одномерным (как мы видим в cat и собака нлп пример).
источник