Вопрос или проблема
Я хотел бы выполнить 1D свертку по глубине (то есть первый шаг свертки с разделением по глубине) для модели машинного обучения, над которой я работаю. Это означает, что для входного активационного пространства h x w есть h кернелов, каждый размером 1xk, где k – длина кернела (см. приложенное изображение).
На данный момент это не предлагается Keras, но можно использовать доступную 2D свертку по глубине (которая работает с 3D входами) и просто добавить дополнительное измерение к 2D входам, а затем переставить так, чтобы оригинальная 2D высота охватывала каналы нового 3D активационного пространства (см. рисунок). Отчет модели, показывающий эти размеры и перестановки, приведен ниже (формат для слоя Depthwise – “каналы первыми”).
Тем не менее, мне не удается воспроизвести это поведение в золотой модели Matlab, которая использует то же входное активационное пространство и кернелы. Имеет ли смысл этот метод использования Depthwise Conv2D для работы как Depthwise Conv 1D с точки зрения принципов, или практическое применение с Keras, или, возможно, я что-то упускаю с перестановками каналов?
Действительно, я смог доказать, что этот метод работает, что подтвердил мой золотой модель Matlab. Проблема была в том, чтобы считать выходные активации промежуточного слоя в Keras, необходимо создать отдельную модель с указанным выходом.
Эта отдельная модель в моем случае не имела тех же весов, что и оригинальная модель, что приводило к некорректным выходам. Но теперь, когда я правильно прочитал выходные активации, я могу подтвердить, что этот метод работает.
Ответ или решение
Чтобы выполнить 1D глубинную свертку с использованием глубинной 2D свертки в Keras, вам нужно понимать, как манипулировать размерами тензоров и их форматами. Поскольку Keras не предоставляет прямой реализации 1D глубинной свертки, мы можем обратиться к 2D глубинной свертке, используя соответствующие преобразования.
Шаги для реализации 1D глубинной свертки с помощью 2D глубинной свертки:
-
Преобразование входных данных:
- Начните с входных данных в формате
(h, w)
и добавьте дополнительное измерение, чтобы получить тензор в формате(h, w, 1)
. Таким образом, вы создаете "каналы", где каждый "канал" будет обрабатывать один из значений h.
import numpy as np input_data = np.random.rand(h, w) # Пример входного тензора input_data = np.expand_dims(input_data, axis=-1) # Преобразование в (h, w, 1)
- Начните с входных данных в формате
-
Построение модели с использованием DepthwiseConv2D:
- Используйте
DepthwiseConv2D
с ядром размером (1, k) для создания эффекта 1D глубинной свертки. Убедитесь, что ваше количество входных каналов (input_shape) соответствует 1, а количество выходных каналов должно быть равно h, поскольку каждый "канал" будет обрабатываться своим собственным ядром.
from keras.models import Sequential from keras.layers import DepthwiseConv2D model = Sequential() model.add(DepthwiseConv2D((1, k), input_shape=(h, w, 1), depth_multiplier=1, padding='valid'))
- Используйте
-
Компиляция и обучение модели:
- Скомпилируйте модель, используя подходящий оптимизатор и функцию потерь для вашей задачи, и начните процесс обучения.
model.compile(optimizer='adam', loss='mean_squared_error') model.fit(input_data, target_data, epochs=10)
-
Извлечение активаций:
- Если вам нужно получить выходные активации промежуточных слоев, вам нужно создать новую модель, которая возьмёт выход из необходимого слоя. Обратите внимание, что необходимо сохранить весов оригинальной модели, чтобы избежать неправильных результатов.
from keras.models import Model layer_name = 'depthwise_conv2d' # Укажите название слоя intermediate_layer_model = Model(inputs=model.input, outputs=model.get_layer(layer_name).output) intermediate_output = intermediate_layer_model.predict(input_data)
Основные моменты:
- Преобразование данных в правильный формат (добавление измерений и изменение порядка) является ключом к успешному применению 2D глубинной свертки для работы как 1D.
- Внимательно следите за размерами слоев и следите за именами слоев, когда создаете новую модель для получения промежуточных выходов.
- Убедитесь, что все веса соответствуют модели, используемой для предсказаний, иначе вы можете получить неправильно интерпретированные активизации.
Эти шаги помогут вам реализовать желаемую 1D глубинную свертку с использованием функций 2D глубинной свертки в Keras.