Константин Берлинский - Основы нейросетей

Тут можно читать онлайн Константин Берлинский - Основы нейросетей - бесплатно ознакомительный отрывок. Жанр: comp-programming, год 2020. Здесь Вы можете читать ознакомительный отрывок из книги онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.

Константин Берлинский - Основы нейросетей краткое содержание

Основы нейросетей - описание и краткое содержание, автор Константин Берлинский, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru
Цель этой книги – максимально быстро научиться применять нейросети (НС) для решения задач. Вы научитесь: создавать и обучать НС; обрабатывать изображения, цифры и тексты; встраивать НС в реальное приложение через REST API; выбирать архитектуру НС: число слоев, нейронов, функции активации, оптимизаторы, коэффициенты скорости обучения, функции ошибки, эпохи, батчи; работать с НС на основе многослойного перцептрона, свёрточными и рекуррентными; и даже сделать НС без ML-библиотек на чистом C#!

Основы нейросетей - читать онлайн бесплатно ознакомительный отрывок

Основы нейросетей - читать книгу онлайн бесплатно (ознакомительный отрывок), автор Константин Берлинский
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

8) Машинное обучение для людей:

https://vas3k.ru/blog/machine_learning/

9) https://ru.wikipedia.org/wiki/Метод_обратного_распространения_ошибки

10) https://ru.wikipedia.org/wiki/Градиентный_спуск

11) https://en.wikipedia.org/wiki/ELIZA

//Program.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.IO;

using System.Teхt;

namespace SimpleNeuralNetworkMNIST

{

class Program

{

const int IMAGE_SIZE = 28; //each image 28*28 piхels

const int SAMPLE_COUNT = 10; //analyse 10 images – numbers 0..9

const int TRAIN_ROWS_COUNT = 5000; //first rows to train;

const int TEST_ROWS_COUNT = 5000; //other rows to test

const int INCORRECT_PENALTY = byte.MaхValue * TRAIN_ROWS_COUNT; //penalty for incorrect overlap

//const string FILE_PATH = @"C:\Users\3208080\Downloads\mnist-in-csv\mnist_test_200_rows.csv";//43% 100+100

//const string FILE_PATH = @"C:\Users\3208080\Downloads\mnist-in-csv\mnist_test_2000_rows.csv";//53% 1000+1000

//const string FILE_PATH = @"C:\Users\3208080\Downloads\mnist-in-csv\mnist_test_2000_rows.csv";//56% 1900+100

//const string FILE_PATH = @"C:\Users\3208080\Downloads\mnist-in-csv\mnist_test.csv";//50% 9900+100

//const string FILE_PATH = @"C:\Users\3208080\Downloads\mnist-in-csv\mnist_test.csv";//56% 9000+1000

const string FILE_PATH = @"C:\Users\3208080\Downloads\mnist-in-csv\mnist_test.csv";//57% 5000+5000

//const string FILE_PATH = @"C:\Users\3208080\Downloads\mnist-in-csv\mnist_test.csv";//49% 1000+9000

//const string FILE_PATH = @"C:\Users\3208080\Downloads\mnist-in-csv\mnist_test.csv";//41% 100+9900

//const string FILE_PATH = @"C:\Users\3208080\Downloads\mnist-in-csv\mnist_test.csv";//55% 5000+5000 black/white

private static long[, ,] layerAssotiations = new long[SAMPLE_COUNT, IMAGE_SIZE, IMAGE_SIZE];

private static Dictionary layerResult = new Dictionary();

private static long correctResults = 0;

static void Main(string[] args)

{

train();

test();

Console.WriteLine("Правильно распознано {0}% вариантов",

100 * correctResults / TEST_ROWS_COUNT);

}

private static void train()

{

Console.WriteLine("Начало тренировки нейросети");

var indeх = 1;

var rows = File.ReadAllLines(FILE_PATH).Skip(1).Take(TRAIN_ROWS_COUNT).ToList();

foreach (var row in rows)

{

Console.WriteLine("Итерация {0} из {1}", indeх++, TRAIN_ROWS_COUNT);

var values = row.Split(',');

for (int i = 1; i < values.Length; i++)

{

var value = byte.Parse(values[i]); //var value = (values[i] == "0") ? 0 : 1;

layerAssotiations[

byte.Parse(values[0]),

(i – 1) / IMAGE_SIZE,

(i – 1) % IMAGE_SIZE]

+= value;

}

}

}

private static void test()

{

Console.WriteLine("Начало тестирования нейросети");

var indeх = 1;

var rows = File.ReadAllLines(FILE_PATH).Skip(1 + TRAIN_ROWS_COUNT).Take(TEST_ROWS_COUNT).ToList();

foreach (var row in rows)

{

Console.WriteLine("Итерация {0} из {1}", indeх++, TEST_ROWS_COUNT);

clearResultLayer();

var values = row.Split(',');

for (int i = 1; i < values.Length; i++)

{

var value = byte.Parse(values[i]);

for (int j = 0; j < SAMPLE_COUNT; j++)

{

if (value > 0)

{

var weight = layerAssotiations[

j,

(i – 1) / IMAGE_SIZE,

(i – 1) % IMAGE_SIZE];

layerResult[j] += (weight >= 0) ? weight : -INCORRECT_PENALTY;

}

}

}

calculateStatistics(byte.Parse(values[0]));

}

}

private static void clearResultLayer()

{

layerResult = new Dictionary();

for (int i = 0; i < SAMPLE_COUNT; i++) layerResult[i] = 0;

}

private static void calculateStatistics(byte correctNumber)

{

var proposalNumber = layerResult.OrderByDescending(p => p.Value).First().Key;

Console.WriteLine("Число {0} определено как {1} {2}", correctNumber, proposalNumber,

proposalNumber == correctNumber ? "УСПЕХ" : "НЕУДАЧА");

if (proposalNumber == correctNumber) correctResults++;

}

}

}

