train_loss = 0
    train_acc = 0
    eval_acc = 0

    for data, label in train_data:
        data = data.as_in_context(mx_ctx)
        label = label.as_in_context(mx_ctx)
        with autograd.record():
            output = net(data)
            loss = loss_fn(output, label)
        loss.backward()
        trainer.step(batch_size=BATCH_SIZE)
        train_loss += loss.mean().asscalar()
        train_acc += acc(output, label)

    for data, label in eval_data:
        data = data.as_in_context(mx_ctx)
        label = label.as_in_context(mx_ctx)
        eval_acc += acc(net(data), label)

    print("epoch {}, loss {:0.3f}, acc {:0.3f}, val_acc {:0.3f}".format(
        epoch, train_loss / len(train_data), train_acc / len(train_data),
        eval_acc / len(eval_data)))

print("Elapsed time {:02f} seconds".format(time.time() - t0))

# %%
# -- Save parameters

net.save_parameters('fashion_mnist_gluon.params')
        train_loss /= len(train_data)
        eval_loss /= len(eval_data)
        _, train_acc = train_metric.get()
        _, eval_acc = eval_metric.get()

        img_per_sec = len(mnist_train) / chrono_epoch
        print(
            f"{len(mnist_train)}, epoch {epoch}, train_loss {train_loss:0.3f}, acc {train_acc:0.3f}, val_loss: {eval_loss:0.3f}, val_acc {eval_acc:0.3f}, lr: {trainer.learning_rate}, img/sec: {img_per_sec:0.2f}, chrono: {chrono_epoch:0.2f}"
        )

        # Add some values to mxboard
        sw.add_scalar("Accuracy", ("train_acc", train_acc), global_step=epoch)
        sw.add_scalar("Accuracy", ("val_acc", eval_acc), global_step=epoch)
        for key, param in net.collect_params(".*weight").items():
            sw.add_histogram(f"grad_{param.name}",
                             param.grad(ctx=mx_ctx[0]),
                             global_step=epoch)

        # Save parameters if they are better than the previous epoch
        if eval_acc > prev_val_acc:
            net.save_parameters(f"{param_file_prefix}-{epoch:04d}.params")
            prev_val_acc = eval_acc

print("=== Total training time: {:02f} seconds".format(time.time() - t0))

# %%
# -- Save parameters

net.save_parameters(f"{param_file_prefix}-final.params")