GotAI.NET
Форум: Проблемы искусственного интеллекта
Регистрация
|
Вход
Все темы
|
Новая тема
Стр.1 (12)
След. >
>>
Поиск:
Автор
Тема: Обучение сети
Артём
Сообщений: 10
Обучение сети
Добавлено: 21 дек 08 20:24
Здравствуйте.
Уже больше месяца мучаюсь над одной проблемой, не могу обучить многослойную нейронную сеть методом обратного распространения ошибки. Люди добрые, будьте любезны опишите весь алгоритм на русском языке(а то в инете одни формулы непонятные ), что и как по шагово, по пунктам. Заранее спасибо!
[
Ответ
][
Цитата
]
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 22 дек 08 6:54
Посмотрите здесь
http://gotai.net/forum/Default.aspx?postid=10411#10411
[
Ответ
][
Цитата
]
гость
89.208.11.*
На: Обучение сети
Добавлено: 22 дек 08 12:00
гы-гы-гы
[
Ответ
][
Цитата
]
Артём
Сообщений: 10
На: Обучение сети
Добавлено: 22 дек 08 18:00
Да, я до этого уже просматривал эту ветку, пытался достучаться до автора чтобы получить тот код который он давал Вам не получилось, а без кода ветка теряет смысл
[
Ответ
][
Цитата
]
Артём
Сообщений: 10
На: Обучение сети
Добавлено: 22 дек 08 18:05
Не я могу выложить и сам код с коментами к каждой строке, но думаю не кто не захочет копаться в чужом коде, а на словах я думаю по проще рассказать что куда и как
[
Ответ
][
Цитата
]
daner
Сообщений: 4593
На: Обучение сети
Добавлено: 22 дек 08 18:51
Цитата:
Автор: Артём
Да, я до этого уже просматривал эту ветку, пытался достучаться до автора чтобы получить тот код который он давал Вам не получилось, а без кода ветка теряет смысл
вы про какой код? про мой? если да, то не пойму как именно вы стучались.
у меня нет проблемы его вам дать. Но возможно у вас не код не работает, а просто вы ждете от программы не того, что она делает. (например, ждать от программы сортировки, вычисления квадратного корня, не совсем правильный подход).
Так что... предлагаю вам в начале ТОЧНО описать что вы делаете (т.е. не алгоритм и программу, а именно действия. Т.е. что подаете на входы, что ждете на выходе, как проверяете ошибку и т.д.).
кстати, это ваш ICQ заканчивается на ****88706 ? Если да, то вы сами мне не отвечаете.
[
Ответ
][
Цитата
]
Артём
Сообщений: 10
На: Обучение сети
Добавлено: 22 дек 08 19:58
Да мой. Я Вам с неделю пишу, и в ответ тишина, странно , почему так! Всё что вы сказали выше я выполню, но завтро, сегодня просто работы моря и некогда.
[
Ответ
][
Цитата
]
daner
Сообщений: 4593
На: Обучение сети
Добавлено: 22 дек 08 20:12
Цитата:
Автор: Артём
Да мой. Я Вам с неделю пишу, и в ответ тишина, странно , почему так! Всё что вы сказали выше я выполню, но завтро, сегодня просто работы моря и некогда.
Боже упаси, что бы я вас торопил. у самого дел по горло.
Я на все ваши сообщения отвечаю. Вы видно ответы не получаете. пишите на е-маил в гоогле: danerde
[
Ответ
][
Цитата
]
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 23 дек 08 1:02
Цитата:
Автор: Артём
Не я могу выложить и сам код с коментами к каждой строке, но думаю не кто не захочет копаться в чужом коде, а на словах я думаю по проще рассказать что куда и как
Ну, не скажите ... лучше выложите код ... я постараюсь посмотреть, заодно сравню со своим - тоже подозреваю что там не все чисто ... хотя на простых примерах работает ...
[
Ответ
][
Цитата
]
Артём
Сообщений: 10
На: Обучение сети
Добавлено: 23 дек 08 11:57
Но он конечно объёмный для выкладывания его тут
, да нет шучу маленький - многофункциональный код (создание динамической нейросети, без обучения) написан на mql4 он абсолютно схож с С++ так что тут проблем нет. Может мы по icq обсудим? или у Вас нет такой возможности ?
[
Ответ
][
Цитата
]
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 23 дек 08 16:26
Цитата:
Автор: Артём
Но он конечно объёмный для выкладывания его тут
, да нет шучу маленький - многофункциональный код (создание динамической нейросети, без обучения) написан на mql4 он абсолютно схож с С++ так что тут проблем нет. Может мы по icq обсудим? или у Вас нет такой возможности ?
Честно не люблю я эти icq, не вижу ни какой разницы с форумом
Хотите можно по Skype - но не вижу, что тут обсуждать пока я не посмотрю код ... хотите пришлите на ящик tac@inbox.lv, посмотрю потом поговорим ... но не так скоро, работа, да и статью тут хочу еще написать, да и празники на носу ... но вы посылайте выдасться спокойная ночь - посмотрю ...
Еще не понял - "создание динамической нейросети, без обучения" - вопрос с же стоял как раз по обучению ?
А не можете ли вы выдрать именно саму сеть с обучением ... без лишней специфики задачи ?
(Да, и объемные коды я смотрю без проблем - проффессия такая - изучать чужие коды и их улучшать
)
Заодно напишите где можно скачать все что требуется для программирования на mql4 или хотя бы MetaEditor 4
[
Ответ
][
Цитата
]
Артём
Сообщений: 10
На: Обучение сети
Добавлено: 23 дек 08 16:58
//MQL4 - язык программирование торговых роботов на валютной бирже
//так как в mql4 проблема с массивами то их нужно объявлять на элемент больше
// по умолчанию сеть состоит из смотрим на массив с весами: 1-измерение число //слоёв=3(2 скрытых и один выходной) потом число нейронов в каждом слое по 4 и кол-во
//входных данных Х = 4;
int y=1;
double Alfa=0.0001;// скорость обучения
double IS=0.1; //инициализация сети вот этим число (потом рандом сделаю)
double strengths[4][5][5];//весовая матрица
double input[5][3];//массив с входными данными первое измерение кол-во входов = 4
// а второе количество срок, на вход подаётся по 1 примеру
double Output[2][3]; //массив выходных данных - внизу есть процедурка увидите как //работает
double Input[5];//тут массив с нормализированными значениями
double $Out[3][5]; //Массив выходов сети начиная со скрытых слоёв //первое измерение слой а второй нейрон
double error=0.05;// ошибка, нужна при обучение
int OutLine=1;// количество нейронов в выходном слое
int NSPeriod=9999999;// количество эпох обучения
//+------------------------------------------------------------------+
//| Функция активации нейронов |
//+------------------------------------------------------------------+
double ActionNeuron(double x, int a){
if(a==1)
return( 1/(1+MathExp(x*(-1)) ) ); //Сигмоидальная логистическая функция
if(a==2)
return((MathExp(1*x)-MathExp(-1*x))/(MathExp(1*x)+MathExp(-1*x)));//Гиперболический тангенс
}
//+------------------------------------------------------------------+
//| Инцилизация сети |
//+------------------------------------------------------------------+
double initialise_strengths(){
ArrayInitialize(strengths,IS);
}
//+------------------------------------------------------------------+
//| Нейронная сеть |
//+------------------------------------------------------------------+
double Neuro_Exp(int InLine, double strengths[][][], int Treining){
BD(InLine);// формирование БД
int X=ArrayRange(Input,0)-1; //Число входов (4)
int S=ArrayRange(strengths,0)-2;//Число скрытых слоёв (2)
int N=ArrayRange(strengths,1)-1;//Число нейронов в каждом скрытом слое (4)
int i,j,l,s,n,x;
double summ=0;
//Расчёт скрытых слоёв
//+------------------------------------------------------------------+
for(s=1;s<=S;s++){// двигаемся по слоям
for(n=1;n<=N;n++){ //по нейронам
for(x=1;x<=X;x++){// по входам, тут идёт подсчёт (взвешанная сумма)
if(s==1)// если первый скрытый слой то входами являются значения из масива инпут
summ+=(strengths[s][n][x]*input[x][1]);else
summ+=(strengths[s][n][x]*$Out[s-1][x]);// иначе входы являются выходы предыдущего слоя
}
// $Out[s][n]=ActionNeuron(summ,2);// заносим значения (прошедшие через сигмоид) выходов нейронов слоя s нейрона n
$Out[s][n]=summ;
summ=0;
}
}
//+------------------------------------------------------------------+
//Расчёт выходного слоя
for(x=1;x<=X;x++){
summ+=(strengths[S+1][OutLine][x]*$Out[S][x]);
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
}
//return(ActionNeuron(summ,2));
return(summ);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Формирование Базы Данных |
//+------------------------------------------------------------------+
double BD(int SL){
//+------------------------------------------------------------------+
input[1][1]=1; Output[1][1]=4;
input[2][1]=1; Output[1][2]=0.6;
input[3][1]=1;
input[4][1]=1;
input[1][2]=5;
input[2][2]=4;
input[3][2]=3;
input[4][2]=2;
//ну вот первая строка четыре единицы , и выход является 4
//+------------------------------------------------------------------+
//а тут нормировка входных данных SL передаёт строку если первая то это где четыре 1
int i,v;
double Maxln[],Minln[],TI[];
ArrayResize(Maxln,(ArrayRange(input,0)) );
ArrayResize(Minln,(ArrayRange(input,0)) );
ArrayResize(TI, (ArrayRange(input,1)) );
//-
for(v=1;v<=(ArrayRange(input,0));v++){
if(v>1){
Maxln[v-1]=TI[ArrayMaximum(TI,(ArrayRange(input,1)-1),1)];
Minln[v-1]=TI[ArrayMinimum(TI,(ArrayRange(input,1)-1),1)];}
for(i=1;i<=(ArrayRange(input,1)-1);i++)
TI[i]=input[v][i];
}
//--
for(i=1;i<=4;i++){
Input[i]=(input[i][SL]-Minln[i]+0.01)/(Maxln[i]-Minln[i]+0.01) ;
if(Input[i]<1) Input[i]=0;
}
}
//+------------------------------------------------------------------+
//| Обновление весовых коэфициентов |
//+------------------------------------------------------------------+
double update_strengths(){
// а вот тут полная лажа! что то попытался сам
int X=ArrayRange(Input,0)-1; //Число входов (4)
int S=ArrayRange(strengths,0)-2;//Число скрытых слоёв (2)
int N=ArrayRange(strengths,1)-1;//Число нейронов в каждом скрытом слое (4)
int G=ArrayRange(Input,1)-1;
int i,j,l,s,n,x;
double summ=0;
Neuro_Exp(1,strengths,1);
for(s=S;s>1;s--)
for(n=1;n<=N;n++)
for(x=1;x<=X;x++){
if(s==S)
strengths[s][n][x]+=Alfa*input[x][1]*($Out[s][n]*(Output[1][1]-$Out[s][n]));else
strengths[s][n][x]+=Alfa*input[x][1]*($Out[s][n]*(Output[1][1]-$Out[s][n]));
}
}
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
initialise_strengths();
if (y==1)
for(int i=1; i<=NSPeriod;i++){
update_strengths();
if( Neuro_Exp(1,strengths,1)<4 && Neuro_Exp(1,strengths,1)>3.9 ){
i=NSPeriod; y=2;}
}
Comment(Neuro_Exp(1,strengths,1));
//----
return(0);
}
//+------------------------------------------------------------------+
Всё. Приму к рассмотрению ваши идеи, переделать его под нужный для профессионала 5 минут но просьба с теми переменными которые я объявил, т.е. сами названия
[
Ответ
][
Цитата
]
Артём
Сообщений: 10
На: Обучение сети
Добавлено: 23 дек 08 17:05
Цитата:
Автор: tac
Честно не люблю я эти icq, не вижу ни какой разницы с форумом
Хотите можно по Skype - но не вижу, что тут обсуждать пока я не посмотрю код ... хотите пришлите на ящик tac@inbox.lv, посмотрю потом поговорим ... но не так скоро, работа, да и статью тут хочу еще написать, да и празники на носу ... но вы посылайте выдасться спокойная ночь - посмотрю ...
Еще не понял - "создание динамической нейросети, без обучения" - вопрос с же стоял как раз по обучению ?
А не можете ли вы выдрать именно саму сеть с обучением ... без лишней специфики задачи ?
(Да, и объемные коды я смотрю без проблем - проффессия такая - изучать чужие коды и их улучшать
)
Заодно напишите где можно скачать все что требуется для программирования на mql4 или хотя бы MetaEditor 4
На форуме
http://forum.mql4.com/ru/
всё про mql4
на сайте
http://www.brocompany.ru
можно бесплатно скачать саму платформу и встроенным в него языком
а в платформе можно открыть бесплатный демо счёт и протестировать нейросеть сам язык мкл4 несложный я за 2 дня освоил, вот если буду вопросы пишите!
[
Ответ
][
Цитата
]
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 24 дек 08 19:05
namespace TestBP
{
class BP
{
//MQL4 - язык программирование торговых роботов на валютной бирже
//так как в mql4 проблема с массивами то их нужно объявлять на элемент больше
// по умолчанию сеть состоит из смотрим на массив с весами: 1-измерение число //слоёв=3(2 скрытых и один выходной) потом число нейронов в каждом слое по 4 и кол-во
//входных данных Х = 4;
double Alfa = 0.001;// скорость обучения
double IS = 0.1; //инициализация сети вот этим число (потом рандом сделаю)
double error = 0.05;// ошибка, нужна при обучение
int NSPeriod = 9999999;// количество эпох обучения
int X = 4; //Число входов (4)
int SampleCount = 2; // число примеров
int S = 2;//Число скрытых слоёв (2)
int N = 4;//Число нейронов в каждом скрытом слое (4)
int OutLine = 1;// количество нейронов в выходном слое
double[,] input; //массив с входными данными первое измерение кол-во входов = 4
// а второе количество срок, на вход подаётся по 1 примеру
double[] Output; //массив выходных данных - внизу есть процедурка увидите как //работает
double[] Input;//тут массив с нормализированными значениями
double[, ,] strengths;//весовая матрица
double[,] Out = new double[2, 4]; //Массив выходов сети начиная со скрытых слоёв //первое измерение слой а второй нейрон
public BP()
{
input = new double[X, SampleCount];//массив с входными данными первое измерение кол-во входов = 4
Output = new double[SampleCount]; //массив выходных данных - внизу есть процедурка увидите как //работает
Input = new double[X];//тут массив с нормализированными значениями
strengths = new double[S, N, X];//весовая матрица
for (int s = 0; s < S; s++)
{
//по нейронам
for (int n = 0; n < N; n++)
{
// по входам, тут идёт подсчёт (взвешанная сумма)
for (int x = 0; x < X; x++)
{
strengths[s, n, x] = IS;
}
}
}
}
//+------------------------------------------------------------------+
//| Функция активации нейронов |
//+------------------------------------------------------------------+
double ActionNeuron(double x, int a)
{
//Сигмоидальная логистическая функция
if (a == 1)
{ return (1 / (1 + Math.Exp(x * (-1)))); }
//Гиперболический тангенс
if (a == 2)
{ return ((Math.Exp(1 * x) - Math.Exp(-1 * x)) / (Math.Exp(1 * x) + Math.Exp(-1 * x))); }
return 0;
}
//+------------------------------------------------------------------+
//| Нейронная сеть |
//+------------------------------------------------------------------+
double Neuro_Exp(int InLine, double[, ,] strengths, int Treining)
{
BD(InLine);// формирование БД
double summ = 0;
//Расчёт скрытых слоёв
//+------------------------------------------------------------------+
// двигаемся по слоям
for (int s = 0; s < S; s++)
{
//по нейронам
for (int n = 0; n < N; n++)
{
// по входам, тут идёт подсчёт (взвешанная сумма)
for (int x = 0; x < X; x++)
{
// если первый скрытый слой то входами являются значения из масива инпут
if (s == 0)
{ summ += (strengths[s, n, x] * input[x, InLine]); }
else
{ summ += (strengths[s, n, x] * Out[s - 1, x]); } // иначе входы являются выходы предыдущего слоя
}
Out[s, n] = summ;
summ = 0;
}
}
//Расчёт выходного слоя
for (int x = 0; x < X; x++)
{
summ += (strengths[S-1, OutLine, x] * Out[S-2, x]);
}
return summ;
}
//+------------------------------------------------------------------+
//| Формирование Базы Данных |
//+------------------------------------------------------------------+
void BD(int SL)
{
/*input[0, 0] = 7;
input[1, 0] = 4;
input[2, 0] = 5;
input[3, 0] = 0;
Output[0] = 10;
input[0, 1] = 6;
input[1, 1] = 4;
input[2, 1] = 5;
input[3, 1] = 0;
Output[1] = 20;
input[0, 2] = 7;
input[1, 2] = 5;
input[2, 2] = 6;
input[3, 2] = 0;
Output[2] = 30;
input[0, 3] = 6;
input[1, 3] = 3;
input[2, 3] = 5;
input[3, 3] = 0;
Output[3] = 40;
input[0, 4] = 8;
input[1, 4] = 5;
input[2, 4] = 6;
input[3, 4] = 0;
Output[4] = 50;*/
input[0, 0] = 1;
input[1, 0] = 1;
input[2, 0] = 1;
input[3, 0] = 1;
Output[0] = 4;
input[0, 1] = 5;
input[1, 1] = 4;
input[2, 1] = 3;
input[3, 1] = 2;
Output[1] = 0.6;
//ну вот первая строка четыре единицы , и выход является 4
//+------------------------------------------------------------------+
//а тут нормировка входных данных SL передаёт строку если первая то это где четыре 1
double[] Maxln, Minln, TI;
Maxln = new double[X + 1];
Minln = new double[X + 1];
TI = new double[SampleCount + 1];
for (int v = 0; v < X; v++)
{
for (int i = 0; i < SampleCount; i++)
{
TI[i] = input[v, i];
}
Maxln[v] = TI.Max();
Minln[v] = TI.Min();
}
for (int i = 0; i < X; i++)
{
Input[i] = (input[i, SL] - Minln[i] + 0.01) / (Maxln[i] - Minln[i] + 0.01);
if (Input[i] < 1)
{ Input[i] = 0; }
}
}
//+------------------------------------------------------------------+
//| Обновление весовых коэфициентов |
//+------------------------------------------------------------------+
void update_strengths(int SampleNumber)
{
// а вот тут полная лажа! что то попытался сам
Neuro_Exp(SampleNumber, strengths, 1);
for (int s = S-1; s > -1; s--)
{
for (int n = 0; n < N; n++)
{
for (int x = 0; x < X; x++)
{
if (s == 0)
{
strengths[s, n, x] += Alfa * input[x, SampleNumber] *
(Out[s, n] * (Output[SampleNumber] - Out[s, n]));
}
else
{
strengths[s, n, x] += Alfa * Out[s-1, x] *
(Out[s, n] * (Output[SampleNumber] - Out[s, n]));
}
}
}
}
}
public void start()
{
double Result;
int ErrorCount;
for (int i = 1; i < NSPeriod; i++)
{
ErrorCount = 0;
for (int j = 0; j < SampleCount; j++)
{
update_strengths(j);
Result = Neuro_Exp(j, strengths, 1);
if (!(Result < (Output[j] + error) && Result > (Output[j] - error)))
{ ErrorCount++; }
Console.WriteLine("Output: {0} = {1}",
Output[j].ToString(), Result.ToString());
}
Console.WriteLine("Itteration: {0}; ErrorCount: {1}", i, ErrorCount.ToString());
// Console.ReadLine();
if (ErrorCount == 0)
{
break;
}
}
Console.ReadLine();
//Comment(Neuro_Exp(1,strengths,1));
}
}
}
[
Ответ
][
Цитата
]
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 24 дек 08 19:09
Ваш код - переведенный на С# и улучшенный ...
Незнаю после того как я исправил ваши индексы к массивам, обобщил на случай двух примеров ... и немного доработал ... в принципе заработал сразу ...
Но сходится именно ваш пример (где то за 1500 итераций), если у вас сойдется мой (из закомментированных 5 примеров) с любыми доработками - отпишите будет интересно ...
По сути у вас все верно, думаю вы запутались в индексах ...
Кстати, рекомменду придерживаться стиля к которому я привел ваш код ... назад на ваш язык я думаю протранслируете легко ...
(Заняло у меня кстати, не 5 минут
а часа два
наверно не достаточно проффи
правда занимался в основном переводом и вашим стилем и индексами массивов)
[
Ответ
][
Цитата
]
Стр.1 (12)
: [1]
2
3
4
5
...
12
След. >
>>
Главная
|
Материалы
|
Справочник
|
Гостевая книга
|
Форум
|
Ссылки
|
О сайте
Вопросы и замечания направляйте нам по
Copyright © 2001-2022, www.gotai.net