Список форумов neuroproject.ru neuroproject.ru
Форум сайта компании НейроПроект
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Методы оптимизации функции ошибки при обучении нейросетей
На страницу 1, 2  След.
 
Начать новую тему   Ответить на тему    Список форумов neuroproject.ru -> Нейронные сети
Предыдущая тема :: Следующая тема  
Автор Сообщение
Filipp
Новый посетитель
Новый посетитель


Зарегистрирован: 07 Янв 2011
Сообщения: 13

СообщениеДобавлено: Пт Янв 07, 2011 8:35 pm    Заголовок сообщения: Методы оптимизации функции ошибки при обучении нейросетей Ответить с цитатой

Кратко о проблеме: успешно реализовал слоистую нейронную сеть, использующую алгоритм обратного распространения ошибки. На сколько я понимаю, в данном алгоритме для оптимизации используется метод наискорейшего спуска, иначе говоря оптимизация по направлению антиградиента. Озадачился вопросом изучения прочих методов оптимизации. Для начала взял метод сопряженных градиентов. Сам по себе метод ясен. Не понятно, как привязать его к обучению? Можно ли использовать данный метод в алгоритме обратного распространения (заменив выбор направления на соответствующий). Или как то еще? Не могу разобраться, буду признателен за любую помощь.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Victor G. Tsaregorodtsev
Эксперт
Эксперт


Зарегистрирован: 28 Июн 2005
Сообщения: 247
Откуда: Красноярск

СообщениеДобавлено: Сб Янв 08, 2011 5:25 pm    Заголовок сообщения: Ответить с цитатой

Обучение сделали попримерное (online) или по всей выборке (batch)? Если первое - то для возможности использования методов сопряженных градиентов переходите ко второму режиму обучения.

Ну и постарайтесь понять, что метод обратного распространения есть просто способ расчета градиента для отдельного примера выборки, и его желательно отделять как от способа расчета градиента по всей выборке (градиент по всей выборке будет равен сумме градиентов по отдельным примерам выборки), так и от этапа выбора направления и/или шага коррекции сети, так и от собственно этапа внесения изменений в сеть. Если в использованной Вами литературе такого четкого разделения не сделано - то она из разряда "советских газет перед обедом".
_________________
neuropro.ru - нейронные сети, анализ данных, прогнозирование
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Filipp
Новый посетитель
Новый посетитель


Зарегистрирован: 07 Янв 2011
Сообщения: 13

СообщениеДобавлено: Сб Янв 08, 2011 6:36 pm    Заголовок сообщения: Ответить с цитатой

Реализацией как раз занимаюсь в данный момент. Обучение делаю по все выборке. Интересный факт, что градиент тоже суммируется. Я предполагал, что необходимо вычислить суммарную ошибку по все выборке, и затем единожды посчитать градиент. Я это учту. То есть на правктике выходит, что я должен покоординатно складывать градиенты для каждого примера и работать уже с получившимся вектором?

Что касается остального из того, что вы сказали - разницу эту я осознал. Существуют ли другие методы, помимо обратного распространения, для вычисления градиента? На сколько они эффективны относительно него.

И еще один немаловажный вопрос. Не могу разобратсья с механизмом одномерной оптимизации после выбора направления. В литературе написано, что можно прибегать к таким методам, как Золотое сечение, Фибоначчи, или банально деление отрезка на 2 части. Суть методов мне понятна, но вот не могу сообразить как привязать это вектору весов. Везде в этих методах напрмер нужен некий начальный отрезок. Откуда он береться? То есть "ЧТО" я должен делить? И еще не маловажный вопрос: В процессе этой самой оптимизации я должен соотетсвенно считать значение функции ошибки. В этом случае, что я должен подавать на вход? Опять же всю выбору и смотреть уменьшается ли срежнее значение, или как то иначе? Также, интересует вопрос, вес связи порогового нейрона также должен пересчитываться в соответсвии с общим правилом при одномерной оптимизации? Почему то в литературе плохо разобран как раз этот этап применительно к нейронным сетям.


