У меня есть следующий CNN:
- Я начинаю с входного изображения размером 5х5
- Затем я применяю свертку, используя ядро 2x2 и шаг = 1, что дает карту характеристик размером 4x4.
- Затем я применяю максимальный пул 2x2 с шагом = 2, который уменьшает карту объектов до размера 2x2.
- Затем я применяю логистический сигмоид.
- Затем один полностью связанный слой с 2 нейронами.
- И выходной слой.
Для простоты предположим, что я уже завершил прямой проход и вычислил δH1 = 0,25 и δH2 = -0,15
Таким образом, после полного прохода вперед и частично пройденного прохода моя сеть выглядит следующим образом:
Затем я вычисляю дельты для нелинейного слоя (логистическая сигмоида):
Затем я распространяю дельты на слой 4x4 и устанавливаю все значения, которые были отфильтрованы с помощью max-pooling, в 0, и карта градиента выглядит следующим образом:
Как мне обновить вес ядра оттуда? И если в моей сети был еще один сверточный слой до 5x5, какие значения я должен использовать для обновления весов ядра? И в целом, мой расчет верен?
machine-learning
convnet
backpropagation
cnn
kernel
koryakinp
источник
источник
Ответы:
В свертке используется принцип распределения веса, который значительно усложнит математику, но давайте попробуем пробиться через сорняки. Я рисую большую часть своих объяснений из этого источника .
Прямой проход
Как вы заметили, прямой проход сверточного слоя может быть выражен как
обратное распространение
Предполагая, что вы используете среднеквадратичную ошибку (MSE), определенную как
мы хотим определить
Он выполняет итерацию по всему выходному пространству, определяет ошибку, которую вносит вывод, а затем определяет коэффициент вклада веса ядра по отношению к этому выводу.
Давайте для простоты будем называть вклад в ошибку из выходной дельты пространства, чтобы отслеживать обратную ошибку,
Вклад от весов
Свертка определяется как
Таким образом,
Тогда вернемся к нашей ошибке
Стохастический градиентный спуск
Давайте посчитаем некоторые из них
Теперь вы можете поместить это в уравнение SGD вместо∂Е∂вес ,
Пожалуйста, дайте мне знать, если есть ошибки в выводе.
Обновление: исправленный код
источник
gradient = signal.convolve2d(np.rot90(np.rot90(d)), o, 'valid')