We show an example here on a classical XOR problem.
Neural Network
We create a simple neural network with one hidden layer.
require "nn" mlp = nn.Sequential(); -- make a multi-layer perceptron inputs = 2; outputs = 1; HUs = 20; -- parameters mlp:add(nn.Linear(inputs, HUs)) mlp:add(nn.Tanh()) mlp:add(nn.Linear(HUs, outputs))
Loss function
We choose the Mean Squared Error criterion.
criterion = nn.MSECriterion()
Training
We create data on the fly and feed it to the neural network.
require "lab" for i = 1,2500 do -- random sample local input= lab.randn(2); -- normally distributed example in 2d local output= torch.Tensor(1); if input[1]*input[2] > 0 then -- calculate label for XOR function output[1] = -1 else output[1] = 1 end -- feed it to the neural network and the criterion criterion:forward(mlp:forward(input), output) -- train over this example in 3 steps -- (1) zero the accumulation of the gradients mlp:zeroGradParameters() -- (2) accumulate gradients mlp:backward(input, criterion:backward(mlp.output, output)) -- (3) update parameters with a 0.01 learning rate mlp:updateParameters(0.01) end
Test the network
x = torch.Tensor(2) x[1] = 0.5; x[2] = 0.5; print(mlp:forward(x)) x[1] = 0.5; x[2] = -0.5; print(mlp:forward(x)) x[1] = -0.5; x[2] = 0.5; print(mlp:forward(x)) x[1] = -0.5; x[2] = -0.5; print(mlp:forward(x))
You should see something like:
> x = torch.Tensor(2) > x[1] = 0.5; x[2] = 0.5; print(mlp:forward(x)) -0.6140 [torch.Tensor of dimension 1] > x[1] = 0.5; x[2] = -0.5; print(mlp:forward(x)) 0.8878 [torch.Tensor of dimension 1] > x[1] = -0.5; x[2] = 0.5; print(mlp:forward(x)) 0.8548 [torch.Tensor of dimension 1] > x[1] = -0.5; x[2] = -0.5; print(mlp:forward(x)) -0.5498 [torch.Tensor of dimension 1]