K-Veritas
Tutorial · TensorFlow / Keras

Keras: Fashion-MNIST

A Keras CNN on Fashion-MNIST. A one-method Keras callback forwards every metric in the training logs, so no manual metric lines are needed inside the loop.

Install

The framework, plus the K-Veritas CLI (see the Overview for install).

pip install tensorflow

train.py

The complete script. The KVERITAS_ lines are the only additions to an ordinary training script; everything else is standard TensorFlow / Keras.

import numpy as np
import tensorflow as tf

SEED = 42
tf.keras.utils.set_random_seed(SEED)
print(f"KVERITAS_INPUT src=seed:{SEED}", flush=True)

print("KVERITAS_PHASE name=data", flush=True)
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()
x_train = (x_train / 255.0).astype("float32")[..., None]
x_test = (x_test / 255.0).astype("float32")[..., None]

model = tf.keras.Sequential([
    tf.keras.layers.Input((28, 28, 1)),
    tf.keras.layers.Conv2D(32, 3, activation="relu"),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Conv2D(64, 3, activation="relu"),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation="relu"),
    tf.keras.layers.Dense(10),
])
model.compile(optimizer="adam",
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=["accuracy"])
print(f"KVERITAS_MODEL params={model.count_params()} arch=cnn precision=fp32", flush=True)
print(f"KVERITAS_WORKLOAD dataset_size={len(x_train)} epochs=5 batch_size=128", flush=True)


class KVeritas(tf.keras.callbacks.Callback):
    def on_epoch_end(self, epoch, logs=None):
        for name, value in (logs or {}).items():
            print(f"KVERITAS_METRIC name={name.replace('/', '_')} value={float(value):.4f} step={epoch}", flush=True)


print("KVERITAS_PHASE name=train", flush=True)
model.fit(x_train, y_train, validation_split=0.1, epochs=5, batch_size=128,
          verbose=2, callbacks=[KVeritas()])

print("KVERITAS_PHASE name=evaluate", flush=True)
loss, acc = model.evaluate(x_test, y_test, verbose=0)
print(f"KVERITAS_METRIC name=test_accuracy value={acc:.4f}", flush=True)
print(f"KVERITAS_CLAIM metric=test_accuracy value={acc:.4f}", flush=True)
print(f"final test_accuracy={acc:.4f}", flush=True)

Run and seal

Wrap the script, seal a signed report, and verify it offline.

kveritas init
kveritas run -- python train.py
kveritas seal --output report.pdf
kveritas verify report.pdf

What it produced here

5 epochs reached about 90.0% test accuracy. The one-method callback captured every training and validation metric.

All tutorials · The directives explained