GotAI.NET

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

 

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

 Все темы | Новая тема Стр.7 (12)<< < Пред. | След. > >>   Поиск:  
 Автор Тема: На: Обучение сети
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 19 янв 09 13:46
Кстати, вас не интересует Террариум http://gotai.net/forum/Default.aspx?postid=15230#15230
[Ответ][Цитата]
Артём
Сообщений: 10
На: Обучение сети
Добавлено: 22 янв 09 11:29
Какая тут дискуссия развернулась без меня, Всем привет!
Да, в моём примере активационная функция была

double ActionNeuron(double x, int a){
// x - подаваемое на вход значение
// 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)));

}
[Ответ][Цитата]
Артём
Сообщений: 10
На: Обучение сети
Добавлено: 22 янв 09 11:32
и надо его усовершенствовать теперь
[Ответ][Цитата]
Артём
Сообщений: 10
На: Обучение сети
Добавлено: 23 янв 09 13:53
У меня на данном этапе пока вот так

//+------------------------------------------------------------------+
//| Искусственная нейронная сеть (версия сборки 1.5) |
//+------------------------------------------------------------------+
//| Параметры: |
//+------------------------------------------------------------------+
#define X 4// Число входов
#define S 2// Число скрытых слоёв
#define N 4// Число нейронов в каждом слое
#define OutLine 1// Число нейронов в выходном слое (оно же и число выходов)
#define GetLine 3// Общее количество слоёв (скрытые слои + выходной слой)
#define SampleCount 2// Число примеров обучающей выборки
//+------------------------------------------------------------------+
double Alfa=0.0002; // Скорость обучения
double IS=0.1; // Инцилизация весовой матрицы числом IS
double error=0.01; // Допустимая ошибка сети
int NSPeriod=999999; // Число эпох обучения
//+------------------------------------------------------------------+
bool ActionNeurons=true; // Активация нейронов (сигмоид)

//+------------------------------------------------------------------+
double input[X][S];
double Output[SampleCount];
double strengths[GetLine][X][X];
double Out[GetLine][X];
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Инцилизация весовой матрицы |
//+------------------------------------------------------------------+
double initialize_strengths(){
for (int s = 1; s <= S; s++)
for (int n = 1; n <= N; n++)
for (int x = 1; x <= X; x++)
strengths[s][n][x] = IS;
}
//+------------------------------------------------------------------+
//| Активационные функции нейронов |
//+------------------------------------------------------------------+
double ActionNeuron(double x, int a){
// x - подаваемое на вход значение
// 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 Neuro_Exp(double strengths[][][], int Count){
// strengths[][][] - весовая матрица
// Count - номер примера входных данных
double summ = 0;
//Расчёт скрытых слоёв
for (int s = 1; s <= S; s++){//Двигаемся по скрытым слоям
for (int n = 1; n <= N; n++){//Двигаемся по нейронам в выбранном слое
for (int x = 1; x <= X; x++){//Двигаемся по входам в нейрон
if (s == 1) summ += (strengths[s][n][x] * input[x][Count]); else
summ += (strengths[s][n][x] * Out[s - 1][x]);
}
if (ActionNeurons==true) Out[s][n] = ActionNeuron(summ,1); else
Out[s][n] = summ;
summ = 0;
}
}
//Расчёт выходного слоя
for ( x = 1; x <= X; x++)
summ += (strengths[S][OutLine][x] * Out[S-1][x]);

if (ActionNeurons==true)
return (ActionNeuron(summ,1));else
return (summ);
}

//+------------------------------------------------------------------+
//| Обновление весовых коэфициентов |
//+------------------------------------------------------------------+
double update_strengths(int SampleNumber){
Neuro_Exp(strengths,SampleNumber);

for (int s = S; s>0; s--)
for (int n = 1; n <= N; n++)
for (int x = 1; x <= X; x++)
if (s == 1)
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]));
}

//+------------------------------------------------------------------+
//| Обучение Нейронной сети |
//+------------------------------------------------------------------+
double Trening(){
double Result;
int ErrorCount;
for (int i = 1; i < NSPeriod; i++){
ErrorCount = 0;
for (int j = 1; j <= SampleCount; j++){
update_strengths(j);
Result = Neuro_Exp(strengths,j);
if (!(Result < (Output[j] + error) && Result > (Output[j] - error)))
ErrorCount++;
}
if (ErrorCount == 0)
break;
}
}

//+------------------------------------------------------------------+
//| База данных |
//+------------------------------------------------------------------+
double BD(){

input[1][1] = 0.1;
input[2][1] = 0.2;
input[3][1] = 0.3;
input[4][1] = 0.4;
Output[1] =0.7;

}

//+------------------------------------------------------------------+
//| Нормировка входных данных |
//+------------------------------------------------------------------+
double initialize_BD(){

}
//+------------------------------------------------------------------+
//| End. |
//+------------------------------------------------------------------+

int init(){
initialize_strengths();
BD();
Trening();
}
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 24 янв 09 12:56
3d6 - не могли бы вы выложить пригодный .net файл, который вы использовали на нашем примере, в том который есть я не нашел adaptive_speed, размеры слоев тоже достаточно странные 12, 2000, 2 - это как понимать ?