Последний раз редактировалось: Filipp (Вс Янв 09, 2011 12:39 am), всего редактировалось 2 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Filipp
Новый посетитель
Новый посетитель


Зарегистрирован: 07 Янв 2011
Сообщения: 13

СообщениеДобавлено: Сб Янв 08, 2011 9:22 pm    Заголовок сообщения: Ответить с цитатой

Еще поправка: если пользоваться алгоритмом обратного распространения, то мы получаем градиент в следующем виде g(w) = (dE/dw0, dE/dw1, ...), где фактическое значение производных вычисляется как произведение веса текущей связи на ошибку, передаваемую от нейрона, к которому эта свзь идет. Формулы для подсчета ошибок приводить не буду. В целом верно?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Victor G. Tsaregorodtsev
Эксперт
Эксперт


Зарегистрирован: 28 Июн 2005
Сообщения: 247
Откуда: Красноярск

СообщениеДобавлено: Вс Янв 09, 2011 7:32 pm    Заголовок сообщения: Ответить с цитатой

>То есть на правктике выходит, что я должен покоординатно складывать градиенты для каждого примера и работать уже с получившимся вектором?

Угу.

>Существуют ли другие методы, помимо обратного распространения, для вычисления градиента? На сколько они эффективны относительно него.

Существуют, совершенно неэффективны. Обратное распространение вычисляет градиент (хоть на одном примере выборки, хоть для всей выборки) за время, примерно в 2-3 раза большее, чем время вычисления самой функции. Причём вычисляет градиент точно.
Метод конечных разностей каждую компоненту градиента считает за время, в 2 раза большее времени вычисления функции, и считает неточно (дает оценку). А весь вектор градиента посчитает ой-ой-ой как долго.
Аналитическое дифференцирование "многослойной" сложной функции часто даёт для каждой частной производной выражение, сопоставимое по сложности со сложностью самой функции. И автоматизация процесса записывания-вычисления производных при изменении функции довольна сложна (в общем виде), а для нейросети это делается очень просто.
Т.е. если есть возможность представить какую-то функцию в виде графа - то это уже можно обзывать "нейросетью" и методом обратного распространения быстро считать градиент (или какие-то наборы частных производных) с полным отсутствием дублирования вычисления каких-то выражений или подвыражений.

>Везде в этих методах напрмер нужен некий начальный отрезок. Откуда он береться?

Нуль (стартовая точка отрезка) будет находиться в текущем состоянии вектора весов (для которого и считался градиент, а одновременно с этим посчиталась и суммарная ошибка нейросети, т.е. значение оптимизируемой функции). Вторая точка отрезка - это пробная коррекция вектора весов вдоль выбранного направления оптимизации на некоторый шаг (для первой эпохи - некоторый заложенный в программу по умолчанию, для последующих - можно будет брать значение оптимального шага с предыдущей эпохи). Далее, если в новой (второй) точке отрезка значение оптимизируемой функции (суммарной или средней ошибки сети) выше - значит, шаг слишком большой и надо будет его уменьшать, если ниже - то можно шагать дальше (делать пробные коррекции с бОльшим шагом) до тех пор, пока ошибка не станет расти (т.е. пока не прогарантируем, что внутри отрезка попался локальный минимум).

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

Всю выборку. Да, смотреть, уменьшается/увеличивается ли средняя или суммарная ошибка сети.

>вес связи порогового нейрона также должен пересчитываться в соответсвии с общим правилом при одномерной оптимизации?

