Форум программистов, компьютерный форум, киберфорум
Наши страницы
Искусственный интеллект
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
gregoro
6 / 6 / 1
Регистрация: 13.01.2015
Сообщений: 84
Завершенные тесты: 2
1

Нейросети-книги

18.09.2016, 23:12. Просмотров 2365. Ответов 26
Метки нет (Все метки)

Доброй ночи, форумчане. Подскажите позязя книгу по нейросетям с примерами Прочитал одну книгу, часть понял, часть не понял и именно в создании нейронки, а не ее теории. Желательно на c#.
Спасибо за внимание
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2016, 23:12
Ответы с готовыми решениями:

Mnist-нейросети
Помогите разобраться в mnist-нейросети, как ее применить? Не получается

Практические задания, нейросети
Привет. Выбрала для себя две книги: Рассела С. "ИИ: современный подход" и Люгера Дж. Ф. По каким...

Оптимальное прореживание нейросети
Помогите, пожалуйста. Не могу понять одной вещи. Я не понимаю, когда именно использовать этот...

Скорость нейросети и её обучения
Начинаю разбираться с нейросетями и возник вопрос, если кто сможет подскажите. Нейросеть должна...

Локальный минимум при обучении нейросети
Как понять, что при обучении функция ошибки попала в локальный минимум? Ошибка начинает...

26
VTsaregorodtsev
581 / 534 / 77
Регистрация: 19.02.2010
Сообщений: 1,937
19.09.2016, 15:22 2
Цитата Сообщение от gregoro Посмотреть сообщение
Желательно на c#.
Скорее всего, не будет этого.
На плюсах - у буржуинов было несколько книг >20 лет назад.
Ищите в инете примеры - их там должно быть много. Где лежит что-то приличное, а не говнокод - не знаю, т.к. не интересуюсь чужим кодом и на шарпе не пишу.
0
сахатый
36 / 16 / 4
Регистрация: 12.10.2015
Сообщений: 94
Завершенные тесты: 2
21.09.2016, 19:59 3
Цитата Сообщение от gregoro Посмотреть сообщение
Доброй ночи, форумчане. Подскажите позязя книгу по нейросетям с примерами Прочитал одну книгу, часть понял, часть не понял и именно в создании нейронки, а не ее теории. Желательно на c#.
Спасибо за внимание
смотрите в библиотеке accord http://accord-framework.net/ там нейросеть на старой aforge

ИМХО из всех общедоступных самая вменяемая реализация MLP, без архитектурного извращения и кучи деталей, хотя некоторые умудряются на С++ MLP написать в 150 строк кода
0
Вложения
Тип файла: rar AForge.rar (38.0 Кб, 7 просмотров)
LeniumSoft
1439 / 829 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
Завершенные тесты: 1
22.09.2016, 14:14 4
Цитата Сообщение от gregoro Посмотреть сообщение
Подскажите позязя книгу по нейросетям с примерами
Книги не знаю.

Кидаю ссылку на статью https://habrahabr.ru/post/154369/