И главное как нужно поставлять сами примеры ?
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 24 янв 09 14:37
О! А что это за супер функции активации ?

double CMLPLayer::activFunction(double z)
{
if(z > 10)
return 1;
if(z < -10)
return 0;
return 1.0 / (1.0 + exp(-z));
}
double CMLPLayer::derAF(int x)
{
double re = postSyn[x];
if(postSyn[x] > 10)
re = 0;
if(postSyn[x] < -10)
re = -10;
re = exp(-re);
return re / ( (1.0 + re)*(1.0 + re) );
}


Походу, вы ребята занимаетесь перцептроным обучением, только очень искаженным ... и делаете умный вид
[Ответ][Цитата]
3d6
Сообщений: 325
На: Обучение сети
Добавлено: 24 янв 09 15:08
Цитата:
Автор: tac

О! А что это за супер функции активации ?

double CMLPLayer::activFunction(double z)
{
if(z > 10)
return 1;
if(z < -10)
return 0;
return 1.0 / (1.0 + exp(-z));
}

Обычная сигмоида. При z>10, z<-10 смысла считать точную экспоненту уже нет (отличие от 1/0 в очень далеких знаках), поэтому экономим время.

Цитата:

double CMLPLayer::derAF(int x)
{
double re = postSyn[x];
if(postSyn[x] > 10)
re = 0;
if(postSyn[x] < -10)
re = -10;
re = exp(-re);
return re / ( (1.0 + re)*(1.0 + re) );
}

Куски с if() похоже остались фиг знает от чего (наверное, я хотел там return число написать, но куда-то спешил, и забил), однако они не влияют на вычисление - в любом случае, производная вычисляется как exp(-z)/(1+exp(-z))^2. X на входе - это номер нейрона, для которого мы хотим знать производную.

Цитата:
Походу, вы ребята занимаетесь перцептроным обучением, только очень искаженным ... и делаете умный вид

Походу, вы делаете неверные выводы, и не стесняетесь их высказывать
[Ответ][Цитата]
3d6
Сообщений: 325
На: Обучение сети
Добавлено: 24 янв 09 15:15
Цитата:
Автор: tac

3d6 - не могли бы вы выложить пригодный .net файл, который вы использовали на нашем примере, в том который есть я не нашел adaptive_speed, размеры слоев тоже достаточно странные 12, 2000, 2 - это как понимать ?

И главное как нужно поставлять сами примеры ?

А зачем вам adaptive_speed? Это экспериментальная поправка к обучению, я смотрел на тему возможностей его ускорения. К классическому BP оно не относится, если в файле его нет - оно выключено.
Слои - 12 входов (побитовое представление x и y, на одну координату 4 бита, на другую - 8), 2 выхода - если клетка белая, первый выход 1, второй 0, если черная - наоборот. 2000 нейронов в скрытом слое.
Для обучения примеры нужно давать сети в метод train в виде указателей типа double с 12 и 2 числами (вход и выход соответственно).
Для тестирования нужно получить указатель на вход методом getInput, записать в него 12 чисел, выполнить метод calculate, получить указатель на выход методом getOutput, и сравнить 2 числа на выходе с ожидаемым ответом.
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 24 янв 09 20:42
Цитата:
Автор: 3d6

Походу, вы делаете неверные выводы, и не стесняетесь их высказывать


Вы можете повторить эксперимент ?
Надо изменить конфигурацию 2 - 2000 - 1. И иметь следующие функции:

double CMLPLayer::activFunction(double z)
{
return 1.0 / (1.0 + exp(-z));
}
double CMLPLayer::derAF(int x)
{
double re = postSyn[x];
re = exp(-re);
return re / ( (1.0 + re)*(1.0 + re) );
}

И пожалуйсто, доведите эксперимент до конца - мне интересно время именно 100% обучения.

Иначе, эксперимент не корректен !

-----------

Или же Вы однозначно признаете, что тут необходимо:
1. Битовое представление входов
2. Конфигурационное кодирование не применимо http://ru.wikipedia.org/wiki/Конфигурационное_кодирование
3. При высоком по модуле числе z которое возникает в подавляющем числе случаев используем пороговую функцию
4. Для коррекции используем фиксированный шаг коррекции
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 24 янв 09 21:00
Цитата:
Автор: 3d6
1. Обычная сигмоида. При z>10, z<-10 смысла считать точную экспоненту уже нет (отличие от 1/0 в очень далеких знаках), поэтому экономим время.

2. Куски с if() похоже остались фиг знает от чего (наверное, я хотел там return число написать, но куда-то спешил, и забил), однако они не влияют на вычисление - в любом случае, производная вычисляется как exp(-z)/(1+exp(-z))^2. X на входе - это номер нейрона, для которого мы хотим знать производную.


