Можем ли мы использовать 1D свертку для классификации изображений?

#python #tensorflow #keras #conv-neural-network

#python #тензорный поток #keras #conv-нейронная сеть

Вопрос:

У меня есть изображения с формой (100, 100, 3), и я хочу использовать keras 1D свертку для классификации изображений. Я хочу знать, возможно ли это, и какую форму ввода мне нужно использовать.

PS: я использую tf.data.Dataset , и мой набор данных пакетный (20, 100, 100, 3).

Комментарии:

1. Вы можете, но у вас есть веская причина для этого? Я полагаю, что фильтры 1d свертки не смогут создавать очень интересные шаблоны в случае изображений. В любом случае, все, что вам нужно сделать, это преобразовать ваши изображения в формат, ожидаемый 1d conv. — вам нужно будет объединить размеры ширины и высоты в один.

Ответ №1:

Я предполагаю, что вы имеете в виду свертки 1×1, которые свертывают изображения по слоям. В вашем случае код слоя будет:

 tf.keras.layers.Conv2D(filters=NUM_FILTERS, kernel_size=1, strides=1)
 

Conv1D действительно предназначен для одномерной обработки данных (например, звука), как указал @MatusDubrava.

Комментарии:

1. вот хорошее связанное чтение: towardsdatascience.com /…

Ответ №2:

Должны ли мы использовать 1D свертку для классификации изображений?

TLDR; Не сам по себе, но, возможно, если он составлен.

Корреляция между пикселями в изображении (будь то 2D или 3D из-за нескольких каналов) имеет пространственную природу: значение данного пикселя сильно зависит от соседних пикселей как по вертикали, так и по горизонтали. Преимущество 2D / 3D свертки ( Conv2D или Conv3D ) заключается в том, что им удается улавливать это влияние в обоих пространственных направлениях: вертикальном и горизонтальном.

Для сравнения, 1D свертка or Conv1D фиксирует только одну из двух корреляций (вертикальную или горизонтальную), что дает гораздо более ограниченную информацию. Само по себе опаление Conv1D будет пропускать существенную информацию.

Тем не менее, поскольку Conv2D можно «разложить» на два Conv1D блока (это похоже на точечные и глубинные свертки в архитектуре MobileNet), объединение вертикали Conv1D и горизонтали Conv1D фиксирует пространственную корреляцию по обеим осям. Это правильный подход к классификации изображений в качестве альтернативы Conv2D .

Можем ли мы использовать 1D свертку для классификации изображений? Как?

Да, мы можем.

Вы не должны изменять форму данных, чтобы уменьшить размеры: если вы это сделаете, вы бы склеили один конец изображения (скажем, верхний, если Conv1D применяется вертикально) с другим концом (скажем, с нижней стороны), что нарушает пространственную согласованность.

Это возможный пример того, как (реализация конкатенации, описанной выше):

 import tensorflow as tf
x = tf.random.normal(input_shape = (20, 100, 100, 3)) # your input batch

# Horizontal Conv1D
y_h = tf.keras.layers.Conv1D(
filters=32, kernel_size=3, activation='relu', input_shape=x.shape[2:])(x)

# Vertical Conv1D
y_v = tf.transpose(x, perm=[0, 2, 1, 3]) # Image rows to columns
y_v = tf.keras.layers.Conv1D(
   filters=32, kernel_size=3, activation='relu', input_shape=x.shape[2:])(x)
# y_v = tf.transpose(y_v, perm=[0, 2, 1, 3]) # Undo transpose, optional

# Concatenate results
y = tf.keras.layers.Concatenate(axis=3)([y_h, y_v]) # Concatenate on the feature_maps
 

Обратите внимание, что для получения результата (свертки по вертикальной и горизонтальной осям) требуется несколько операций, которые было бы проще и быстрее получить, применяя Conv2D напрямую.

Когда мы должны это использовать?

Если данные вашего изображения особенно неинформативны на одной оси, но особенно интересны на другой пространственной оси, возможно, это идея, которую стоит изучить. В противном случае лучше прибегнуть к стандарту Conv2D (в большинстве случаев, включая почти все общедоступные наборы данных изображений).