Очень познавательная статья с кучей C# кода.
Ну и посмотри остальные статьи автора https://habrahabr.ru/users/mephistopheies/topics/
0
Silvermatic
3 / 3 / 0
Регистрация: 27.02.2014
Сообщений: 36
22.09.2016, 18:46 5
Нашел отличное объяснение в весьма неожиданном месте. Все с рисунками и объяснениями. Видно, что автор материала старался. Мне помогло, все понял сразу. Правда есть один несущественный недочет, но не сильно критический. Материал служит как точка опоры в изучениии инс.
http://robocraft.ru/blog/algorithm/560.html
1
сахатый
36 / 16 / 4
Регистрация: 12.10.2015
Сообщений: 94
Завершенные тесты: 2
23.09.2016, 15:50 6
Цитата Сообщение от Silvermatic Посмотреть сообщение
Нашел отличное объяснение в весьма неожиданном месте. Все с рисунками и объяснениями. Видно, что автор материала старался. Мне помогло, все понял сразу. Правда есть один несущественный недочет, но не сильно критический. Материал служит как точка опоры в изучениии инс.
http://robocraft.ru/blog/algorithm/560.html
Да, там разжевано до предела, но есть ошибочка, при обратном распространении нужно ошибку толкать не в чистом виде, а умноженную на производную, там она чистоганом идёт а только потом на стадии коррекции весов домножается один раз на производную конкретного нейрона и самое интересное что так тоже будет работать, но хуже, то естьошибка не совсем очевидная.
0
Silvermatic
3 / 3 / 0
Регистрация: 27.02.2014
Сообщений: 36
23.09.2016, 16:32 7
сахатый, я подозревал, что такое распространение ошибки не совсем корректное, но так еще пионер, то не заморачивался. А за инфу спасибо, сегодня переделаю и попробую сравнить результаты.
0
puchik
29 / 6 / 0
Регистрация: 14.12.2015
Сообщений: 45
23.09.2016, 18:59 8
Цитата Сообщение от сахатый Посмотреть сообщение
MLP написать в 150 строк кода
это вряд ли... У Виктора Царегорцева тысячи строк персептрон, а он с прошлого века нейросети пишет.
Цитата Сообщение от сахатый Посмотреть сообщение
Да, там разжевано до предела, но есть ошибочка, при обратном распространении нужно ошибку толкать не в чистом виде, а умноженную на производную, там она чистоганом идёт а только потом на стадии коррекции весов домножается один раз на производную конкретного нейрона и самое интересное что так тоже будет работать, но хуже, то естьошибка не совсем очевидная.
здесь по подробнее плиз, что не вернои чего там на что умножать? Статья переведена с буржуинской, на мой взгляд там всё корректно

Добавлено через 9 минут
Цитата Сообщение от LeniumSoft Посмотреть сообщение
Кидаю ссылку на статью https://habrahabr.ru/post/154369/
статья хорошая конечно, как реферат в универ, но для кодера который не просто хочет написать перцык для галочки, а главное разобраться что к чему в деталях, это не совсем то, код автор написал слишком уж ритуальный, интерфейсы, паттерны, даже с xml комментами для доки, короче куча обвеса, что сути не касается, оно то конечно в результате так и должно быть, но разбираться всё таки лучше в не бремененном архитектурой коде и разъяснениях с картинками где видно что куда идет на какой итерации как в статье выше.
0
warhast
20 / 20 / 4
Регистрация: 02.02.2014
Сообщений: 77
23.09.2016, 20:09 9
Простейший перцептрон, если не велосипедить, а пользоваться BLAS, это умножение вектора (вход) на матрицу весов слоя, прибавление другого вектора (bias) и применение к результату функции активации столько раз сколько надо слоев. Обучение, если SGD, тоже не более 4-5 вызовов на слой. Так что 150 строк на C++ - это уже с получением данных/сохранением результатов и прочими посторонними вещами.
0
puchik
29 / 6 / 0
Регистрация: 14.12.2015
Сообщений: 45
24.09.2016, 14:40 10
Цитата Сообщение от warhast Посмотреть сообщение
Простейший перцептрон, если не велосипедить, а пользоваться BLAS, это умножение вектора (вход) на матрицу весов слоя, прибавление другого вектора (bias) и применение к результату функции активации столько раз сколько надо слоев. Обучение, если SGD, тоже не более 4-5 вызовов на слой. Так что 150 строк на C++ - это уже с получением данных/сохранением результатов и прочими посторонними вещами.
Теоретически всегда так кажется. Попробуйте запилить и тогда посмотрим сколько у Вас выйдет строк
0
warhast
20 / 20 / 4
Регистрация: 02.02.2014
Сообщений: 77
24.09.2016, 19:36 11
Да ради Ктулху:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <algorithm>
#include <cmath>
#include <fcntl.h>
#include <functional>
#include <iostream>
#include <openblas/cblas.h>
#include <stdlib.h>
#include <unistd.h>
#include <vector>
std::vector<float> load_img(int fd, size_t idx) {
  std::vector<uint8_t> img(28 * 28);
  ::pread(fd, &img[0], img.size(), 16 + 28 * 28 * idx);
  std::vector<float> result(28 * 28);
  float s = 0;
  for (int i = 0; i < 28 * 28; ++i) {
    const auto c = (1.0 / 255.0) * (float)img[i];
    result[i] = c;
    s += c;
  }
  s /= 28 * 28 * 2;
  for (auto &f : result) {
    f -= s;
  }
  return result;
};
 