Метод одномерной оптимизации даёт значение шага коррекции, которое надо использовать при коррекции весов синапсов сети (всей сети).
Т.е. посчитали градиент - сохраняем вектор весов синапсов сети (он будет нужен), и запускаем процедуру одномерной оптимизации. Она требует нескольких расчетов суммарной ошибки сети на разных векторах весов (полученных путём коррекции стартового для эпохи = сохранённого). Нашли оптимальный шаг - и окончательно корректируем веса сети, забывая после этого про сохранённую копию вектора весов (в новую сохранённую копию пойдет уже откорректированный вектор).
С отдельными нейронами работать не надо. Т.е. в программе-то у Вас может быть распределение весов по нейронам, но коррекции подлежат сразу все обучаемые веса сети (поэтому я и говорю про вектор весов сети, не вводя туда никакой структуры, совпадающей со структурой нейронов и/или слоев сети). Не обучать можно только "замороженные" или "упрощённые" ("контрастирование", pruning) веса сети - если стоит задача выкинуть из сети все излишние синапсы путём приравнивания их значений к нулю (тогда занулённые синапсы нельзя корректировать, чтобы они опять не обрели жизнь, получив ненулевой вес).

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

Нет. На вес текущей связи надо умножать при расчете ошибки, передаваемой на нейрон предыдущего слоя, а вот для расчета производной по весу синапса надо умножать на выход нейрона предыдущего слоя. В обоих случаях вторым сомножителем будет действительно ошибка (частная производная), прошедшая через более близкий к "концу" сети нейрон (вернее, прошедшая через его нелинейную функцию, поскольку работу с синапсами этого нейрона мы еще не закончили).
_________________
neuropro.ru - нейронные сети, анализ данных, прогнозирование
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Filipp
Новый посетитель
Новый посетитель


Зарегистрирован: 07 Янв 2011
Сообщения: 13

СообщениеДобавлено: Вс Янв 09, 2011 8:31 pm    Заголовок сообщения: Ответить с цитатой

Про градиент так и есть! Я описался просто. Все верно, сигнал на ошибку.

Огромное спасибо за исчерпывающие ответы! Вы очень помогли.Сейчас буду стараться реализовать.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Filipp
Новый посетитель
Новый посетитель


Зарегистрирован: 07 Янв 2011
Сообщения: 13

СообщениеДобавлено: Вс Янв 09, 2011 11:05 pm    Заголовок сообщения: Ответить с цитатой

Сделал алгоритм. Возникает вопрос, как его лучше потестирвоать. На тех данных, что я пробовал он показывает себя, почему - то, также или хуже чем метод наискорейшего спуска! Воможно, я где то ошибся. Я читал, что метод сопряженных градиентов плох для маленьких сетей. Сейчас это 3 слоя: 2 вход, 6 скрытых, 1 выход и 50 тестовых данных.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Victor G. Tsaregorodtsev
Эксперт
Эксперт


Зарегистрирован: 28 Июн 2005
Сообщения: 247
Откуда: Красноярск

СообщениеДобавлено: Пн Янв 10, 2011 5:37 pm    Заголовок сообщения: Ответить с цитатой

А в каких попугаях эффективность меряли?

В числе полных просмотров задачника метод сопр.град. очень часто будет проигрывать - в нём каждая "полезная" (т.е. такая, после которой происходит переход к расчету следующего градиента выборки) коррекция весов сети требует нескольких предварительных просмотров выборки для оптимизации шага.

В величине ошибки обобщения метод сопр.град. тоже может часто давать более худшие результаты (худшую ошибку обобщения). Факт этот известный, отражен в статье Lawrence S., Giles C.L. Overfitting and neural networks: Conjugate gradient and backpropagation / Proc. IJCNN’2000, Como, Italy, 2000. - pp.114-119.

