private void Step(Item sample) { var x = sample.Volume; var y = sample.Label; // pego o rótulo e a imagem if (sample.IsValidation) // vejo se é de validação ou treino { // a estimação do erro é feita com os dados de entrada 'x' e a previsão boa ou ruim é 'valAcc' net.Forward(x); var yhat = net.GetPrediction(); var valAcc = yhat == y ? 1.0 : 0.0; valAccWindow.Add(valAcc); return; } trainer.Train(x, y); var lossx = trainer.CostLoss; var lossw = trainer.L2DecayLoss; // erro e a função perda var prediction = net.GetPrediction(); var trainAcc = prediction == y ? 1.0 : 0.0; xLossWindow.Add(lossx); wLossWindow.Add(lossw); trainAccWindow.Add(trainAcc); if (stepCount % 200 == 0) { if (xLossWindow.Count == xLossWindow.Capacity) { var xa = xLossWindow.Items.Average(); var xw = wLossWindow.Items.Average(); var loss = xa + xw; Console.WriteLine("Perda: {0} precisão no treiono: {1}% precisão do teste: {2}%", loss, Math.Round(trainAccWindow.Items.Average() * 100.0, 2), Math.Round(valAccWindow.Items.Average() * 100.0, 2)); Console.WriteLine("{0} exemplos vistos. tempo pro fwd: {1}ms tempo pro bckw: {2}ms", stepCount, Math.Round(trainer.ForwardTime.TotalMilliseconds, 2), Math.Round(trainer.BackwardTime.TotalMilliseconds, 2)); // AQUI, salvo A REDE ATUAl, POSSO ESCOLHER MAIS TARDE qual usar // a melhor rede atual está salva com o nome de 'best' na pasta debug File.WriteAllText("rede" + stepCount.ToString(), SerializationExtensions.ToJSON(net)); } } if (stepCount % 1000 == 0) { TestPredict(); } stepCount++; }