Backprop

Váš prehliadač nepodporuje element canvas.

Priklad výsledku

Program


// prejde cez vsetky iteracie
for(var k=0; k < max_iterations; k++)
{
	educate();
}

// sigmoidalna funkcia
function getOut(a)
	{
		return 1 / (1 + Math.exp(- a));
	}

	// prejde cez vsetky vstupy
function educate()
{
	for(i = 0; i < num_nets; i++)
	{
		// normalizacia vstupov
		var x = getOut(10 * (nets[i].x / 500) - 5);
		var y = getOut(10 * (nets[i].y / 500) - 5);
		var z = nets[i].z;

		// ziska vystup
		var out = getOutput(x, y);

		// ak je nespravny vystup, tak zmen vahy
		if(!(out[0] < 0.1 && out[1] > 0.9 && z == 0) && !(out[0] > 0.9 && out[1] < 0.1 && z == 1))
			changeWeights(out, x, y, z);
	}
}

// zmena vah
function changeWeights(out, x, y, z)
{
	var error = new Array(2);

	// error nz vystupe
	error[0] = out[0] * (1 - out[0]) * (z - out[0]);
	error[1] = out[1] * (1 - out[1]) * (((z == 0) ? 1 : 0) - out[1]);

	// error pre 2. skrytu vrstvu
	for(var j=0; j < num_hidden_2 + 1; j++)
	{
		var sum = 0;
		for(var k=0; k < num_outputs; k++)
		{
			sum += error[k] * w_o[j][k];
		}

		h_err_2[j] = sum * (1 - h_out_2[j]) * h_out_2[j];
	}

	// error pre 1. skrytu vrstvu
	for(var j=0; j < num_hidden_1 + 1; j++)
	{
		var sum = 0;
		for(var k=0; k < num_hidden_2; k++)
		{
			sum += h_err_2[k] * w_h_2[j][k];
		}

		h_err_1[j] = sum * (1 - h_out_1[j]) * h_out_1[j];
	}

	// zmena vah medzi 2. skrytou vrstvou a vystupom
	for(var k=0; k < num_outputs; k++)
	{
		for(var j=0; j < num_hidden_2 + 1; j++)
		{
			w_o[j][k] += learning_rate * error[k] * h_out_2[j];
		}
	}

	// zmena vah medzi 1. a 2. skrytou vrstvou
	for(var k=0; k < num_hidden_2; k++)
	{
		for(var j=0; j < num_hidden_1 + 1; j++)
		{
			w_h_2[j][k] += learning_rate * h_err_2[k] * h_out_1[j];
		}
	}

	// zmena vah medzi vstupom a 1. skrytou vrstvou
	for(var k=0; k < num_hidden_1; k++)
	{
		w_h_1[0][k] += learning_rate * h_err_1[k] * x;
		w_h_1[1][k] += learning_rate * h_err_1[k] * y;
		w_h_1[2][k] += learning_rate * h_err_1[k] * in_bias;
	}
}

// vypocita vystup
function getOutput(x, y)
{
	var out = new Array(2);

	// vystupy pre 1. skrytu vrstvu
	for(var j=0; j < num_hidden_1; j++)
	{
		h_out_1[j] = getOut(w_h_1[0][j] * x + w_h_1[1][j] * y + w_h_1[2][j] * in_bias);
	}

	// vystupy pre 2. skrytu vrstvu
	for(var k=0; k < num_hidden_2; k++)
	{
		var sum = 0;
		for(var j=0; j < num_hidden_1 + 1; j++)
		{
			sum += h_out_1[j] * w_h_2[j][k];
		}
		
		h_out_2[k] = getOut(sum);
	}

	// vystup
	for(var k=0; k < num_outputs; k++)
	{
		var sum = 0;
		for(var j=0; j < num_hidden_2 + 1; j++)
		{
			sum += h_out_2[j] * w_o[j][k];
		}

		out[k] = getOut(sum);
	}

	return out;
}