Возьмем обработку изображений. У нас имеется набор картинок "было-стало", и мы хотим научить сеть восстанавливать "было" по имеющемуся "стало". Например - восстанавливать цвет по ч/б, но не суть. Пусть наша входная картинка имеет размер 1000 x 1000 пикселей, и такого же размера скрытые слои. В статьях везде приводится схема, на которой в каждый нейрон текущего слоя входят сигналы от всех нейронов предыдущего слоя: Даже если брать 1 пиксель = 1 сигнал, то получается, что под веса одного слоя нам понадобится (1000*1000)^2 = 1 триллион значений, и в случае float-point 64 это будет 8 терабайт - тут не каждого жесткого диска хватит чтобы работать через memory mapped file, не говоря уже о времени вычислений. На первый взгляд напрашиваются два возможных упрощения: 1. Уменьшить количество нейронов на скрытых слоях. Количество самих скрытых слоев можно увеличить - количество требуемой памяти будет линейно количеству слоев, но квадратично количеству нейронов, поэтому уменьшение нейронов перетянет одеяло на себя. Например, если скрытый слой будет иметь размер 100 х 100 = 10000 нейронов, то количество весов на слое будет 10000^2 = 100 млн, что в 10000 раз меньше, чем 1 триллион. Это уже можно хотя бы просто запустить на домашнем компе. 2. Уменьшить количество входов в нейрон текущего слоя из предыдущего. Кажется логичным, что влияние пикселя "до" на пиксель "после" обратнопропорционально растоянию между этими пикселями. То есть, значение черно-белого в правом нижнем углу влияет на цветной пиксель в левом верхнем углу в гораздо меньшей степени, чем черно-белый пиксель в том же левом верхнем углу. То есть можно связывать нейроны текущего слоя с предыдущим не по принципу "каждый с каждым", а только с теми соседями, которые находятся от данного нейрона на двухмерной сетке не далее чем какое-то расстояние: Понятно, что это ухудшит результат, но непонятно - насколько? Будет ли от такого решения практическая польза? Что делают для того, чтобы работать с изображениями на домашнем компе, и работают ли вообще?
а какой толк от этой задачи вообще??? а соединения меж нейронами могут быть самыми разными и в сущности коннектить всех со всеми смыЧла нет == даже ежль взять эдакую гипотетическую макиньку (способную тянуть такие матрицы), при такой топологии нс будет просто зашумлять саму себя. введи маску соединений и считай статистику попаданий/промахов, выдели наиболее результативные области. можно строить нс на подсетях возбуждения и подавления/торможения сигнала. впрочем, для экспериментов с нс лучше заказывать облачка == уж больно комп напружает практически при любом подходе.
толк сеть научится восстанавливать цвета, а про зашумление - алгоритм обратного распространения ошибки - связи генерирующие шум получат мизерные коэфициенты --- Сообщение объединено, 19 окт 2018 --- чему тут удивляццо - тема обучения нейросетей изначально под кластер серваков, тот же ватсон от ibm - он очень не кислый по начинке - домой себе такой не купишь
Ватсан был построен в 2009 году. Сейчас его производительность элементарно заменяется 1 видеокартой Hi-End класса. А если отказаться от НС в сторону деревьев решений, то с его задачами вообще любой комп справится. По поводу переизобретённых методов. 1. Уменьшение нейронов это классика автокодировщик. Плюс за одно посмотрите стекируемые нейронные сети. 2. Тоже есть такое Pooling называется используется как промежуточные слои в CNN Да и вообще НС давно строятся по принципу теории графов берут фреймвор TensorFlow, Caffee и далее лузеры начинают соединять слои, кто во что горазд. Так что ваша картинка безбожно устарела.
нет в реальном мозге таких связей и практически они не нужны ни с акого бока.. если мощей компа некуда девать, то конечно-конечно. то есть взял любой ч/б фильм и нс его раскрасит? кстати, мне любопытно: можете ли Вы указать задачу, коя не решалась бы нормально чрез статистические фильтры, но тянулась бы годно на нс?
Pavia, спасибо. Теоретически - да. Практически - подозреваю, что для этого ей придется скормить половину кинематографа, а для работы ей понадобится крипто-ферма на пару десятков петафлопов.
для выполнения подобной задачи ни-акие нейросети и ссф не нужны == достаточно сделать алгоритм наиболее близкого цвета, то бишь к каждому оттенку серого прицепить свой цвет + можно задать полуавтоматический режим работы, тч мб достигать наиболее аутентичной раскраски. впрочем, ссф может сгодиться, если требуется разбить кадр на наборы отдельных объектов. ЗЫ. ссф == система статистических фильтров. ЗЗЫ кстати, ни одну мало-мальски приличную нс без ссф построить нельзя
Чиво? Один и тот же оттенок в ч/б на самом деле в исходнике может иметь бесконечное многообразие цветов. И не просто цветов. По сути на вход нам приходит lightness, а получить из нее нужно пару hue + saturation. Алгоритм, упрощенно говоря, должен иметь набор чернобелых паттернов, и знать, какой паттерн как раскрасить. Одной только информации об оттенке недостаточно. Нужно учитывать некоторую окрестность, а то и всю картинку. Но тема не совсем об этом - я не собираюсь писать универсальный разукрашиватель, лол. Такшта в данном конкетном направлении предлагаю не углубляться.
потому я и упомянул про полуавтомат + разбиение кадра на объекты. но для получения эдакого мультика вполне хватит и самой тупой схемы. Ты хочешь некий универсал?
Хочу вникнуть в тему чтобы иметь понимание о применимости или неприменимости НС в тех или иных задачах.
ссф используются для любых задач, где нет чёткой формализации иль точные вычисления слишком напряжны для макинки, а нс в сущности отросток ссф и могут использоваться для уменьшения вычислений. Однако, в большинстве случаев юзать нс нет смысла от слова СОВСЕМ, ибо генерить/ладить их требуется чрез ссф, а выч. напруга получается чрезмерной. короче, на современных макинках ии можно писать на спарках ссф + модули логики, а логику выражать чрез системы булевых уравнений. http://sci.sernam.ru/book_mr.php?id=29
а, вообще, забавно НО FUCTЪ именно бурный рост цифирьковой техники не позволил получить приличного ии == у цифирек есть куча бутыльных горлышек, кои, к примеру, могут преодолеваться чрез спарки с ам (аналоговые машины). Однако, развитие альт выч. архитектур во многом заглохло. Зато получили бредо-бредовую чуХЪню а-ля квантовые макинки.
АМ заглохли по одной причине цифровой умножитель двух переменных величин в АМ гораздо больше по площади чем цифровой машине. Да и в целом менее надёжна из-за разброса параметров сопротивления.
простые примеры.. 1. аэродинамическая труба. 2. бассейны для тестирования кораблей/подлодок. 3. "тихие" (безэховые) комнаты для акустики иль эм волн. итд-итп ======== у ам туева хуча недостатков, но имеется ОДИН ЗДОРОВЫЙ ПЛЮС (образно выражаясь) на ам подключаешься к интерфейсам самой Вселенной
_DEN_, не получиться. Преобразование цветного изображения в ч - операция с потерей информации (I=A*R+B*G+C*B). Цвет объекта определяется многими факторами, например сеть должна распознать, те увидеть небо или листву, освещение, погоду, сезонную окраску и выбрать предопределенный цвет. Хотя цветной снимок можно легко разбить на 3 чб цветовые плоскости, это ничего не дает. Яркость точек объектов зависит от цвет объекта, те не возможно получить 3 цветовые плоскости из чб изображения. Специалисты восстанавливают цвет кадра (и всей группы кадров) с учетом информации о цвете объектов, например, неба, одежды, техники, древесины и тд и возможно по частям, пока не получится правдоподобно. Можно по формуле подобрать значения RGB для восстановленного оттенка серого и попытаться восстановить другие оттенки. Но разные цвета могут давать одинаковый оттенок серого. человек корректирует результат визуально, а компьютер?
(I=A*R+B*G+C*B) уравнение с 3-мя неизвестными. можно решить методом итераций. берем А=столько, находим B*G+C*B, берем В= столько, находим С. меняем цвет и смотрим результат на картинке.
Денис. Тема хорошая! Но чем больше я смотрю на картнки, тем труднее подавить позывы. Начинает сильно укачивать. Предлогаю размещать более гуманные изображения. По отношению к мозжечку человека.
Продолжаем разговор. На всякий случай уточню: цель всей затеи - образовательная, поэтому хочется разобраться со всем с нуля, а не брать готовую либу, или вроде того. Уточнение дабы избежать повотора треда не в то русло. Итак, запилил нейросеть на C++, алгоритм обучения - тоже (переходная функция - сигмоид, функция ошибки - наименьшие квадраты, алгоритм - градиентный спуск). Первый вывод: с обучением на CPU ловить вообще нечего, вычислений нереально дохера. Поэтому следующий шаг - переписать все на GPU. К сожалению, основная нейросетевая движуха на NVidia + CUDA, а у меня Radeon (Sapphire Tri-X R9 290 если вдруг важно). Поэтому буду пробовать начать с OpenCL. Насколько я понимаю, алгоритмы придется переписать с двумя основными изменениями: во-первых - нужно уменьшить количество путешествий данных туда-сюда. В идеале - все отправить в видяху, выполнить вычисления, считать результат из видяхи. Во-вторых - алгоритмы надо перестроить на векторных функциях. Пока что начнем с функции однократного вычисления нейронной сети (то есть мы ей входные данные, она нам - выходные). На CPU последовательность действий близка к тому, как бы мы описали это на пальцах: активация нейрона - dot product весов на входные сигналы, результат отправить в сигмоид, результат сигмоида - это входной сигнал для нейронов следующего слоя. То есть, умножаем, складываем, вычсляем функцию, и так для каждого нейрона. Но на GPU такой подход, как я понимаю, не годится. На GPU нужно перестроить алгоритмы таким образом, чтобы вместо последовательности маленьких групп разнотипных операций было несколько больших однотипных задач: сначала всё-всё перемножить, потом всё-всё сложить, потом всё-всё прогнать через сигмоид. Итого три операции на каждый слой (вместо N операций в случае CPU, где N - число нейронов в слое). Пока что все правильно? Двигаться в том же направлении? И еще: если у кого есть ссылочки на простые и понятные туторы по OpenCL - вбрасывайте. И еще - если кто-то юзал Boost.Compute - напишите, есть пара вопросов.
У Амд есть библиотека на подобие cuBlas: clFFT и clBlas (https://github.com/clMathLibraries/clBLAS) Тат есть все эти дот продукт и прочее Вам нужно просто заюзать функцию свертки. Число слоев выбираете сами. Но в целом у вас описание правильное. Все так и делают Ну и как пример https://cognitivedemons.wordpress.com/2017/09/02/a-neural-network-in-10-lines-of-cuda-c-code/ На гпу куда. Но на OpenCL переписать не сложно. Если не справитесь- пишите помогу. Когда перепишите - уже поймете как оно и будете свое юзать. Еще для тестов возьмите нейросеть определяющую числа (только числа) она очень простая. Учится быстро. Вот датасет : http://yann.lecun.com/exdb/mnist/ Вот сама сеть http://deeplearning.net/tutorial/lenet.html Так и называется LeNet. это сеть сверточного типа . Ну и еще вот вам статья на русском ) по нейросетям http://algotravelling.com/ru/машинное-обучение-это-весело-3/