Выигрыш, я считаю, только в бОльшей автоматизации процесса обучения (оптимальный шаг подбирается автоматически, а не устанавливается вручную). Время обучения небольшой сети на небольшой выборке при таком "автомате" может быть меньше, чем время обучения плюс время ручной настройки более-менее приемлемого шага (эта настройка может требовать нескольких попыток обучения сети - вот и наберутся бесполезные затраты времени). А вот для больших размеров выборки время обучения (в любом режиме) будет сильно больше времени задания ручных настроек - поэтому обычное онлайн-обучение тут начинает оказываться безальтернативным (большие выборки излишне сверхрепрезентативны, поэтому одна эпоха онлайн-обучения становится эквивалентной нескольким последовательным эпохам обучения на репрезентативных подвыборках, а вот любой алгоритм обучения по всей выборке факт избыточности выборки полезно никак не использует).
_________________
neuropro.ru - нейронные сети, анализ данных, прогнозирование
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Filipp
Новый посетитель
Новый посетитель


Зарегистрирован: 07 Янв 2011
Сообщения: 13

СообщениеДобавлено: Вт Янв 11, 2011 3:46 pm    Заголовок сообщения: Ответить с цитатой

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

В этой связи возникает аж 3 вопроса:
1) Кроме наименьших квадратов какие еще существуют способы отслеживания ошибки? Я читал, что они есть, но какие,найти не смог. В связи с этим не понятно, при изменении функции ошибки, будет ли меняться алгоритм обратного распространения? На сколько я понимаю, он зависит от вида функции (или не зависит?).
P.S Для лучшего понимание проблемы, когда мы говорим о значении функции ошибки, мы подразумеваем именно значение по методу наименьших квадратов (при использовании данного метода) т.е 0.5 * (output - desired)^2 или же суммарную ошибку выходного слоя (сигнал * производную)?
2) Какие действия можно предпринять, для уменьшения значения ошибки.
3) Какие методы оптимизации на ваш взгляд являются наиболее подходящими для больших обучающих выборок?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Victor G. Tsaregorodtsev
Эксперт
Эксперт


Зарегистрирован: 28 Июн 2005
Сообщения: 247
Откуда: Красноярск

СообщениеДобавлено: Вт Янв 11, 2011 5:39 pm    Заголовок сообщения: Ответить с цитатой

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

См. список цитированной литературы в http://www.neuropro.ru/mypapers/neurcompmag03_3.pdf
В интернете есть всё - если не оригинальные публикации, то те, которые их цитируют вплоть до воспроизведения нужных формул.

> В связи с этим не понятно, при изменении функции ошибки, будет ли меняться алгоритм обратного распространения? На сколько я понимаю, он зависит от вида функции (или не зависит?).

Не зависит и меняться не будет. Просто на выход сети надо будет подавать другие производные (соответствующие частным производным новой функции ошибки) по выходам сети, а внутри сети формулы останутся теми же самыми.

>когда мы говорим о значении функции ошибки, мы подразумеваем именно значение по методу наименьших квадратов

Именно его - если МНК и используем для обучения сети. Можно, конечно, переходить и к числу (или проценту) правильно решенных примеров (если решаем задачу классификации) - поэтому в том письме я и спросил, в каких попугаях Вы лично меряете эффективность.

>Какие действия можно предпринять, для уменьшения значения ошибки.

Ошибка на обучающей выборке должна интересовать Вас во вторую очередь. В первую очередь Вас должна интересовать ошибка на тестовой выборке (т.е. обобщающие способности сети). Ошибка на тестовой выборке (вернее, её уровень относительно ошибки обучения) служит еще и качественным индикатором репрезентативностей обучающей и тестовой выборок и качественным индикатором адекватности обученной сети.
Работ по анализу и/или улучшению возможностей сети к обобщению (generalization) масса.

>Какие методы оптимизации на ваш взгляд являются наиболее подходящими для больших обучающих выборок?

Онлайн-обучение (попримерное). Доказано ведущими собаководами Wink
_________________
neuropro.ru - нейронные сети, анализ данных, прогнозирование
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Filipp
Новый посетитель
Новый посетитель


Зарегистрирован: 07 Янв 2011
Сообщения: 13

СообщениеДобавлено: Вт Янв 11, 2011 6:42 pm    Заголовок сообщения: Ответить с цитатой

