Двунаправленная ассоциативная память (BAM) – это контролируемая модель обучения в искусственной нейронной сети.
Под ассоциативной памятью понимается хранение и извлечение информации путем ассоциации с другой информацией.
Устройство хранения информации называется ассоциативной памятью, если оно позволяет извлекать информацию на основе частичного знания ее содержимого, не зная места ее хранения. Ее также иногда называют памятью адресации содержимого.
Традиционные компьютеры не используют эту адресацию, а основаны на точном знании адреса памяти, в котором находится информация.
Почему требуется BAM?
Основная цель внедрения такой сетевой модели — хранить пары гетероассоциативных шаблонов.
Это используется для извлечения шаблона с учетом зашумленного или неполного шаблон.
Суть БАМ в том, что он действует как память, где вы можете научить его связывать вместе несколько паттернов. Таким образом, если вы научите его ассоциировать паттерн А с паттерном Б, когда вы снова дадите ему А, он выдаст Б. Поскольку он двунаправленный, вы также можете дать ему паттерн Б, и он выдаст в ответ паттерн А. . Вы можете научить его связывать несколько пар шаблонов и даже повредить некоторые данные, и он даст вам то, что, по его мнению, лучше всего соответствует данным, которые вы ему дали. Так же, как человеческий мозг.
Создание сети БАМ
Мы увидим, как создать сеть BAM, используя два обучающих изображения и два тестовых изображения, одно предварительно отредактированное с шумом, а другое — копию оригинала.
Для шаблона А мы используем простое бинарное изображение от медведя:
Для шаблона B мы используем утку:
Для тестирования мы используем тот же паттерн B, а для паттерна A мы используем тот же медведь с шумом.
Во-первых, нам нужно загрузить два изображения в каталог img и с помощью opencv применить двоичную операцию к каждому файлу и изменить размер изображения до 100x50.
Пороговое значение — это метод в OpenCV, который представляет собой присвоение значений пикселей по отношению к предоставленному пороговому значению. При пороговой обработке каждое значение пикселя сравнивается с пороговым значением. Если значение пикселя меньше порогового значения, оно устанавливается равным 0, в противном случае оно устанавливается на максимальное значение (обычно 255). Пороговое определение — очень популярный метод сегментации, используемый для отделения объекта, рассматриваемого как передний план, от его фона. Порог — это значение, которое имеет две области с каждой стороны, т. е. ниже порога или выше порога.
В Computer Vision этот метод определения порога применяется к изображениям в градациях серого. Поэтому изначально изображение должно быть преобразовано в цветовое пространство оттенков серого.
Простой поток
В следующем коде мы видим начальный метод, который инициализирует сеть BAM и преобразует каждый массив в биполярную форму с помощью функции make_bipolar.
Шаги
- Сохраняйте ассоциации в биполярной форме в массив
- Создайте весовую матрицу, используя длину массива биполярных форм
Для каждого шаблона вы умножаете вектор входного шаблона на транспонированный вектор выходного шаблона (переворачиваете его на бок), так что, когда вы перемножаете их вместе, вы получаете матрицу размером MxN.
Продолжайте это для каждой пары данных, чтобы в итоге у вас была одна матрица для каждой пары данных.
Теперь нам нужно загрузить тестовые изображения и получить вектор ассоциации из обученных изображений.
Теперь нам нужно преобразовать вывод в двоичный файл:
Загрузите тестовые изображения
И сравните результат:
Для первого выполнения с оригинальными шаблонами и получения расстояния 0 для каждого класса:
Теперь у нас есть для шаблона А такая же утка, как и для шаблона Б, и я получаю это расстояние
3.3 — это результат использования одного и того же шаблона для каждого класса в тестировании.
Полный код:
И все, это довольно простая сеть, другие подобные сети, которые мы можем найти, это Хопфилд. Чем позже я поделюсь с вами, большое спасибо.