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
<<
< Пред.
|
След. >
>>
Главная
|
Материалы
|
Справочник
|
Гостевая книга
|
Форум
|
Ссылки
|
О сайте
Вопросы и замечания направляйте нам по
Copyright © 2001-2022, www.gotai.net