С функциями понятно - буду смотреть.
Да, именно об ошибке на тестовой выборке я и говорю. Из тех тестов, что я проводил, ошибку обучения можно свести к достаточно малым величинам. Но при этом ошибка на тестовой выборе всегда в десятки раз больше. Ну по этой теме тогда тоже еще буду копаться.

Хм, а вот по поводу online обучения не очень понятно. Я не могу уловить зависимость алгоритма и того факта, может ли он быть использован в режиме online или же только по всей выборке. Например касаемо градиентных методов: наискорейший спуск может быть использован при обучении online, а сопряженные градиенты нет. Чем это обусловлено в общем случае?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Victor G. Tsaregorodtsev
Эксперт
Эксперт


Зарегистрирован: 28 Июн 2005
Сообщения: 247
Откуда: Красноярск

СообщениеДобавлено: Ср Янв 12, 2011 5:28 pm    Заголовок сообщения: Ответить с цитатой

>Но при этом ошибка на тестовой выборе всегда в десятки раз больше. Ну по этой теме тогда тоже еще буду копаться.

Обучающая выборка недостаточного размера (нерепрезентативная со статистической точки зрения) или размер сети избыточен.

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

Не знаю, что Вы здесь называете наискорейшим спуском (учебники, к сожалению, могут этим термином называть разные вещи - и чаще всего с подбором оптимального шага, что для онлайн-обучения нейросети просто смерть).
В онлайн-режиме лучше всего обучать с постоянным (для всех примеров выборки) шагом (шаг можно адаптировать от эпохи к эпохе - но это необязательно), избыточное "внимание" на каждый отдельный пример (обучение вдоль антиградиента единственного примера до лок.минимума в этом направлении) приводит к разобучению нейросети (потере ею навыков решения других примеров).
Т.е. когда действуем путём снижения "средней температуры по больнице" (т.е. когда обучаем по суммарному градиенту) - можно учить "до упора" вдоль направления антиградиента, а также использовать более эффективные направления (направление сопряженных градиентов, например). А вот при акцентированном "лечении" отдельных примеров сеть может забывать навык решения других примеров, поэтому здесь надо корректировать сеть очень и очень осторожно (но поскольку коррекция идёт после просмотра каждого примера, вектор весов сети всё же довольно быстро двигается в наиболее вероятном направлении коррекций).
_________________
neuropro.ru - нейронные сети, анализ данных, прогнозирование
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Filipp
Новый посетитель
Новый посетитель


Зарегистрирован: 07 Янв 2011
Сообщения: 13

СообщениеДобавлено: Ср Янв 12, 2011 8:02 pm    Заголовок сообщения: Ответить с цитатой

Большое спасибо за помощь, Виктор Геннадьевич! Буду сейчас разбираться с полученными сведлениями и править баги!)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Filipp
Новый посетитель
Новый посетитель


Зарегистрирован: 07 Янв 2011
Сообщения: 13

СообщениеДобавлено: Вт Фев 08, 2011 10:04 pm    Заголовок сообщения: Ответить с цитатой

Виктор Геннадьевич и снова здравствуйте)

Разобрался с сопряженными градиентами, пошел дальше. Осваиваю метод Левенберга - Марквардта. Опять много вопросов относительно того, что прочитал. Итак попорядку:
1) Для функции невязки гессиан представляется как trans(J) * J + L * I;
2) Правильно ли я понял, что матрица Якоби J в данном случае строиться следующим образом: по строкам частные производные e/dw - где e = (y(x)-d) т.е выход минус желаемый результат, w текущий вектор весов. Всего строк - количество выходных нейронов(т.е для одного выходного нейрона Якобиан будет состоять из 1 строки??).Получается, что значение элементов в строке - есть то, что мы собираем методом обратного распространения, только не умножая на (y(x)-d), собственно как раз производные?Или я ошибаюсь? Для того чтобы получить градиент соответственно мы умножаем J на (y(x)-d);
3) Далее приравниваем к нулю производную функции ошибки(точнее ее квадратичное приближение), и получаем после преобразований следующую конструкцию:
DeltaW = (trans(J) * J + L *I)^-1 * trans(J) * (y - f(W)), где DeltaW - приращение весов на текущем шаге (здесь вопрос - это конечное приращение или направление?), L - регуляционный фактор.