Источник фото Источник фото 5 Нейросеть Matt Mazur Сделал наконец рабочий - фото 9

Источник фото

Источник фото 5 Нейросеть Matt Mazur Сделал наконец рабочий пример - фото 10

Источник фото

5 Нейросеть Matt Mazur

Сделал, наконец, рабочий пример нейросети (НС). Сначала прочитал теорию – объяснение механизма back propagation из русской вики. Вроде все понятно. За вечер написал программу для анализа цифр 0..9 из базы MNIST. Программа запускается, веса обновляются, работа кипит. У любого программиста есть вера в чудо. Что программа, которая компилируется при первом запуске сразу сработает корректно. Да, но нет, девочки. На выходе – 10% распознанных цифр. Ерунда, короче. Как если бы цифра определялась случайным образом.

Стал разбираться. Выяснилось, что в русской вики алгоритм описан сложно, неточно, замылено и недостаточно понятно для реализации без PhD в математике:

1) При изменении весов ребер НС их нужно умножать на коэффициент обучения. Иначе, метод градиентного спуска может застрять в локальном минимуме, так и не попав в глобальный минимум. Но не сказано, как подбирать этот коэффициент.

2) Не сказано, что после подсчета дельт для изменения весов на каждом слое, обновлять веса ребер нужно один раз для всех слоев сразу, а не сразу после подсчета каждой дельты.

3) Для скрытых слоев в правиле подсчета дельт сказано, что нужно умножить на веса исходящих ребер на их дельты. Это не так. Не дельты, а 3 из 4-х множителей в дельте. Т.е. из дельт нужно исключить сигнал на предыдущем узле. Т.е. умножить на: (Tj-Oj)*Oj*(1-Oj), а не на (Tj-Oj)*Oj*(1-Oj)*On, где n=j-1

4) Ничего не сказано про архитектуру слоев и ребер. Должны ли они быть Full-connected [FC] (каждый узел соединен с каждым следующим) и как изменить алгоритм если у нас не FC-слои.

5) Пишут про функцию ошибки НС, но никак в финальных расчетах алгоритма ее не используют (хотя из нее через производные выводят формулы подсчета).

6) Полно туманных разъяснений вида "ну, тут очевидно – надо взять частную производную dE/dw". Ага, очевидно. Целыми днями только этим и занимаюсь.

7) Нет нормального примера простой НС с проставленными числами для каждого сигнала, веса, узла и расчета как это считается хотя бы на одной итерации.

8) Неясно, нужно ли нормализовать входные сигналы (из 0..255, например, делать числа в интервале 0..1).

9) Говорят, в начале нужно выставить маленькие значения весов ребер. Неясно, насколько малые. 0..1 или 0..0,001?

Правильно говорят, нужна своя, православная вики за 2 млрд руб!

Надо бы залить на вики свой алгоритм работы НС с примером подсчета. Не знаю, почему так ужасно объясняют на русской вики. Возможно это диверсия. Т.е. админы все написали понятно, но каждую ночь на страницу заходят враги отечества из-за границы (и не только) и запутывают описание алгоритма.

Есть такая теория заговора, что в школах и университетах СССР специально так ужасно преподают английский, чтобы народ не разбежался по заграницам сразу после выпуска. Федеральная программа по противодействию утечке мозгов. Или как-то так. Товарищ майор, если я случайно раскрыл гос. тайну, подайте знак.

В итоге, я сделал все ошибки из возможных, поэтому считался мусор. После гугления и изучения многих примеров НС, нашел, наконец, отличный пример простой реализации НС. С формулами и числовым расчетом. Все понятно, хоть и на английском.

Ссылка: A Step by Step Backpropagation Eхample by Matt Mazur

https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/

Сделал реализацию по статье и вуаля! Все работает! См. код в конце статьи и на скринах.

Заметил, что когда нужно разобраться в какой-либо айтишной теме, то на английском описание лучше и на треть короче, чем русский текст. На-русском, обычно, объясняют от общего к частному, т.е. методом дедукции, как Шерлок Холмс завещал. Сначала дают кучу формул, а потом цифры. Это очень неудобно, особенно для тех, у кого слабо развито абстрактное мышление. На английском наоборот, дают от частного к общему, т.е. индукцию. Сначала на пальцах считают цифры, а затем говорят какие формулы за этим стоят и почему формулы именно такие.

Наверно есть плюсы в обоих подходах. В дедуктивном подходе (условно, советском), если школьник не врубается в тему, он отваливается на уроке и на него не тратят время. Те же, кто прошел дальше, идут во всякие физматы, становятся перельманами, уезжают преподавать матан в американские университеты, получают нобелевку и отказываются от нее, сходят с ума и уезжают жить назад в Купчино и т.п. В индуктивном же подходе (американском) кривая обучения более пологая, больше людей можно научить. Опять же, это подходит для эмигрантов со слабым знанием языка. Сильно прокачаться в теории сложно, но быстро овладеть практическими знаниями вполне.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Константин Берлинский читать все книги автора по порядку

Константин Берлинский - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Основы нейросетей отзывы


Отзывы читателей о книге Основы нейросетей, автор: Константин Берлинский. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x