Предисловие
В машинном обучении сверточные нейронные сети представляют собой глубокие искусственные нейронные сети, которые были успешно применены к распознаванию изображений. В настоящее время много признания номеров номерного знака, распознавания лица и т. Д. Используйте сверточные нейронные сети. Можно сказать, что сверточные нейронные сети добились больших успехов в распознавании изображений. Существует много средств глубокого обучения с открытым исходным кодом, таких как Caffe, Tensorflow, Torch и т. Д. Эти рамки глубокого обучения включают в себя реализацию полных сверточных нейронных сетей. Итак, почему мы все еще должны писать сами в сверточные нейронные сети? Лучше использовать эти рамки глубокого обучения с открытым исходным кодом напрямую, с которыми бывают быстрые и легко справляться, имеют хорошую производительность и мало ошибок. Да, если вы просто используете сверточные нейронные сети для выполнения некоторых приложений и не заботятся о его принципе работы, то вам не нужно усердно работать, чтобы написать сверточные нейронные сети. Но если вы хотите полностью овладеть принципом работы в сверточных нейронных сетях, древние сказали: то, что вы получаете на бумаге, всегда мелкое, и вы должны практиковать осознание в настоящее время. Поэтому вам очень необходимо реализовать сверточную нейронную сеть самостоятельно, чтобы углубить ваше понимание этого.
Что такое cuckcnn
Cuckcnn - это сверточная нейронная сеть, написанная на Java. В дополнение к работе я понял это, чтобы углубить мое понимание сверточных нейронных сетей. Это достаточно просто и работает хорошо, что делает его очень подходящим для начинающих. Его исходный код можно загрузить из GitHub: cuckcnn
Вам не нужно беспокоиться о ограничениях его протокола или чего -то еще. Вы можете использовать его, чтобы сделать что угодно и произвольно изменить его. Если это может вам помочь, я надеюсь, что это может дать вам звезду! ! !
^-^^-^^-^^-^
Дизайнерские идеи
Я надеюсь, что это нейронная сеть, которая достаточно проста, чтобы помочь новичкам научиться. Поэтому я не внедрил эти одновременные материалы ускорения, что гарантирует вступительный характер кода. При проектировании я разделил сверточную нейронную сеть на четыре модуля: сеть (активная потеря слоя блоба), которую можно увидеть от имени пакета. Уровень, потеря и активные имеют базовый класс, а программирование всей нейронной сети ориентировано на базовый класс. Сеть - это центр, который интегрирует эти четыре модуля, координирует и отправляет ресурсы. Каждый уровень будет иметь экземпляр сети, чтобы различные данные могли быть легко получены через сеть, такие как получение вывода каждого уровня, DIFF и т. Д.
Дизайн -блок -схема заключается в следующем:
Сохранение параметров очень проста для Java. Реализация сериализуемого интерфейса может быстро реализовать сериализацию и десериализацию параметров. Cuckcnn только реализует сериализуемый интерфейс для Blob и Blobparams в каталоге данных, и все параметры реализованы этими двумя.
Текущая производительность
Полностью подключенная нейронная сеть
В настоящее время в наборе данных MNIST полностью подключенная нейронная сеть (полное соединение (100) + полное соединение (30) + Полное соединение (10) + SoftMax) обучено 30 EPE с скоростью точности 96,76
Сверточная нейронная сеть
Сверточная нейронная сеть (6 функций) + максимальное объединение + сверток (6 функций) + полное соединение (512) + полное соединение (30) + полное соединение (10) + softmax), когда скорость обучения составляет 0,2, 30 эпосов обучено, скорость точности составляет 97,79. Я полагаю, что после дальнейшей настройки параметров скорость точности может быть выше при достаточном обучении.
Учебный снимок сверточной нейронной сети выглядит следующим образом:
начать поезд
Epoe: 0 Lossvalue: 2,3019369891560455 LR: 0,2 Точность равен 0,13
Epoe: 0 Lossvalue: 2,0722489482105195 LR: 0,2 Точность равен 0,44
Epoe: 0 Lossvalue: 1,2423286194012682 LR: 0,2 Точность 0,72
Epoe: 0 Lossvalue: 0,7860529560675255 LR: 0,2 Точность составляет 0,79
Epoe: 0 Lossvalue: 0,6272194196176664 LR: 0,2 Точность составляет 0,87
Epoe: 0 Lossvalue: 0,5240051326725808 LR: 0,2 Точность 0,84
Epoe: 0 Lossvalue: 0,27637563581928026 LR: 0,2 Точность равен 0,95
Epoe: 0 Lossvalue: 0,35585388987055083 LR: 0,2 Точность 0,92
Epoe: 0 Lossvalue: 0,441971528417802 LR: 0,2 Точность составляет 0,92
Epoe: 0 Lossvalue: 0,25637710325999674 LR: 0,2 Точность равен 0,95
Epoe: 0 LossValue: 0,39872273532502 LR: 0,2 Точность равен 0,9
Epoe: 1 LossValue: 0,264085484522027 LR: 0,160000000000000000003 Точность - 0,91
Epoe: 1 LossValue: 0,22754066024803088 LR: 0,16000000000000000000003 Точность 0,96
Epoe: 1 LossValue: 0,302564209755777103 LR: 0,160000000000000000003 Точность - 0,96
Epoe: 1 Lossvalue: 0,18149648622985948 LR: 0,1600000000000000000003 Точность 0,99
Epoe: 1 LossValue: 0,177239938748327 LR: 0,16000000000000000000003 Точность составляет 0,96
Epoe: 1 LossValue: 0,150419930097777443 LR: 0,16000000000000000000003 Точность 0,98
Epoe: 1 LossValue: 0,107595457526655524 LR: 0,160000000000000000000003 Точность - 1,0
Использование cuckcnn
В настоящее время Cuckcnn реализует тесты на наборе данных MNIST. В соответствии с SRC/Test MnistTest является входом в основную функцию, а конкретная нейронная сеть построена в классе MnistNetwork. В классе MNISTNETWORD, BuildConvnetwork и BuildFcnetWork соответственно внедряют строительство сверточных нейронных сетей и строительство полностью связанных нейронных сетей. Благодаря хорошим кроссплатформенным свойствам Java после загрузки исходного кода Cuckcnn, используйте Eclipse, чтобы открыть проект, а затем запустить его напрямую, вы сможете начать обучение и тестирование на наборе данных MNIST.
Создание нейронной сети
public void buildnetwork () {// сначала построить объект нейронной сети и установить параметры network = new Network (); network.setBatch (100); network.setLoss (новый логический подход ()); //network.setloss(new crossentropyloss ()); Optimizer = новый Sgdoptimizer (0,2); network.setoptimizer (оптимизатор); // buildfcnetwork (); BuildConvnetWork (); network.prepare (); } Функция setBatch () устанавливает, сколько изображений находится в партии.
SetLoss () устанавливает функцию потери для использования. Cuckcnn реализует функцию потери поперечной энтропии и функцию потери логарифмического правдоподобия.
SetoPtimizer () должен использоваться для установки оптимизатора. Cuckcnn только реализует оптимизатор SGD. Если вы реализуете лучший оптимизатор и готовы отправить его в Cuckcnn, я хотел бы глубоко приветствовать его.
Создайте полностью подключенную нейронную сеть
private void buildfcnetwork () {// добавить сетевой уровень в сетевой inputlayer layer1 = new Inputlayer (сеть, новые Blobparams (network.getBatch (), 1,28,28)); network.addlayer (Layer1); FullConnectionLayer Layer2 = новый FullConnectionLayer (Network, New BlobParams (network.getBatch (), 784,1,1)); Layer2.SetActivationFunc (new ReluactivationFunc ()); network.addlayer (Layer2); FullConnectionLayer Layer3 = новый FullConnectionLayer (Network, New BlobParams (network.getBatch (), 100,1,1)); Layer3.SetActivationFunc (new ReluactivationFunc ()); network.addlayer (Layer3); FullConnectionLayer Layer4 = новый FullConnectionLayer (Network, New BlobParams (network.getBatch (), 30,1,1)); Layer4.SetActivationFunc (New SigModactivationFunc ()); network.addlayer (layer4); FullConnectionLayer Layer5 = новый FullConnectionLayer (Network, New Blobparams (network.getBatch (), 10,1,1)); Layer5.SetActivationFunc (new ReluactivationFunc ()); network.addlayer (Layer5); SoftMaxLayer sflayer = new SoftMaxLayer (Network, New BlobParams (network.getBatch (), 10,1,1)); network.addlayer (sflayer); }Как показано в приведенном выше коде, каждый уровень нуждается в сети, которая является экземпляром сети. Сеть является глобальным администратором и диспетчером ресурсов. Со ссылкой на сеть мы можем легко получить выходные данные, ошибки вывода и т. Д. каждого уровня. Кроме того, каждому слою нужен параметр, который указывает размер блока выходных данных текущего уровня, который сообщает определенному уровню, сколько данных вам нужно для вывода. Например, последний слой нейронной сети является SoftMaxLayer, который должен быть выведен. Это число представлено вектором длины 10, такого как число 7, поэтому SoftMaxLayer должен вывести значение 8 -го элемента, чтобы быть 1, а значение других элементов, которое будет 0. Слои из свертки и слой объединения требуют большего количества параметров, поскольку оба имеют ядр. Для слоя свертки он называется ядром свертки. Шага каждого направления слоя свертки составляет 1, что все еще является возможностями для улучшения. Для слоя объединения, в дополнение к прохождению параметров бассейна ядра, вам также необходимо проходить на горизонтальных и вертикальных шагах, что необходимо.
Обучение и тестирование
После создания нейронной сети вам необходимо вызвать метод network.prepare (), который создаст блоки выходных данных и блоки данных ошибок на основе параметров данных каждого уровня. Следовательно, призыв к этому методу необходим.
public void train (список <digitimage> imglist, int epoes) {System.out.println ("Begin Train"); int batch = network.getBatch (); double loclalr = optimizer.getlr (); for (int e = 0; e <epoes; e ++) {collections.shuffle (imglist); for (int i = 0; i <imglist.size ()-patch; i+= pactor) {list <blob> inputandlabel = buildblobbyImagelist (imglist, i, pactor, 1,28,28); Double LossValue = network.train (inputAndLabel.get (0), inputAndlabel.get (1)); if (i> batch && i/pactor%50 == 0) {System.out.print ("epoe:"+e+"LossValue:"+lossValue+""+"lr:"+optimizer.getlr ()+""); testinner (inputandlabel.get (0), inputandlabel.get (1)); }} if (loclalr> 0,001) {loclalr*= 0,8; Optimizer.Setlr (loclalr); }}} public void -тест (список <digitimage> imglist) {System.out.println ("begin test"); int batch = network.getBatch (); int raflcount = 0; int i = 0; for (i = 0; i <imglist.size ()-patch; i+= pactor) {list <blob> inputandlabel = buildblobbyimagelist (imglist, i, parath, 1,28,28); Blob output = network.predict (inputAndlabel.get (0)); int [] caloutlabels = getBatchOutputLabel (output.getData ()); int [] reallabels = getBatchOutputLabel (inputAndLabel.get (1) .getData ()); for (int kk = 0; kk <caloutlabels.length; kk ++) {if (caloutlabels [kk] == reallabels [kk]) {raflcount ++; }}} двойная точность = raflcount/(1.0*i+pactor); System.out.println («Точность теста - это«+точность+"refallcount"+raffcount); }Как упомянуто выше, вы можете тренироваться, позвонив в поезд сети, и вы можете протестировать, позвонив в метод прогнозирования сети.
Сохранить и загрузить параметры
public void savemodel (string name) {network.savemodel (name); } public void LoadModel (String name) {network = new Network (); network.loadmodel (имя); network.prepare (); }Вызов Savemodel и LoadModel сети может сохранить и загружать параметры. Вам нужно только передать имя файла. Когда мы создаем нейронную сеть с помощью сохраненных параметров, нам нужно сначала новую сеть, а затем вызовать LoadModel этой сети для загрузки сохраненных параметров, а затем не забудьте вызвать метод подготовки для создания блоков выходных данных и блоков данных ошибок для каждого уровня.
Текущий статус завершения и планы на будущее
В настоящее время реализованные слои включают: полное соединение, свертку, максимальный слой объединения, средний слой объединения и слой Softmax. Реализованные функции активации: Sigmod, Tanh, Relu.
Реализированные функции потерь: поперечная энтропия, логарифмическая правдоподобия. Реализированная оптимизация: SGD. Параметры уже могут сохранять и загружать. Затем будет добавлен уровень отсева, и будут добавлены примеры на CIFAR-10.
Кроме того, я напишу несколько статей, чтобы просмотреть свои мысли и вопросы в процессе написания Cupcnn для ссылки начинающими. Пожалуйста, возьмите обход. Те, кто заинтересован, могут продолжать обращать внимание. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.