Upload app.py
Browse files
app.py
CHANGED
|
@@ -114,12 +114,15 @@ class SKAModel(nn.Module):
|
|
| 114 |
self.output_history = []
|
| 115 |
|
| 116 |
|
| 117 |
-
def get_mnist_per_class(samples_per_class):
|
| 118 |
"""Select N samples per class from MNIST, return dict of {digit: images}."""
|
| 119 |
targets = mnist_dataset.targets.numpy()
|
|
|
|
| 120 |
digit_images = {}
|
| 121 |
for digit in range(10):
|
| 122 |
-
|
|
|
|
|
|
|
| 123 |
images_list = []
|
| 124 |
for idx in indices:
|
| 125 |
img, _ = mnist_dataset[idx]
|
|
@@ -128,7 +131,7 @@ def get_mnist_per_class(samples_per_class):
|
|
| 128 |
return digit_images
|
| 129 |
|
| 130 |
|
| 131 |
-
def run_ska_per_class(neurons_str, K, tau, samples_per_class):
|
| 132 |
# Parse layer sizes
|
| 133 |
try:
|
| 134 |
layer_sizes = [int(x.strip()) for x in neurons_str.split(",")]
|
|
@@ -137,10 +140,11 @@ def run_ska_per_class(neurons_str, K, tau, samples_per_class):
|
|
| 137 |
|
| 138 |
K = int(K)
|
| 139 |
samples_per_class = int(samples_per_class)
|
|
|
|
| 140 |
learning_rate = tau / K
|
| 141 |
|
| 142 |
# Get data per class
|
| 143 |
-
digit_images = get_mnist_per_class(samples_per_class)
|
| 144 |
|
| 145 |
# Run SKA separately for each digit
|
| 146 |
all_entropy_histories = {}
|
|
@@ -197,6 +201,7 @@ with gr.Blocks(title="SKA Per-Class Entropy Explorer") as demo:
|
|
| 197 |
k_slider = gr.Slider(1, 200, value=50, step=1, label="K (forward steps)")
|
| 198 |
tau_slider = gr.Slider(0.25, 0.75, value=0.5, step=0.01, label="Learning budget τ (τ = η.K)")
|
| 199 |
samples_slider = gr.Slider(1, 100, value=100, step=1, label="Samples per class")
|
|
|
|
| 200 |
run_btn = gr.Button("Run SKA Per-Class", variant="primary")
|
| 201 |
|
| 202 |
gr.Markdown("---")
|
|
@@ -218,7 +223,7 @@ with gr.Blocks(title="SKA Per-Class Entropy Explorer") as demo:
|
|
| 218 |
|
| 219 |
run_btn.click(
|
| 220 |
fn=run_ska_per_class,
|
| 221 |
-
inputs=[neurons_input, k_slider, tau_slider, samples_slider],
|
| 222 |
outputs=[plot_entropy],
|
| 223 |
)
|
| 224 |
|
|
|
|
| 114 |
self.output_history = []
|
| 115 |
|
| 116 |
|
| 117 |
+
def get_mnist_per_class(samples_per_class, data_seed=0):
|
| 118 |
"""Select N samples per class from MNIST, return dict of {digit: images}."""
|
| 119 |
targets = mnist_dataset.targets.numpy()
|
| 120 |
+
rng = np.random.RandomState(data_seed)
|
| 121 |
digit_images = {}
|
| 122 |
for digit in range(10):
|
| 123 |
+
all_indices = np.where(targets == digit)[0]
|
| 124 |
+
rng.shuffle(all_indices)
|
| 125 |
+
indices = all_indices[:samples_per_class]
|
| 126 |
images_list = []
|
| 127 |
for idx in indices:
|
| 128 |
img, _ = mnist_dataset[idx]
|
|
|
|
| 131 |
return digit_images
|
| 132 |
|
| 133 |
|
| 134 |
+
def run_ska_per_class(neurons_str, K, tau, samples_per_class, data_seed):
|
| 135 |
# Parse layer sizes
|
| 136 |
try:
|
| 137 |
layer_sizes = [int(x.strip()) for x in neurons_str.split(",")]
|
|
|
|
| 140 |
|
| 141 |
K = int(K)
|
| 142 |
samples_per_class = int(samples_per_class)
|
| 143 |
+
data_seed = int(data_seed)
|
| 144 |
learning_rate = tau / K
|
| 145 |
|
| 146 |
# Get data per class
|
| 147 |
+
digit_images = get_mnist_per_class(samples_per_class, data_seed)
|
| 148 |
|
| 149 |
# Run SKA separately for each digit
|
| 150 |
all_entropy_histories = {}
|
|
|
|
| 201 |
k_slider = gr.Slider(1, 200, value=50, step=1, label="K (forward steps)")
|
| 202 |
tau_slider = gr.Slider(0.25, 0.75, value=0.5, step=0.01, label="Learning budget τ (τ = η.K)")
|
| 203 |
samples_slider = gr.Slider(1, 100, value=100, step=1, label="Samples per class")
|
| 204 |
+
seed_slider = gr.Slider(0, 99, value=0, step=1, label="Data seed (shuffle samples)")
|
| 205 |
run_btn = gr.Button("Run SKA Per-Class", variant="primary")
|
| 206 |
|
| 207 |
gr.Markdown("---")
|
|
|
|
| 223 |
|
| 224 |
run_btn.click(
|
| 225 |
fn=run_ska_per_class,
|
| 226 |
+
inputs=[neurons_input, k_slider, tau_slider, samples_slider, seed_slider],
|
| 227 |
outputs=[plot_entropy],
|
| 228 |
)
|
| 229 |
|