func trainNetwork() {
   // Restart network values
   logs = ""
   training = true

   // Setting training values
   let epochs = 3000
   let learningRate: Float = 0.01

   eval(model!)
   let gradients = valueAndGrad(model: model, lossFunction)
   let optimizer = SGD(learningRate: learningRate)

   // Training
   for epoch in 0..<epochs {
      // Gradients
      let (lossValue, grads) = gradients(model, inputTraining, targetTraining)

      // Calculate Error
      let error: Float = lossValue.item()
      if epoch % 100 == 0 {  // Log every 100 epochs instead of 10
         logs += "Loss: \(String(format: "%.6f", error))\n"
      }
      optimizer.update(model: model, gradients: grads)
      eval(model!, optimizer)
   }
   // Testing
   var correct = 0
   let logits = model(inputTesting)
   let predictions = softmax(logits)
   let predictedLabels = argMax(predictions, axis: 1)
   let targetLabels = argMax(targetTesting, axis: 1)
   correct = (predictedLabels .== targetLabels).sum().item()
   let accuracy = Double(correct) / Double(targetTesting.shape[0]) * 100
   logs += "Final Accuracy: \(String(format: "%.2f", accuracy))%\n"
   training = false
}