1. Ее нет смысла считать вообще
2. Ничего себе в любом случае - вычисляется или от плавающего числа или от 0 или -10.
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 24 янв 09 21:13
Цитата:
Автор: 3d6
Для обучения примеры нужно давать сети в метод train в виде указателей типа double с 12 и 2 числами (вход и выход соответственно).
Для тестирования нужно получить указатель на вход методом getInput, записать в него 12 чисел, выполнить метод calculate, получить указатель на выход методом getOutput, и сравнить 2 числа на выходе с ожидаемым ответом.


Вы можете дать соответствующий управляющий кусок кода, чтобы обучить на нашем примере ? Не хотелось бы получить различий в самом начале ...

Вот например,
делаю следующие

for(int x = 0; x < 1000; x++)
{
input[0] = 1;
input[1] = 1;

output[0] = 1;

oNet.train(input, output);

perc = oNet.getInput();
perc[0] = 1;
perc[1] = 1;

oNet.calculate();

result = oNet.getOutput();

printf("%f\n",result[0]);


input[0] = 0;
input[1] = 1;

output[0] = 0;

oNet.train(input, output);

perc = oNet.getInput();
perc[0] = 0;
perc[1] = 1;

oNet.calculate();

result = oNet.getOutput();

printf("%f\n",result[0]);

}

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

Если я делаю верно, то будем пробывать сложнее Может произойдет чудо ...
[Ответ][Цитата]
3d6
Сообщений: 325
На: Обучение сети
Добавлено: 25 янв 09 0:32
Цитата:
Автор: tac

2. Ничего себе в любом случае - вычисляется или от плавающего числа или от 0 или -10.

Вы неправильно прочитали код. Прочитайте еще раз. Всегда вычисляется от плавающего числа - какая разница, что было в переменной ДО записи в нее числа?
[Ответ][Цитата]
3d6
Сообщений: 325
На: Обучение сети
Добавлено: 25 янв 09 0:36
Цитата:
Автор: tac

Вы можете повторить эксперимент ?
Надо изменить конфигурацию 2 - 2000 - 1. И иметь следующие функции:

На своем нейрокомпьютере - да, отдельно - лень.

Цитата:
И пожалуйсто, доведите эксперимент до конца - мне интересно время именно 100% обучения.

Насчет 100% - это будет слишком долго. Я на это пойду только при условии, что вы мне дадите код перцептрона, который за 10 часов дает 100% - тогда я, так уж и быть, потрачу сутки процессорного времени на сравнение.

Цитата:
Или же Вы однозначно признаете, что тут необходимо:
1. Битовое представление входов
2. Конфигурационное кодирование не применимо http://ru.wikipedia.org/wiki/Конфигурационное_кодирование
3. При высоком по модуле числе z которое возникает в подавляющем числе случаев используем пороговую функцию
4. Для коррекции используем фиксированный шаг коррекции

1. Битовое представление - абсолютно необходимо.
2. А чем битовое представление не конфигурационное кодирование? о__О
3. При больших по модулю z сигмоида дает то же, что и пороговая функция.
4. Не необходимо, хотя при переходе от 99% к 100% это возможно даст прирост скорости, не знаю, как следует не анализировал этот вопрос - поскольку он не имеет практического смысла.
[Ответ][Цитата]
3d6
Сообщений: 325
На: Обучение сети
Добавлено: 25 янв 09 0:41
Цитата:
Автор: tac



Вы можете дать соответствующий управляющий кусок кода, чтобы обучить на нашем примере ? Не хотелось бы получить различий в самом начале ...

Отдельно у меня нет, все встроено в нейрокомпьютер. Однако если вы настаиваете, что ваш код не работает нормально - на днях попробую проверить.

Цитата:
Результата даже близко нету ... в чем дело может быть ?
Хотя за 10000 иттераций - что-то похожее вырисовывается, по вашему это нормально столько иттераций для такого простого примера, хотя наверно могу не спрашивать

Без понятия, у меня аналогичные примеры сходились замечательно. Какая структура сети используется? Покажите также код, который читает сеть из файла, может ошибка там. Или может в вашем коде какая-то настолько простая опечатка, что я ее сейчас не вижу
[Ответ][Цитата]
tac
Сообщений: 2601
На: Обучение сети
Добавлено: 25 янв 09 2:16
Цитата:
Автор: 3d6

На своем нейрокомпьютере - да, отдельно - лень.

Насчет 100% - это будет слишком долго. Я на это пойду только при условии, что вы мне дадите код перцептрона, который за 10 часов дает 100% - тогда я, так уж и быть, потрачу сутки процессорного времени на сравнение.


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

Давайте, Вас код на С# устроит ? Там так же используется специфика - все построенно на событиях.

И от вас тогда я бы тоже желал бы работоспособный код скопилированный под Visual C++, и чтобы компилируешь, запускаешь - и ждешь сутки. (Могу переслать то, что у меня получилось - может будет легче заставить работать этот код - это даже предпочтительнее, т.к. я выкинул все лишнее)

В замен будет тоже самое если поставите .NET и подождете 2-4 часа ...

Недели времени я думаю мне хватит, чтобы все это осуществить ... а Вам ?

Так как ?
[Ответ][Цитата]
 Стр.7 (12)1  ...  3  4  5  6  [7]  8  9  10  11  12<< < Пред. | След. > >>