void randi(std::vector<float> &v, float scale, float k = 0, bool b = true) {
  float s = 0;
  for (auto &f : v) {
    f = f * k + scale * ::drand48();
    s += f;
  }
  if(!b) return;
  s /= v.size() * 2;
  for (auto &f : v) {
    f -= s;
  }
};
 
void mulfi(std::vector<float> &dst, std::vector<float> &src,
           std::function<float(float)> f) {
  for (size_t idx = 0; idx < dst.size(); ++idx) {
    dst[idx] *= f(src[idx]);
  }
};
 
void sgemv(bool trans, std::vector<float> &mat, int m, int n,
           std::vector<float> &x, float beta, std::vector<float> &y) {
  ::cblas_sgemv(::CBLAS_ORDER::CblasRowMajor,
                trans ? ::CBLAS_TRANSPOSE::CblasTrans
                      : ::CBLAS_TRANSPOSE::CblasNoTrans,
                m, n, 1.0f, &mat[0], n, &x[0], 1, beta, &y[0], 1);
};
 
void applyf(std::vector<float> &v, std::function<float(float)> f) {
  std::transform(v.begin(), v.end(), v.begin(), f);
};
 
int main() {
  std::vector<uint8_t> labels(60000), tlabels(10000);
  std::vector<std::vector<float>> images(60000), timages(10000);
 
  int fd_labels = ::open("/home/user/projects/nn-transfer/nn_private/mnist/"
                         "train-labels.idx1-ubyte",
                         O_RDONLY);
  ::pread(fd_labels, &labels[0], labels.size(), 8);
  int fd_images = ::open("/home/user/projects/nn-transfer/nn_private/mnist/"
                         "train-images.idx3-ubyte",
                         O_RDONLY);
  for (size_t idx = 0; idx < images.size(); ++idx) {
    images[idx] = load_img(fd_images, idx);
  }
  int fd_tlabels = ::open(
      "/home/user/projects/nn-transfer/nn_private/mnist/t10k-labels.idx1-ubyte",
      O_RDONLY);
  ::pread(fd_tlabels, &tlabels[0], tlabels.size(), 8);
  int fd_timages = ::open(
      "/home/user/projects/nn-transfer/nn_private/mnist/t10k-images.idx3-ubyte",
      O_RDONLY);
  for (size_t idx = 0; idx < timages.size(); ++idx) {
    timages[idx] = load_img(fd_timages, idx);
  }
 
  const int l0_size = 400;
  const float lrate = 1e-6f, lrc = .3f;
  auto lr = [lrc](float f) { return f > 0 ? f : f * lrc; };
  auto lr_dv = [lrc](float f) { return f > 0 ? 1 : lrc; };
 
  std::vector<float> layer0_weights(28 * 28 * l0_size), layer0_biases(l0_size);
  std::vector<float> layer1_weights(l0_size * 10), layer1_biases(10);
  std::vector<float> inner(l0_size), out(10), innerGr(l0_size), outGr(10);
 
  ::srand48(::time(nullptr));
  randi(layer0_weights, (2 * 1.5 / std::sqrt(28 * 28 + l0_size)));
  randi(layer0_biases, (2 * 1.5 / std::sqrt(28 * 28 + l0_size)));
  randi(layer1_weights, (2 * 1.5 / std::sqrt(l0_size + 10)));
  randi(layer1_biases, (2 * 1.5 / std::sqrt(l0_size + 10)));
  auto apply_mlp = [&](std::vector<float> &img) {
    std::copy(layer0_biases.begin(), layer0_biases.end(), inner.begin());
    sgemv(false, layer0_weights, l0_size, 28 * 28, img, 1.0, inner);
    applyf(inner, lr);
    std::copy(layer1_biases.begin(), layer1_biases.end(), out.begin());
    sgemv(false, layer1_weights, 10, l0_size, inner, 1.0, out);
    applyf(out, lr);
  };
  auto gradiends = [&] {
    mulfi(outGr, out, lr_dv);
    sgemv(true, layer1_weights, 10, l0_size, outGr, 0.0, innerGr);
    mulfi(innerGr, inner, lr_dv);
  };
  auto train = [&](std::vector<float> &img) {
    ::cblas_saxpy(10, lrate, &outGr[0], 1, &layer1_biases[0], 1);
    ::cblas_sger(::CBLAS_ORDER::CblasRowMajor, 10, l0_size, lrate, &outGr[0], 1,
                 &inner[0], 1, &layer1_weights[0], l0_size);
    ::cblas_saxpy(l0_size, lrate, &innerGr[0], 1, &layer0_biases[0], 1);
    ::cblas_sger(::CBLAS_ORDER::CblasRowMajor, l0_size, 28 * 28, lrate,
                 &innerGr[0], 1, &img[0], 1, &layer0_weights[0], 28 * 28);
  };
  for (int epoch = 0; epoch < 1000; ++epoch) {
    randi(layer0_weights, 1e-8f, 1, false);
    randi(layer1_weights, 1e-8f, 1, false);
 
    for (size_t idx = 0; idx < 60000; ++idx) {
      apply_mlp(images[idx]);
 
      for (int i = 0; i < 10; ++i) {
        outGr[i] = i == labels[idx] ? 1 : 0;
      }
      cblas_saxpy(10, -1.0f, &out[0], 1, &outGr[0], 1);
 
      gradiends();
      train(images[idx]);
    }
    int success = 0, fail = 0;
    for (size_t idx = 0; idx < 10000; ++idx) {
      apply_mlp(timages[idx]);
      if (std::distance(out.begin(),
                        std::max_element(out.begin(), out.end())) ==
          tlabels[idx]) {
        ++success;
      } else {
        ++fail;
      }
    }
    std::cout << "epoch = " << epoch << ", success: " << success
              << ", fail: " << fail << "\n";
  }
}

