GotAI.NET

Форум: Проблемы искусственного интеллекта

 

Регистрация | Вход

 Все темы | Новая тема Стр.1 (12)След. > >>   Поиск:  
 Автор Тема: Обучение сети
Артём
Сообщений: 10
Обучение сети
Добавлено: 21 дек 08 20:24
Здравствуйте.
Уже больше месяца мучаюсь над одной проблемой, не могу обучить многослойную нейронную сеть методом обратного распространения ошибки. Люди добрые, будьте любезны опишите весь алгоритм на русском языке(а то в инете одни формулы непонятные ), что и как по шагово, по пунктам. Заранее спасибо!
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 22 дек 08 6:54
[Ответ][Цитата]
гость
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След. > >>