/// <summary>
        /// Runs the train on batch.
        /// </summary>
        /// <param name="i">The i.</param>
        /// <param name="x">The x.</param>
        /// <param name="y">The y.</param>
        private void RunTrainOnBatch(int i, SuperArray x, SuperArray y)
        {
            SuperArray pred    = Forward(x);
            SuperArray lossVal = LossFn.Forward(pred, y);
            SuperArray grad    = LossFn.Backward(pred, y).Reshape(-1, 1);

            lossVal = ApplyRegularizer(lossVal);
            var metricVal = MetricFn.Calc(pred, y);

            train_losses.Add(Ops.Mean(lossVal));
            train_metrics.Add(Ops.Mean(metricVal));

            Backward(grad);

            ApplyDeltaRegularizer();

            foreach (var layer in Layers)
            {
                OptimizerFn.Update(i, layer);
            }

            pred.Dispose();
            lossVal.Dispose();
            grad.Dispose();
        }