Нашмякал только что на коленке, так что и скорость и качество так себе, но в 150 строк два слоя уложились вместе с чтением тренировачных и тестовых данных при том, что со стороны только BLAS тянется. А что 8% ошибок к 500 эпохе - так для настолько примитивной реализации вполне сойдет, тем более что главным было уложиться в выбранный размер исходника.

Добавлено через 32 минуты
вдогонку - если lrate выставить как 1e-3 и каждую эпоху множить на что-то вроде .996 то сходимость заметно улучшается именно для mnist-овского набора цифр (2% ошибок к 50 эпохе).
1
puchik
29 / 6 / 0
Регистрация: 14.12.2015
Сообщений: 45
24.09.2016, 21:04 12
Цитата Сообщение от warhast Посмотреть сообщение
Нашмякал только что на коленке
круто
сложно с наскоку разобраться что там к чему, но в требования(<150 строк) уложились
0
сахатый
36 / 16 / 4
Регистрация: 12.10.2015
Сообщений: 94
Завершенные тесты: 2
25.09.2016, 19:49 13
Цитата Сообщение от puchik Посмотреть сообщение
здесь по подробнее плиз, что не вернои чего там на что умножать?
да просто после вычисления взвешенной суммы ошибок следующего слоя на их веса для данного нейрона умножаем потом на производную и ЭТО уже дальше толкаем в предыдущие слои, потом когда веса апдейтим уже не умножаем на производную просто вход на ошибку и на лерн рэйт, а в статье ошибка идет без умножения на производные что не совсем корректно, хотя и работает тоже так, но в среднем хуже, хотя местами бывает лучше...
0
VTsaregorodtsev
581 / 534 / 77
Регистрация: 19.02.2010
Сообщений: 1,937
25.09.2016, 22:26 14
Цитата Сообщение от puchik Посмотреть сообщение
У Виктора Царегорцева тысячи строк персептрон
У меня он в моих рабочих программах, с разнообразными сервисными и т.д. алгоритмами, на столько тянет.
Хотя для заказчиков, которым нужен самый-самый примитив - есть код на 3 сотни строк, из трёх модулей, где примерно по сотне строк тянут класс нейронки и класс для хранения данных, и ещё с сотню - набор функций векторно-матричной арифметики (т.е. если эти функции не выносить отдельно из нейросетевого кода - то общее число строк сократится).
0
сахатый
36 / 16 / 4
Регистрация: 12.10.2015
Сообщений: 94
Завершенные тесты: 2
25.09.2016, 23:57 15
Цитата Сообщение от warhast Посмотреть сообщение
Нашмякал только что на коленке, так что и скорость и качество так себе, но в 150 строк два слоя уложились
"неси зачётку"

