Показать сообщение отдельно
Старый 03.05.2013, 13:38
KokoZzz вне форума Посмотреть профиль Отправить личное сообщение для KokoZzz Найти все сообщения от KokoZzz
  № 1  
Ответить с цитированием
KokoZzz

Регистрация: Jan 2013
Сообщений: 18
По умолчанию Нейронная сеть на action script, не обучается

Добрый день, уважаемые!

прошу у Вас помощи, ибо 3й день я не могу найти ошибку в написанном мной алгоритме обучения нейросети, казалось бы проще уже не бывает: гомогенная нейронная сеть с биполярной сигмоидной функцией и обучением при помощи обратного распространения ошибки...

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


p.s. не нашел более подходящего раздела, ибо исходники у меня на Action Script'e

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

p.s.s.s. если честно я на панике, это часть моего диплома, защита приддипломной практики которого будет 7 числа =(

Добавлено через 19 минут
конено, у меня есть и примеры и код.
проект лежит в дроп боксе, могу дать ссылку

функция обучения сети:
Код AS1/AS2:
public function train():void{
	var iter:int = 0;
	while (iter++<1000){
 
		for (var ei:int = 0; ei < learningInputArray.length; ei++){//обход обучающих примеров
			//прямой прогон
			var output:Number = computeResult(learningInputArray[ei].inputSignalArray); 
			var realOutput:Number = learningInputArray[ei].realOutput; 
 
			for (var li:int = neuralLayerArray.length - 1; li >= 0; li--){//обход слоев сети
				var neuralLayer:NeuralLayer = neuralLayerArray[li];
 
				for (var ni:int = 0; ni < neuralLayer.neuronArray.length; ni++){// обход нейронов в сети
					var neuron:Neuron = neuralLayer.neuronArray[ni];
					var inputSignal:Signaller;
					var delta:Number = 0;
					var error:Number = 0;
 
					if (li == neuralLayerArray.length - 1){//если выходной слой:
						//расчет ошибки:
						error = output - realOutput;
					} else {//если скрытый слой:
						error = 0;
						//расчет распространения ошибки:
						var nextNeuralLayer:NeuralLayer = neuralLayerArray[li+1];
						for (var nnl:int = 0; nnl<nextNeuralLayer.neuronArray.length; nnl++){
							var learnedNeuron:Neuron = nextNeuralLayer.neuronArray[nnl];
							error += 0.5*learnedNeuron.learningError * learnedNeuron.synapticPowerArray[ni] * (1 - learnedNeuron.outputSignal*learnedNeuron.outputSignal);
						}
					}
					neuron.learningError = error;
 
					//корректировка входных весов нейрона:
					for (var spah:int = 0; spah<neuron.synapticPowerArray.length; spah++){
						inputSignal = neuron.inputSignalArray[spah];
						neuron.synapticPowerArray[spah] = neuron.synapticPowerArray[spah] - 0.5*error*(1 - neuron.outputSignal*neuron.outputSignal)*inputSignal.outputSignal;
					}
					//корректировка активационного барьера:
					neuron.activationBarrier = neuron.activationBarrier + 0.5*error*(1 - neuron.outputSignal*neuron.outputSignal)
					trace("first layer");
 
 
				}
			}
		}
 
 
	}
}
активационная функция нейрона:
Код AS1/AS2:
override public function compute(v:Number):Number{
	var e:Number = Math.E;
	return 2/(1 + Math.pow(e, (-1*v)))-1;
}
основной материал, на который я опирался: http://www.machinelearning.ru/wiki/i...LDA2011no1.pdf


Последний раз редактировалось KokoZzz; 03.05.2013 в 14:00.