GitHub_collection_pykan/tutorials/interp_10B_swap.ipynb

471 lines
433 KiB
Plaintext
Raw Normal View History

2024-08-11 13:02:16 -04:00
{
"cells": [
{
"cell_type": "markdown",
"id": "343914f4",
"metadata": {},
"source": [
2024-08-11 13:13:30 -04:00
"# Interpretability 10B: swap"
2024-08-11 13:02:16 -04:00
]
},
{
"cell_type": "markdown",
"id": "05a17f9f",
"metadata": {},
"source": [
"The multitask parity problem has 10 input bits $(x_1, x_2, \\cdots, x_{10})$, $x_i\\in\\{0,1\\}$.\n",
"\n",
"The are five output bits $y_1, \\cdots, y_5$, where $y_i = x_{2i-1} + x_{2i-1} ({\\rm mod} 2)$"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "b0ffa41a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"checkpoint directory created: ./model\n",
"saving model version 0.0\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"| train_loss: 7.19e-02 | test_loss: 7.02e-02 | reg: 1.90e+01 | : 100%|█| 5/5 [00:06<00:00, 1.21s/it"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.1\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"from kan import *\n",
"\n",
"model = KAN(width=[10,10,5], seed=5)\n",
"x = torch.normal(0,1,size=(100,2))\n",
"\n",
"#f = lambda x: torch.exp(torch.sin(torch.pi*x[:,[0]])+x[:,[1]]**2)\n",
"f = lambda x: torch.cat([x[:,[0]] + x[:,[1]], x[:,[2]] + x[:,[3]], x[:,[4]] + x[:,[5]], x[:,[6]] + x[:,[7]], x[:,[8]] + x[:,[9]]], dim=1)\n",
"dataset = create_dataset(f, n_var=10)\n",
"model.fit(dataset, steps=5, lamb=1e-2, reg_metric='edge_forward_n');\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "c33be2a1",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZcAAAFICAYAAACcDrP3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB/b0lEQVR4nO2daXAcx5Xn/9UHGmicjW6cjfskAIISJVGUKFGyveNDsuUZyxvh/TTrsB0TO/thPBEzOx/WXntiP2zM7mzMRsxueCM2QtSO9/CEbdKWJUsaH7IOijJFUqSIG42jcTfQBxpA30fVfsBmKrtQ1Rf6KID5i2CQBLqrXmVV5T/fy5cvBUmSJHA4HA6HU0B05TaAw+FwOKcPLi4cDofDKThcXDgcDodTcLi4cDgcDqfgcHHhcDgcTsHh4sLhcDicgsPFhcPhcDgFh4sLh8PhcAoOFxcOh8PhFBwuLhwOh8MpOFxcOBwOh1NwuLhwOBwOp+BwceFwOBxOweHiwuFwOJyCw8WFw+FwOAWHiwuHw+FwCg4XFw6Hw+EUHC4uHA6Hwyk4XFw4HA6HU3AM5TbgODgcDly5cgVOpxM9PT34xje+gcHBwXKbpWl4m+UHb7fc4W2WH6em3aQTypUrVySdTifp9fqUv19++eVym6ZZeJvlB2+33OFtlh+nqd0ESZKkcgtcrjgcDpw5cwaiKB75nU6nw9zcHAYGBspgmXbhbZYfvN1yh7dZfpy2djuRcy5XrlyBIAiKvxMEAS+99FKJLdI+vM3yg7db7vA2y4/T1m4nUlycTifUHC5JkuB0Oktr0AmAt1l+8HbLHd5m+XHa2u1EiktPT09ahe/p6SmtQScA3mb5wdstd3ib5cdpazc+5/KAwNssP3i75Q5vs/w4be12Ij2XwcFBvPTSS9DpdNDpDi+B/Pull146UTegVPA2yw/ebrnD2yw/Tl27lSNFrVA4HA7p61//ugRA+vrXvy45HI5ym6R5eJvlB2+33OFtlh+npd1OZFiM5aOPPsKjjz6KO3fu4JFHHim3OScC3mb5wdstd3ib5cdpaLcTGRbjcDgcjrbh4sLhcDicgsPFhcPhcDgFh4sLh8PhcAoOFxcOh8PhFBwuLhwOh8MpOFxcOBwOh1NwuLhwOBwOp+BwceFwOBxOweHiwuFwOJyCw8WFw+FwOAWHiwuHw+FwCg4XFw6Hw+EUHC4uHA6Hwyk4XFw4HA6HU3C4uHA4HA6n4HBx4XA4HE7B4eLC4XA4nILDxYXD4XA4BYeLC4fD4XAKDhcXDofD4RQcLi4cDofDKThcXDgcDodTcLi4cDgcDqfgCJIkSeU2Ih/C4TD+5m/+BtevX4fZbIZer0dDQwO+973voa+vr9zmaRLeZvnB2y13eJvlx2lqtxPpuYiiiK997WtoamrCtWvX0NTUhD/5kz/Bt7/9bXzjG9/A5uZmuU3UHLzN8oO3W+7wNsuPU9du0gnk6tWr0l/91V9JoihK8XhcAiD93d/9nSRJkuR0OqUvfOELZbZQe/A2yw/ebrnD2yw/Tlu7GcqqbHnyt3/7t/jBD36AH/7whxBFEQBw69Yt/MM//AMaGxuxu7uLZDIJvV5fZku1A2+z/ODtlju8zfLj1LVbudUtH7q6uqQf//jHktlslsxmswRAMhqNktlslp588knpa1/7mhSJRMptpqbgbZYfvN1yh7dZfpy2djuRnsu5c+cwPDyMmzdvIplM4uGHH8af//mf44//+I9RWVmJr3zlKzAajeU2U1NkarM//MM/RDAYhMlkKrepmiKbZ62ioqLcZpadSCSClZUVLC4uoq6ujrdZBiRJgtfrxerqKlZXV7G2tgaj0Xiq2u1Eistf//Vf47vf/S6uXbtGf9bW1oaxsTH87ne/w+XLl6lbKQjCke8r/ey0k6nNqqqq8B//43+kPxsdHUV7e/sD2VYs6drt7bffxqc+9akHso0ikQicTieWlpawuLiIjY0NSJKEmpoa/It/8S/wne98Bz/72c/o5x/0NguFQlhbW8Pa2hoVk1AoBABoampCV1cXvvvd756qdjuxqcjf+973sLq6ir/4i7/AD3/4Qzz99NPwer34T//pP+Ff/st/iX/+z/85uru7odPpoNfrIUlS2htzkm5avqi12dWrV/G///f/xtraGqampjA3N4dwOIz6+nqMjIxgbGwMfX19MBhO5FjkWIiiiO9///tYW1s70m7/63/9L7z22muorq4ut5lFJxKJYHl5GUtLS1haWqJiUldXh97eXvT396Ovrw9WqxU6nS7ts/bTn/4UVVVV5b6kopFMJuFyuahXsrq6Co/HAwAwm83o6upCZ2cn/Ztti9PUbidWXCRJwhtvvIEf/ehHCAQCqKiowFNPPYUvfvGLeP3117G+vo7HH38cn/3sZ2EymajIEBEhf6e7/NMmOPI2MxqNePrpp/Gtb30LZrOZfi6ZTMLpdGJ6ehpTU1PY3d2FyWTC8PAwRkdHMTw8nPL504gkSfTZEASBtpvL5YIkSfj0pz+Nxx57DK2trRgbGzt1whsOh1M8k83NTUiShPr6evT19dE/jY2NEAThyLui9n7Kn7WTjiRJ8Pv91CNZXV3FxsYGEokE9Ho92tra0NXVRf+Q9kp3vNPSbidWXAiSJCEWi8FgMNAsClEU8cEHH+DNN9+EyWTCl770JYyOjtLv6PV66HSfLPFRejHScdJFR5IkRKNR6PX6jHNTkiRhe3sbU1NTmJ6exvr6OnQ6HXp6emj4rLGxsUSWlwYiLPJOU5IkrKys4ObNm/jc5z4HQRAwOTmJyspKjI+Pn+j5qnA4nOKZEDFpaGhIEROLxZLSJpneBVEUEY/HU97Pk0w0GsX6+nrKXMnBwQEAwGKxUBHp7OyE3W7Pe9Ch1K+dNE68uKTD7/fjlVdewfT0NEZGRvDlL38ZtbW1tOPQ6XRHOpBMowo1TqLgiKKYIrLZsLe3h9nZWUxNTWFhYQHJZBKtra0YHR3F6OgoOjo6TmRbENSEhf39a6+9ho6ODpw/fx7BYBD3798HcDj5f1JCZKFQCE6nE4uLi1haWsLW1hYVExLiYsWEffazvb+s53cSEUUROzs7VERWV1exvb0NSZJgMploaIuISU1NTblN1hSnWlwIk5OT+MUvfoFwOIzPfe5zuHTpEiRJopP+JGQmJ5uX4iR7OaIoqnai2RCNRjE/P4+ZmRnMzMwgFAqhtraWCs3AwMCJChdlEhbCxMQElpaW8KUvfQl6vR7RaBQTExOIRCIYGxuDxWIpodXZEQqFsLS0hOXlZSwuLtLwnsVioULS39+fYrv82c71Ock0z6k1Dg4OUsJba2triMViEAQBra2tKWLS1NSU88DsQeOBEBfgcELyV7/6FW7cuIH29nZ89atfhd1uRzKZhCiK9EUgIbPjvFgnRXCOKy7yY62srNDwmdfrRUVFBYaGhjA6OoozZ85oelTPZhdmao+DgwO8+eabeOKJJ9DZ2QngcJ6KzE+dOXMGLS0tRbc5HcFgMCXMtbW1BQBobGw8EuaSk4+XooSWxSUej2NjYyMle2t3dxcAUFtbi+7ubiomHR0dJyoFWCs8MOJCWFtbw9WrV+FyufDUU0/hc5/7HEwmE0RRpH9IyIyEzY47giNoLaxGRuqFHoFJkoSdnR3MzMxgamoKa2trAICenh7q1dhstoKe8ziwHmy2vPXWWzAajbh8+TL9mSRJmJubg8vlQm9vL7q7uwtuqxrBYJAKydLSElwuF4BDMenv70dvb6+qmBDbWQrxPGpFXORrSlZXV7G1tQVRFGE0GmG321PCW/X19Zqw+6TzwIkLcDjKvH79On7961+juroaf/iHf0gn/CVJot4MgCNZZkrNddzRXTqK+ZAXS1zkHBwcYGZmBtPT03A4HEgkEmhubqZC09nZWbYQQz7CAgBLS0v46KOP8MUvfvFIeqjT6YTT6UR7ezsGBweLcg8DgQANcS0tLWF7exsAYLVaaYirt7cXDQ0NaY9TKC9F7bjl6KTJmhLikSitKSFC0traemInzLXOAykuhN3dXfzsZz/D3Nwczp49iy9/+cuor6+nv1c
"text/plain": [
"<Figure size 500x400 with 166 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"model.plot()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "da26aef7",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.2\n"
]
}
],
"source": [
"model.auto_swap()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "726e6b54",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 500x400 with 166 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"model.plot()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "e52d59d0",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"checkpoint directory created: ./model\n",
"saving model version 0.0\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"| train_loss: 5.15e-03 | test_loss: 5.12e-03 | reg: 1.67e+01 | : 100%|█| 20/20 [00:23<00:00, 1.20s/"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.1\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"from kan import *\n",
"\n",
"inputs = []\n",
"for i in range(2**10):\n",
" string = \"{0:b}\".format(i)\n",
" sample = [int(string[i]) for i in range(len(string))]\n",
" sample = (10 - len(sample)) * [0] + sample\n",
" inputs.append(sample)\n",
" \n",
"inputs = np.array(inputs).astype(np.float32)\n",
"labels = np.sum(inputs.reshape(2**10,5,2), axis=2) % 2\n",
"inputs = torch.tensor(inputs)\n",
"labels = torch.tensor(labels)\n",
"\n",
"\n",
"num = inputs.shape[0]\n",
"ratio = 0.8\n",
"train_num = int(num*ratio)\n",
"train_id = np.random.choice(num, train_num, replace=False)\n",
"test_id = list(set(range(num)) - set(train_id))\n",
"\n",
"dataset = {}\n",
"dataset['train_input'] = inputs[train_id]\n",
"dataset['test_input'] = inputs[test_id]\n",
"dataset['train_label'] = labels[train_id]\n",
"dataset['test_label'] = labels[test_id]\n",
"\n",
"model = KAN(width=[10,10,5], seed=5)\n",
"model.fit(dataset, steps=20, lamb=1e-3, reg_metric='edge_forward_n');"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "c133e71b",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAxoAAAJ8CAYAAAB5mtehAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAADeXklEQVR4nOzdd3Qb54Eu/AeFvffei0SRlGT1LlGNsix53RLHRXGy2Y3jxHEi7d7NnnxbcpLs3pPsvZbtON7YuV5b7nbiEquRshqpLqtRpNh7772izfcHF7McUSwAAQwAPr9zdCwPQMzLVy+AeeZtCkEQBBAREREREVmQUu4CEBERERGR82HQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii2PQICIiIiIii1PLXQBnJQgCurq6MDg4CG9vbwQFBUGhUMhdLHJCbGtkK2xrZCtsa2QrbGvWxR4NC+vt7cXLL7+MlJQUhISEICEhASEhIUhJScHLL7+M3t5euYtIToJtjWyFbY1shW2NbIVtzTYUgiAIchfCWeTm5uLRRx/F8PAwgPGUbGRMx56envj000+RnZ0tSxnJObCtka2wrZGtsK2RrbCt2Q6DhoXk5ubigQcegCAIMBgMUz5PqVRCoVDg6NGjbLxkFrY1shW2NbIVtjWyFbY122LQsIDe3l5ER0djZGRk2kZrpFQq4eHhgcbGRvj7+1u/gOQ02NbIVtjWyFbY1shW2NZsj3M0LODQoUMYHh6eVaMFAIPBgOHhYbzzzjtWLhk5G7Y1shW2NbIVtjWyFbY122OPxhwJgoCUlBRUV1fDlKpUKBRITExERUUFVzegWWFbI1thWyNbYVsjW2FbkweDxhx1dnYiJCRkTj8fFBRkwRKRs2JbI1thWyNbYVsjW2FbkweHTs3R4ODgnH5+YGDAQiUhZ8e2RrbCtka2wrZGtsK2Jg8GjTny9vae08/7+PhYqCTk7NjWyFbY1shW2NbIVtjW5MGgMUdBQUFISkoyedyeQqFAUlISAgMDrVQycjZsa2QrbGtkK2xrZCtsa/Jg0JgjhUKBH//4x2b97AsvvMCJRTRrbGtkK2xrZCtsa2QrbGvy4GRwC+C6zGQrbGtkK2xrZCtsa2QrbGu2xx4NC/D398enn34KhUIBpXL6KjXuNPnZZ5+x0ZLJ2NbIVtjWyFbY1shW2NZsj0HDQrKzs3H06FF4eHhAoVBM6mIzHvPw8MCxY8ewc+dOmUpKjo5tjWyFbY1shW2NbIVtzbYYNCwoOzsbjY2NeOmll5CYmCh5LDExES+99BKamprYaGnO2NbIVtjWyFbY1shW2NZsh3M0rEQQBERFRaGlpQURERFoamriRCKyCrY1shW2NbIVtjWyFbY162KPhpVMHP9nHOdHZA1sa2QrbGtkK2xrZCtsa9bFoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBbHoEFERERERBanlrsAzmhwcBDNzc3QaDQAAJ1OB41GA1dXV5lLRs6GbY1shW2NbIVtjWxFq9Wivb1dbGtarRbd3d3w9/eHUsl78ZbAWrSg6upq/PznP8eaNWuwcuVK9PT0QKlUoqOjA7t27cKhQ4cwMDAgdzHJCbCtka2wrZGtsK2RrfT29uLNN99EdnY2li1bhq6uLqhUKnR1dWH58uX4zne+g7y8POh0OrmL6vAUgiAIchfC0en1enz44Yf4+c9/jpGREdx///3YsWMHYmNjYTAYUFlZiePHj+PMmTNYtmwZfve732HRokVyF5scENsa2QrbGtkK2xrZ0qVLl7B//37cvn0bK1euxAMPPIDFixfD29sbvb29uH79Og4fPozKyko8/vjj+PWvf42QkBC5i+2w2KMxRwaDAa+//jp+8IMfICMjA6dOncJbb72F5ORkFBQUoLCwEBs3bsTHH3+Mv/zlL+jv78cjjzyCoqIiuYtODoZtjWyFbY1shW2NbOnEiRN49NFH0d3djXfffRc5OTl49tlnUVdXhxs3bqCzsxM/+9nPcObMGfzHf/wHjhw5gqeeegptbW1yF91xCTQnZ86cEfz9/YXHHntM6O7uFgwGgyAIgvBP//RPAgABgPDuu+8KgiAIBoNBqKurE9atWyds2LBB6OnpkbHk5GjY1shW2NbIVtjWyFbKysqEhIQEISMjQygqKhLbWlVVleDn5ycAEBISEoTu7m5BEMbbW35+vhAdHS08/fTTwujoqJzFd1js0ZiDkZER/PKXv0RYWBgOHjwIf39/KBSKKZ+vUCgQExOD3/3udygvL8d7771nw9KSI2NbI1thWyNbYVsjW9Hr9fj3f/939PT04NVXX8WiRYumbWvAeHvbsGEDfvvb3+Ivf/kLcnJybFRa58KgMQfXr1/H5cuX8cMf/hBRUVEzNlpgvOEuXboU3/zmN/H2229jeHjYBiUlR8e2RrbCtka2wrZGtlJZWYnDhw/jkUcewYYNG2bV1oDx9vbQQw9hzZo1+OMf/8jJ4Wbg8rZzcPbsWbi5uWH79u0oKSmRNMCJ4/nq6+tx+/Zt8f/9/f3x0EMP4b333kNtbS0ntdGM2NbIVtjWyFbY1shWLl68iMHBQTz66KOora3F0NCQ+FhjYyP0ej0AQKPR4M6dO/D19RUfj4yMxCOPPIJf/OIXaG1tRXR0tM3L78gYNOagrKwMoaGhcHFxwfbt29He3i4+NvED8xe/+AV+9atfif//xBNP4F/+5V+gVqtRX1/PD0maEdsa2QrbGtkK2xrZSmlpKTw9PZGYmIhnn30WFy5cEB8TBAFjY2MAgObmZuzYsUN8TKFQ4P/+3/+LzMxMDA8Po7m5mUHDRAwaZhIEAaOjo3Bzc4NKpcLo6ChGR0fv+VytVgutViv+v3HjIePPEU2HbY1shW2NbMFgMKC5uRmNjY1sa2QTIyMjUKvVcHNzw9jY2JTtxvgZOJFOp4OHh4ckkNDsMWiYSaFQIDg4GFevXoVer0dWVhZ6e3vFxysqKlBdXQ0AyMzMRGRkpPjY4sWL0dvbi7GxMQQGBtq66ORg2NbIVtjWyBoMBgNaWlpQVVWF6upq1NTUYHR0FL29vejt7WVbI6sLDQ3FyMgIent7sXr1anh5eYmPjYyM4OLFi2KgWLduHdTq8ctjhUKB2NhYtLe3Q6lUIiAgQK5fwWExaMzB8uXLcejQIbS2tuL999+XPPYv//Iv+Pd//3cAwN///d/jqaeeEh9TKBR499134e7
"text/plain": [
"<Figure size 1000x800 with 166 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"model.plot(scale=1.0)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "294d4a86",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.2\n"
]
}
],
"source": [
"model.auto_swap()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "2085e4f9",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAxoAAAJ8CAYAAAB5mtehAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAACmOElEQVR4nOzdeZBU53kv/u/pZfZ9mBlmX4BhESAWgZCEEAiJkSLHkiWMfBPnJvnLdhKnKrdS8S1nvbErv0pSubHsJNeObxLL9k0iCUuWJVmAkFi1gMQqthlgNmaH2Zee6e38/uicV2cGZujTffq853R/P1WqmhbQ/fJyuvs87/s8z6uoqqqCiIiIiIjIRC7ZAyAiIiIiouTDQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEzHQIOIiIiIiEznkT2AZKWqKgYHBzExMYGcnBwUFxdDURTZw6IkxGuNrMJrjazCa42swmstsbijYbKRkRG88MILWLZsGUpKSlBfX4+SkhIsW7YML7zwAkZGRmQPkZIErzWyCq81sgqvNbIKrzVrKKqqqrIHkSz279+P5557DlNTUwAiUbJGi46zsrLws5/9DE1NTVLGSMmB1xpZhdcaWYXXGlmF15p1GGiYZP/+/XjqqaegqirC4fC8v8/lckFRFLz11lu8eCkmvNbIKrzWyCq81sgqvNasxUDDBCMjI6iqqoLP51vwotW4XC5kZmaiq6sLBQUFiR8gJQ1ea2QVXmtkFV5rZBVea9ZjjYYJXnzxRUxNTUV10QJAOBzG1NQUfvzjHyd4ZJRseK2RVXitkVV4rZFVeK1ZjzsacVJVFcuWLUNrayuMTKWiKGhoaMDVq1fZ3YCiwmuNrMJrjazCa42swmtNDgYacbp16xZKSkri+vPFxcUmjoiSFa81sgqvNbIKrzWyCq81OZg6FaeJiYm4/vz4+LhJI6Fkx2uNrMJrjazCa42swmtNDgYaccrJyYnrz+fm5po0Ekp2vNbIKrzWyCq81sgqvNbkYKARp+LiYixZssRw3p6iKFiyZAmKiooSNDJKNrzWyCq81sgqvNbIKrzW5GCgESdFUfD1r389pj/7+7//+ywsoqjxWiOr8Fojq/BaI6vwWpODxeAmYF9msgqvNbIKrzWyCq81sgqvNetxR8MEBQUF+NnPfgZFUeByLTyl2kmTr776Ki9aMozXGlmF1xpZhdcaWYXXmvUYaJikqakJb731FjIzM6Eoym1bbNr/y8zMxC9/+Uvs2rVL0kjJ6XitkVV4rZFVeK2RVXitWYuBhomamprQ1dWF73znO2hoaJj1aw0NDfjOd76D7u5uXrQUN15rZBVea2QVXmtkFV5r1mGNRoKoqorKykr09vaivLwc3d3dLCSihOC1RlbhtUZW4bVGVuG1lljc0UgQff6fludHlAi81sgqvNbIKrzWyCq81hKLgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZmOgQYREREREZnOI3sAyWhiYgI9PT3w+/0AgGAwCL/fj7S0NMkjo2TDa42swmuNrMJrjawSCAQwMDAgrrVAIIChoSEUFBTA5eJavBk4iyZqbW3FN7/5TWzZsgWbNm3C8PAwXC4Xbt68iSeeeAIvvvgixsfHZQ+TkgCvNbIKrzWyCq81ssrIyAj+5V/+BU1NTdiwYQMGBwfhdrsxODiIjRs34rd+67dw5MgRBINB2UN1PEVVVVX2IJwuFArhP/7jP/DNb34TPp8PTz75JB5//HHU1NQgHA7j2rVrePvtt3Ho0CFs2LAB3/ve97Bq1SrZwyYH4rVGVuG1RlbhtUZW+vDDD/EHf/AHOH/+PDZt2oSnnnoKa9euRU5ODkZGRnDq1Cm88cYbuHbtGp5//nl8+9vfRklJiexhOxZ3NOIUDofxgx/8AF/96lexevVqvPvuu/i3f/s3LF26FOfOncOnn36Khx9+GC+99BJef/11jI2N4dlnn8WFCxdkD50chtcaWYXXGlmF1xpZ6cCBA3juuecwNDSEn/zkJ9i3bx++8pWvoKOjA6dPn8atW7fwjW98A4cOHcLf/u3f4s0338Sv//qvo7+/X/bQnUuluBw6dEgtKChQd+/erQ4NDanhcFhVVVX9kz/5ExWACkD9yU9+oqqqqobDYbWjo0N98MEH1a1bt6rDw8MSR05Ow2uNrMJrjazCa42s0tzcrNbX16urV69WL1y4IK6169evq/n5+SoAtb6+Xh0aGlJVNXK9HT16VK2qqlK//OUvq9PT0zKH71jc0YiDz+fDX/7lX6KsrAx///d/j4KCAiiKMu/vVxQF1dXV+N73voeWlhb89Kc/tXC05GS81sgqvNbIKrzWyCqhUAh/9Vd/heHhYfzDP/wDVq1ateC1BkSut61bt+Jv/uZv8Prrr2Pfvn0WjTa5MNCIw6lTp/DRRx/hd37nd1BZWXnXixaIXLjr1q3Dnj178KMf/QhTU1MWjJScjtcaWYXXGlmF1xpZ5dq1a3jjjTfw7LPPYuvWrVFda0DkenvmmWewZcsW/PCHP2RxeAzY3jYOhw8fRnp6Oh577DFcvnx51gWoz+fr7OzE+fPnxeOCggI888wz+OlPf4r29nYWtdFd8Vojq/BaI6vwWiOrfPDBB5iYmMBzzz2H9vZ2TE5Oil/r6upCKBQCAPj9fly8eBF5eXni1ysqKvDss8/iL/7iL9DX14eqqirLx+9kDDTi0NzcjNLSUni9Xjz22GMYGBgQv6b/wPyLv/gLfOtb3xKP/9t/+2/4sz/7M3g8HnR2dvJDku6K1xpZhdcaWYXXGlnlypUryMrKQkNDA77yla/g/fffF7+mqipmZmYAAD09PXj88cfFrymKgr/7u7/DmjVrMDU1hZ6eHgYaBjHQiJGqqpienkZ6ejrcbjemp6cxPT19x98bCAQQCATEY+3gIe3PES2E1xpZhdcaWYXXGlnJ5/PB4/EgPT0dMzMz81432nWpFwwGkZmZOSsgoegx0IiRoihYtGgRTp48iVAohB07dmBkZET8+tWrV9Ha2goAWLNmDSoqKsSvrV27FiMjI5iZmUFRUZHVQyeH4bVGVuG1RlbhtUZWKi0thc/nw8jICO6//35kZ2eLX/P5fPjggw9EQPHggw/C44ncHiuKgpqaGgwMDMDlcqGwsFDWX8G5JHa8crwf/vCHamZmpnr06FE1GAzO+u+b3/ymaM334osvzvq1UCik/uhHP1IXL16
"text/plain": [
"<Figure size 1000x800 with 166 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"model.plot(scale=1.0)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "008ec601",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"| train_loss: 4.24e-03 | test_loss: 4.40e-03 | reg: 5.42e+01 | : 100%|█| 100/100 [00:04<00:00, 21.93\n"
]
}
],
"source": [
"# MLP\n",
"from kan import *\n",
"from kan.MLP import MLP\n",
"\n",
"inputs = []\n",
"for i in range(2**10):\n",
" string = \"{0:b}\".format(i)\n",
" sample = [int(string[i]) for i in range(len(string))]\n",
" sample = (10 - len(sample)) * [0] + sample\n",
" inputs.append(sample)\n",
" \n",
"inputs = np.array(inputs).astype(np.float32)\n",
"labels = np.sum(inputs.reshape(2**10,5,2), axis=2) % 2\n",
"inputs = torch.tensor(inputs)\n",
"labels = torch.tensor(labels)\n",
"\n",
"\n",
"num = inputs.shape[0]\n",
"ratio = 0.8\n",
"train_num = int(num*ratio)\n",
"train_id = np.random.choice(num, train_num, replace=False)\n",
"test_id = list(set(range(num)) - set(train_id))\n",
"\n",
"dataset = {}\n",
"dataset['train_input'] = inputs[train_id]\n",
"dataset['test_input'] = inputs[test_id]\n",
"dataset['train_label'] = labels[train_id]\n",
"dataset['test_label'] = labels[test_id]\n",
"\n",
"model = MLP(width=[10,20,5], seed=5)\n",
"model.fit(dataset, steps=100, lamb=2e-4, reg_metric='w');"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "c73085a7",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 450x450 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"model.plot(scale=1.5)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "006462be",
"metadata": {},
"outputs": [],
"source": [
"model.auto_swap()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "fab579a4",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAFuCAYAAACYxUPUAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB54klEQVR4nO29aZRc13Ue+lX1PFRjbEw9oOcBHEACnInmCIkSKdqiKAKUKBKMYz06ceQXx3FeHL+3spzkLSd5zmS/RFbi2DLRGmhaepJFUaEIgPNMgJPIHjE35rGrCj13nfdj16m6desO587ndt1vLS4J3VW3Tu865zv7fHufvWOMMYYIESJEiBA6xIMeQIQIESJEsIeIwCNEiBAhpIgIPEKECBFCiojAI0SIECGkiAg8QoQIEUKKiMAjRIgQIaSICDxChAgRQoqIwCNEiBAhpIgIPEKECBFCiojAI0SIECGkiAg8QoQIEUKKiMAjRIgQIaSICDxChAgRQoqIwCNEiBAhpIgIPEKECBFCiojAI0SIECGkiAg8QoQIEUKKiMAjRIgQIaSICDxChAgRQoqIwCNEiBAhpAg1gWcyGQwODmJgYAAtLS0YGBjA4OAgMplM0EPzHZEt8ohskUdki0IsOXuwkGJxcZHt2LGDAWDxeLzgf3fs2MEWFxeDHqJviGyRR2SLPCJbFGIp2iO0BL57924GQPe/wcHBoIfoGyJb5BHZIo/IFoVYivYIrYTyne98B/E4Df8GxPAvUJP7XTwex3e+852ghuY7lLZYD+Apxe9K2RYrsRK/ha/mflfKtqhADa7F47nflZotAKU94gD+OYCy3O/Cao/QEviRI0dyutU/RA2+jB4AywGQznXkyJHAxuY3lLb4BoD/oPhdKdviPlyFb+HT3O9K2RZlaMG/w1mUZ39XarYAlPaoBPDHAOpzvwurPUJL4G1tbTnvogVTaMc4gBYAqxGPx9HW1hbk8HyF0ha3Abig+F0p26Id1YgjgzXZ35WyLWZQhotYiQ2oAFB6tgCU9qgHqSaFp/Yw2iO0BP7UU0/lvIs1AOpwBcAogLXIZNbhqaeeMnr7koLSFlsBnFD8LpPJlKwtelCGg+hAV3aal7ItgFocQwtaUQug9GwBKO3RAID/LyG09ghahLcLZUT5JMCmARaLxRlQzr74xd9lBw8uskwm6FH6A26L9QCbAdgziuj6zp07QxldtwtuiwTAnsWX2X/Gt9iTqCtpWwBgsdg97B/gT9ljWFOStmBMaY/NDJhlwNbQr5PQEjhj9IUMPv00mwfYPMC23T7ABgcH2dzcIhsdZWxsjLGFhaBH6Q8WFxfZG7/1W+xwTQ37Xl0dGxggW4RxUjrF4uIi2/d7v8f+R+xJ9o/wH9n/XN9X0rYYHBxkmzb9AfsS/pb96fqtJWsLxsge/+f/+UsWj0+zxsadoV8nMcYYC/IE4BiHDwN9fcDiIjKXJhFP1AEAGAOOHAFmZ4HOTqCiIthh+oInngDOnAGuuQb4kz8JejTB4lvfwp/91xheqb4Pf3Hnbiz/xQ+DHlGg2L0b+O+//RGeufvPseGn3w56OIHiueeAxx8H/uqvgC9/OejROENoNfAchoaA5cuBykrE0inw7SgWA9rbgUQCGB0lIl/SYAzYswdYt47+6FLHCy8gVdWI4zW9KD88FvRoAkcqBZytbkXZqQkg5D6bU6RSQFUV/W/YsTQIvLaW/tP4RpqagMZGYGQEuHIlgPH5haEhYHERqKwEGhrMX7+UcfIkcPw4ko0duJBoQ3zyEpBMBj2qQJFMAvN1yzGHCjqllTCSSaKLpTAllgaBV1YCNTWIpZKazsWaNUBLCzA+vjS+NE3s2QPcey9tYqXuge/bB7S2ItnQgqq6cqRXbQTGStsLT6WA2roYLidagWPHgh5OoIgIXCYMDQFlZURaBmeiFSuAjg7SxS9c0H1ZeLFnD7B9O9mg1D3wPXuARAKpmjWorwcureoGDh4MelSBIpUC6uuB87WtwPHjQQ8nUHBbRBJK0GAsLx00NACpFGIxfYkvkQC6u+mEffq0v0P1FPPzwMsvE4Enk6VN4IwBe/cC09NIVqxCQwNwbnkXHb9KGHxanKmKPHBui8gDDxrnzgEzMxShVHjgRjGamhqgtxe4eJEckSURz3nvPQpetrZGEsrwMDA3Bxw7hlSsAQ0NwOm6rkhCyR7MTlVEBM5tEXngQWNoiNg4mSSNJJlELGb+tspKoKcHmJqiLMSwlgLO4cUXyfsGIg98zx7glluAWAypuUqsWAEcr+6OPPDsEjmGLIEvCc/FHhR0EXosDQJPpYBVqwq+EbP5WV5OcgpjtLYXFjweq5fg+jcQEfiePZT439eHZDKGlSuBo2UdwMRECeSS6iOZBFauBE7MryE7TE4GPaTAwG0REXjQGBoCurrIhV65EkinAUDICweAeJwCm9XVlCs+N+fhWL1CKkUSyt135/9dqhLK/Dzwyiu0gfX3I5WiaXFhpg5YuxY4dCjoEQaGnI+TjgPNzSUto3BbRBJK0BgaIt23vr4gKmEUyFQjFqNHrFhBueLT0x6O1wu8+iqweTP9AbOztAuVKoHzWMDp00B/P5JJSiFNJkEbfQnLKMkk3YdIJkETvoQJvMAWIUf4CXz9eiJvh2Hl9evpv7GxkO3MavmkurpE6gZoYO9eyoUfGsJCzyZMT9NCTaUQEXhE4Dkkk3Qgiwg8SKRSwKlTdBZKJIrywK144RyrVwMbN9JJ+9Ill8frFZQEXuo54Hv3ki2Gh5Fq2YSKCpJQUilQwKNECTyTIXVx3bqsLVpLOxc8laKTWagcNR2El8BHRkjAnp3Ne+AufCPLlpGzdvw4cPasC+P0EqdP0wWVW2+lf5dyADOdBt59l+Sky5eRXNmGhgb6PktdQkmnKd6T8zpL2ANnjGywYQPZJewZaOEl8KEhoL8/f61KdbXKjgfOUVdHaYZnzwInTpi/PjDs3QsMDJBsAtDMLFX9+7XXgGuvpVNZdzdS0+W5g1k6DSLwgwfp0leJgce1ucrINjTRRYjQBXycY3qaSHvNGtrUsnkPoUX4CZx7nS5fraquzqeYHzkiadqsMv8bKG0J5cUXc/o3D2A2NBBxJZMgqa2ujtIJSwzcFvX1RF7TCxWkp5SgjJJM0jQoL1fMjRAj3ATe12dI4E68cIBigT09lJ0mnfPGy8cqCbyUJRSuf2cJnO9liQQl5szOomRlFD4tysqIxJNJUHW3EpRRlEtkKVynDzeBcwml4KzsLsrKaN2XlVGGyvy86x9hDyMjxEqbN+d/Vqo54MpYQHZj58paRQWdpnKZKCV4pV45LXKx/hLVwTVtEWKEk8Dn5mjBKj1w/m0oohJOPXDlc3hzCM6bgYOXj40rvsJS9cD37QO2bSOmVkkogGKhlrgHDii8zhIl8MgDlwHj4xSF4CkGDQ0kbMVinkYlmproY6VoDqGWT4DSDWJyW0xNka7b21tgipzWWcIEXmSLiMAjAg8MXD4B8meiWExTRnHLC+dQNocIrJzEwgLw0kvFBF6KQUxePvbee6keQksLUFtbYIpchinPBZcyIu0dNG3R0kIZO6EuAmQdkYQiA5QErj4ra2ypbq9X3hzi6NGAmkO8/z5dq2trK/x5KUooo6OUG7Z5c8G8UHtaqRQo+Xd+Hjh/PrjxBgBNr7OujnrJnjwZ5NB8R+SBy4Dh4WIPHNDcUkULW1lFoM0htOQToDQllL17gXvuoViAgsCV0yJ3RYBXLyuxQGY6rSGhACUpo0QeuAxQSygCW6oXp+bAmkOo8785SlFCUdrCwAPPTYsSvFKv3NcLLiyXIIFHHnjQyGTIA+/ro3/rzs48vPLCgQCaQ6TTwDvv5MvHKlFqEsrCArWSu/de+reZhAKUZCBTl7RKMBc8IvCgcfw4JfeuW0f/1jwrF8NL79jX5hCvvQZccw3dLFSj1PLAeSygvZ2MPjaW29iVskHBtCjBXHBd2aAEPfBIQgka3MvibrXAluqlB87hW3MIPf0bKD0PnGefAFRCctmy3MamPpjlpkXkgRdq4EumMawYIg88aCj1b14nU+AbcTudUO8
"text/plain": [
"<Figure size 450x450 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"model.plot(scale=1.5)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "7ffe525c",
"metadata": {},
"outputs": [],
"source": [
"model.auto_swap()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "012fa5c8",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 450x450 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"model.plot(scale=1.5)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "bb0b4b52",
"metadata": {},
"outputs": [],
"source": [
"model.auto_swap()"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "637f6b32",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 450x450 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"model.plot(scale=1.5)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "19f4657f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor(-11.2142)"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.connection_cost"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "27ffab62",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.7"
}
},
"nbformat": 4,
"nbformat_minor": 5
}