Ну, я видел там по красивше было, фактически рабочая нейросетка с настраиваемой архитектурой, функциями активации и тп. но без импорта данных, это другое. Вообще было бы интересно устроить челенж на самый вменяемый код MLP, потом проголосовать за победителя(лей) по разным метрикам(читаемость кода, скорость работы и тд.)
0
VTsaregorodtsev
581 / 534 / 77
Регистрация: 19.02.2010
Сообщений: 1,937
26.09.2016, 00:20 16
Цитата Сообщение от сахатый Посмотреть сообщение
проголосовать за победителя(лей) по разным метрикам(читаемость кода, скорость работы и тд.)
По скорости работы - победители известны
Для CPUшного кода - я, для GPUшного - недавно купленная гуглом Nervana (но там исходники библиотеки, ЕМНИП, не были доступны - только интерфейс библиотеки, а в исходниках код ходил к НВидиевским драйверам видеокарты, минуя CUDA-уровень). Т.е. код - нечитаемый, в обоих случаях (т.к. у меня математика - на инлайн-ассемблере внутри Сишных функций, правда, С-код тоже там рядом лежит и может дефайном подключаться взамен ассемблерного).
0
сахатый
36 / 16 / 4
Регистрация: 12.10.2015
Сообщений: 94
Завершенные тесты: 2
26.09.2016, 23:51 17
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
По скорости работы - победители известны
Для CPUшного кода - я,
MNISTу за сколько времени Ваша нейросетка до <3% ошибки на тесте натренировывается?
0
puchik
29 / 6 / 0
Регистрация: 14.12.2015
Сообщений: 45
27.09.2016, 12:15 18
Цитата Сообщение от сахатый Посмотреть сообщение
да просто после вычисления взвешенной суммы ошибок следующего слоя на их веса для данного нейрона умножаем потом на производную и ЭТО уже дальше толкаем в предыдущие слои, потом когда веса апдейтим уже не умножаем на производную просто вход на ошибку и на лерн рэйт, а в статье ошибка идет без умножения на производные что не совсем корректно, хотя и работает тоже так, но в среднем хуже, хотя местами бывает лучше...
вроде понял понял, благодарю
0
avadhuta
0 / 0 / 1
Регистрация: 24.07.2016
Сообщений: 1
28.09.2016, 01:29 19
Лучший ответ Сообщение было отмечено gregoro как решение

Решение

Полагаю мой старенький C# вариант многослойного перцептрона с SGD самый понятный, в три строчки запускается, учится и распознаёт. Без сторонних библиотек и навороченной архитектуры.

C#
1
2
3
var mlp = new MlpSimple(inputsSize, structure);
mlp.Learn(trainInputs, trainOutputs, epoh, lernRate);
var predict = mlp.Compute(vector);
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// Copyright © Igor Gotsulyak 2013, [email]igor.gotsulyak@gmail.com[/email]
public class Neuron
{
    public double[] Weights, Input;
    public double Out, Error, Drv, Bias, BiasWeight;
 
    public Neuron(int inputsCount)
    {
        Weights = new double[inputsCount];
        InitWeights();
    }
 
    int seed = (int)DateTime.Now.Ticks;
    private double Rnd() => ((new Random(seed++)).NextDouble() * 2 - 1);
 
    public void InitWeights()
    {
        var l = Weights.Length;
        for (int i = 0; i < l; i++) Weights[i] = 2 * Rnd() / l;
        BiasWeight = 2 * Rnd() / l;
    }
 
    public double Compute(double[] input)
    {
        Input = input;
        Out = 0;
        for (int i = 0; i < input.Length; i++) Out += input[i] * Weights[i];
        Out += BiasWeight;
        Out = Math.Tanh(Out);
        Drv = (1 - Out) * (1 + Out);
 
        return Out;
    }
 
    public void TuneWeight(double learnRate)
    {
        for (int i = 0; i < Input.Length; i++) Weights[i] += Input[i] * Error * learnRate;
        BiasWeight += Error * learnRate;
    }
}
 