По поводу выбора регуляционного фактора есть вопросы. Алгоритмом предполагается некий способ. То есть зная функцию ошибки F(L) на предыдущем шаге и на текущем мы можем вычислить L для текущего. Сразу непонятно. Откуда мы должны знать L на текущем если мы его еще только собираемся вычислить. Или изначально предполагается что он равен значению предыдущего шага? L мы вычисляем в зависимости от соотношения между значением функции ошибки на текущем и предыдущем шагах. В этих вычислениях присутствует коэффициент уменьшения. Его значение выбирается видимо как то экспериментально что ли?


Последний раз редактировалось: Filipp (Вс Фев 13, 2011 3:49 pm), всего редактировалось 3 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Filipp
Новый посетитель
Новый посетитель


Зарегистрирован: 07 Янв 2011
Сообщения: 13

СообщениеДобавлено: Ср Фев 09, 2011 9:40 pm    Заголовок сообщения: Ответить с цитатой

Еще вопрос, какую лучше функцию активации использовать? И на всех ли слоях одну. Я читал, что оптимальной является гиперболический тангенс

Последний раз редактировалось: Filipp (Вс Фев 13, 2011 4:31 pm), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
mmi
Участник форума
Участник форума


Зарегистрирован: 15 Май 2010
Сообщения: 30

СообщениеДобавлено: Чт Фев 10, 2011 6:58 pm    Заголовок сообщения: Ответить с цитатой

Filipp писал(а):
Осваиваю метод Левенберга - Марквардта.


Я реализовывал по этой работе:

Y. LeCun, L. Bottou, G. Orr, and K. Muller, "Efficient BackProp"
http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf

Отмотайте до: 9.1 A stochastic diagonal Levenberg Marquardt
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Filipp
Новый посетитель
Новый посетитель


Зарегистрирован: 07 Янв 2011
Сообщения: 13

СообщениеДобавлено: Чт Фев 10, 2011 8:47 pm    Заголовок сообщения: Ответить с цитатой

Спасибо! Посомтрю обязательно
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Filipp
Новый посетитель
Новый посетитель


Зарегистрирован: 07 Янв 2011
Сообщения: 13

СообщениеДобавлено: Вс Фев 13, 2011 12:38 am    Заголовок сообщения: Ответить с цитатой

Еще немаловажный пункт. На сколько я понял данный алгоритм позволяет осуществлять обучение как в онлайн режиме, так и по всей выборке. Это действительно так? Если да, то лучше остановиться на онлайн обучении?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
mmi
Участник форума
Участник форума


Зарегистрирован: 15 Май 2010
Сообщения: 30

СообщениеДобавлено: Вс Фев 13, 2011 12:42 am    Заголовок сообщения: Ответить с цитатой

Filipp писал(а):
Еще немаловажный пункт. На сколько я понял данный алгоритм позволяет осуществлять обучение как в онлайн режиме, так и по всей выборке. Это действительно так? Если да, то лучше остановиться на онлайн обучении?


Да, это онлайновый метод обучения.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Filipp
Новый посетитель
Новый посетитель


Зарегистрирован: 07 Янв 2011
Сообщения: 13

СообщениеДобавлено: Вс Фев 13, 2011 1:08 pm    Заголовок сообщения: Ответить с цитатой

спасибо!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов neuroproject.ru -> Нейронные сети Часовой пояс: GMT + 4
На страницу 1, 2  След.
Страница 1 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Rambler's Top100 Rambler's Top100