Почему фильтры обучаются по-разному на основе одного и того же изображения в CNN Deep Learning? - PullRequest
0 голосов
/ 22 апреля 2020

Я новичок в CNN DeepLearning, я знаю базовую концепцию c, что мы используем некоторые фильтры для генерации набора карт характеристик из изображения, мы активируем его, используя нелинейный метод, такой как 'relu', прежде чем мы уменьшите это. Мы продолжаем делать это, пока изображение не станет очень маленьким. Затем мы выравниваем его и используем полностью подключенную сеть для расчета его категории. И мы используем технику обратной проправки для вычисления всех параметров на карте. Одна вещь, которую я не понимаю, это то, что когда мы делаем Conv2D, мы создаем много фильтров (каналов) из изображения. Как в примере кода:

model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)))

Я понимаю, что это должно генерировать как можно больше функций. Но как эти фильтры обучаются обнаруживать различные функции на одном изображении? Если все они инициализируются одним и тем же значением (например, 0), тогда они должны обнаружить одну и ту же функцию, верно? Даем ли мы им случайные значения во время инициализации, чтобы они могли найти свои локальные минимальные потери с помощью градиентного спуска?

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

В дополнение к тому, что обсуждалось, веса в слое CONV также учатся так же, как веса в слое F C, путем обратного распространения, используя некоторый алгоритм оптимизации (GD, Adam, RMSprop et c). Завершение в локальном оптимуме очень маловероятно в больших сетях, так как точка, являющаяся локальным оптимумом для всех весов, очень маловероятна, так как ни один из весов не увеличивается. Если веса инициализируются нулями, градиенты становятся одинаковыми для обновления, а скрытые единицы становятся одинаковыми в слое. Следовательно они изучают те же самые особенности. Следовательно, мы используем случайную инициализацию со средним значением 0 и дисперсией, обратно пропорциональной количеству единиц в предыдущем слое. (например, Ксавье)

1 голос
/ 22 апреля 2020

Если вы инициализируете все фильтры с одинаковым значением, то вы правы, они будут учиться одному и тому же. Вот почему мы никогда не инициализируем с одним и тем же значением. Мы инициализируем каждое ядро ​​случайными значениями (обычно 0 и небольшая дисперсия).

Есть много способов найти хорошую инициализацию для вашей сети. Одним из самых известных и используемых является Xavier initialization .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...