public class Layer
{
    public Neuron[] neurons;
    public Layer nextLayer;
    public double[] Outputs;
 
    public Layer(int neuronsCount, int inputsCount)
    {
        neurons = new Neuron[neuronsCount];
        for (int i = 0; i < neurons.Length; i++) neurons[i] = new Neuron(inputsCount);
    }
 
    public double[] ComputeForward(double[] input)
    {
        Outputs = new double[neurons.Length];
        for (int i = 0; i < neurons.Length; i++) Outputs[i] = neurons[i].Compute(input);
 
        return Outputs;
    }
 
    public void ComputeBackward()
    {
        if (nextLayer != null)
            for (int i = 0; i < neurons.Length; i++) OneBackItter(i);
    }
 
    private void OneBackItter(int i)
    {
        double backPropError = 0;
        for (int j = 0; j < nextLayer.neurons.Length; j++)
            backPropError += nextLayer.neurons[j].Weights[i] * nextLayer.neurons[j].Error;
 
        neurons[i].Error = backPropError * neurons[i].Drv;
    }
}
 
public class MlpSimple
{
    public Layer[] Layers;
 
    public MlpSimple(int inputs, params int[] structure)
    {
        Layers = new Layer[structure.Length];
        Layers[0] = new Layer(structure[0], inputs);
 
        for (int i = 1; i < structure.Length; i++)
        {
            var neuronsCount = structure[i];
            var inputsCount = structure[i - 1];
 
            Layers[i] = new Layer(neuronsCount, inputsCount);
        }
 
        for (int i = 0; i < Layers.Length - 1; i++) Layers[i].nextLayer = Layers[i + 1];
    }
 
    public double[] Compute(double[] vector)
    {
        ComputeForward(vector);
        return Layers.Last().Outputs;
    }
 
    public void ComputeForward(double[] input)
    {
        for (int i = 0; i < Layers.Length; i++) input = Layers[i].ComputeForward(input);
    }
 
    public void ComputeBackward(double[] output)
    {
        var lastLayer = Layers.Last();
        for (int i = 0; i < output.Length; i++)
            lastLayer.neurons[i].Error = (output[i] - lastLayer.neurons[i].Out) * lastLayer.neurons[i].Drv;
 
        for (int i = Layers.Length - 2; i >= 0; i--) Layers[i].ComputeBackward();
    }
 
    public void TuneWeights()
    {
        for (int i = 0; i < Layers.Length; i++)
            for (int j = 0; j < Layers[i].neurons.Length; j++)
                Layers[i].neurons[j].TuneWeight(learnRate);
    }
 
    public void OneTune(double[][] inputs, double[][] outputs, int index = -1)
    {
        ComputeForward(inputs[index]);
        ComputeBackward(outputs[index]);
        TuneWeights();
    }
 
    double learnRate;
    public void Learn(double[][] inputs, double[][] outputs, int epoh = 50, double learnRate = 0.01)
    {
        this.learnRate = learnRate;
 
        for (int j = 0; j < epoh; j++)
            for (int i = 0; i < inputs.Count(); i++) OneTune(inputs, outputs, i);
    }
}
0
puchik
29 / 6 / 0
Регистрация: 14.12.2015
Сообщений: 45
28.09.2016, 18:31 20
Цитата Сообщение от avadhuta Посмотреть сообщение
Полагаю мой старенький C# вариант многослойного перцептрона с SGD самый понятный
ну типа того, только на плюсах, шарп всётаки по медленней и чтобы ещё по шустрее нужно всё в куче делать через матрицы без "нейронов" и "слоёв", но тогда нифига не будет понятно для не посвященного
0
28.09.2016, 18:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2016, 18:31

Как создаются нейросети для чат ботов?
Хочу узнать как создаются нейросети для чат-ботов. неужеле нужна какая-то супер математика?

Что мешает смоделировать мозг человека посредством искусственной нейросети?
Если это возможно, хотелось бы завести отдельную тему, где любители научно-популярной литературы на...

Описать структуру Bibliotec, содержащую следующие поля: автор книги, инвентарный номер книги, название книги
Описать структуру BIBLIOTEC содержащий следующие поля: автор книги , инвентарный номер книги ,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru