917 lines
60 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "747ddcf2",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/zenon/.local/share/miniconda3/lib/python3.7/site-packages/requests/__init__.py:104: RequestsDependencyWarning: urllib3 (1.26.13) or chardet (5.1.0)/charset_normalizer (2.0.4) doesn't match a supported version!\n",
" RequestsDependencyWarning)\n",
"\u001b[34m\u001b[1mwandb\u001b[0m: Currently logged in as: \u001b[33me1527193\u001b[0m (\u001b[33mflower-classification\u001b[0m). Use \u001b[1m`wandb login --relogin`\u001b[0m to force relogin\n"
]
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import os\n",
"import time\n",
"import random\n",
"import wandb\n",
"import torch\n",
"wandb.login()\n",
"\n",
"from evaluation.helpers import set_size\n",
"\n",
"torch.manual_seed(42)\n",
"np.random.seed(42)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "76cc2ca7",
"metadata": {},
"outputs": [],
"source": [
"api = wandb.Api()\n",
"\n",
"# Project is specified by <entity/project-name>\n",
"runs = api.runs(\"flower-classification/pytorch-sweeps-demo\")\n",
"\n",
"summary_list, config_list, name_list = [], [], []\n",
"for run in runs: \n",
" # .summary contains the output keys/values for metrics like accuracy.\n",
" # We call ._json_dict to omit large files \n",
" summary_list.append(run.summary._json_dict)\n",
"\n",
" # .config contains the hyperparameters.\n",
" # We remove special values that start with _.\n",
" config_list.append(\n",
" {k: v for k,v in run.config.items()\n",
" if not k.startswith('_')})\n",
"\n",
" # .name is the human-readable name of the run.\n",
" name_list.append(run.name)\n",
"\n",
"runs_df = pd.DataFrame({\n",
" \"summary\": summary_list,\n",
" \"config\": config_list,\n",
" \"name\": name_list\n",
" })\n",
"\n",
"runs_df.to_csv(\"hyp-metrics.csv\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "353f9082",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Unnamed: 0</th>\n",
" <th>name</th>\n",
" <th>test/epoch_loss</th>\n",
" <th>train/epoch_acc</th>\n",
" <th>train/batch_loss</th>\n",
" <th>epoch</th>\n",
" <th>_timestamp</th>\n",
" <th>test/recall</th>\n",
" <th>test/precision</th>\n",
" <th>_step</th>\n",
" <th>...</th>\n",
" <th>test/batch_loss</th>\n",
" <th>eps</th>\n",
" <th>gamma</th>\n",
" <th>epochs</th>\n",
" <th>beta_one</th>\n",
" <th>beta_two</th>\n",
" <th>optimizer</th>\n",
" <th>step_size</th>\n",
" <th>batch_size</th>\n",
" <th>learning_rate</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>fiery-sweep-26</td>\n",
" <td>0.566462</td>\n",
" <td>0.823096</td>\n",
" <td>0.335779</td>\n",
" <td>9</td>\n",
" <td>1.680693e+09</td>\n",
" <td>0.617021</td>\n",
" <td>0.828571</td>\n",
" <td>2059</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>1.000000e-01</td>\n",
" <td>0.1</td>\n",
" <td>10</td>\n",
" <td>0.99</td>\n",
" <td>0.900</td>\n",
" <td>adam</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>0.0003</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>radiant-sweep-25</td>\n",
" <td>0.645458</td>\n",
" <td>0.712531</td>\n",
" <td>0.70145</td>\n",
" <td>9</td>\n",
" <td>1.680693e+09</td>\n",
" <td>0.822222</td>\n",
" <td>0.685185</td>\n",
" <td>1039</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>1.000000e+00</td>\n",
" <td>0.5</td>\n",
" <td>10</td>\n",
" <td>0.99</td>\n",
" <td>0.900</td>\n",
" <td>adam</td>\n",
" <td>2</td>\n",
" <td>8</td>\n",
" <td>0.0003</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>blooming-sweep-24</td>\n",
" <td>0.348129</td>\n",
" <td>0.998771</td>\n",
" <td>0.019566</td>\n",
" <td>9</td>\n",
" <td>1.680692e+09</td>\n",
" <td>0.783784</td>\n",
" <td>0.935484</td>\n",
" <td>1039</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>1.000000e-08</td>\n",
" <td>0.5</td>\n",
" <td>10</td>\n",
" <td>0.90</td>\n",
" <td>0.999</td>\n",
" <td>sgd</td>\n",
" <td>5</td>\n",
" <td>8</td>\n",
" <td>0.0030</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>visionary-sweep-23</td>\n",
" <td>0.555318</td>\n",
" <td>0.835381</td>\n",
" <td>0.522233</td>\n",
" <td>9</td>\n",
" <td>1.680692e+09</td>\n",
" <td>0.833333</td>\n",
" <td>0.760870</td>\n",
" <td>529</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>1.000000e+00</td>\n",
" <td>0.1</td>\n",
" <td>10</td>\n",
" <td>0.90</td>\n",
" <td>0.900</td>\n",
" <td>sgd</td>\n",
" <td>2</td>\n",
" <td>16</td>\n",
" <td>0.0003</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>ancient-sweep-22</td>\n",
" <td>1.560271</td>\n",
" <td>0.557740</td>\n",
" <td>0.508366</td>\n",
" <td>1</td>\n",
" <td>1.680692e+09</td>\n",
" <td>0.884615</td>\n",
" <td>0.589744</td>\n",
" <td>410</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>1.000000e-08</td>\n",
" <td>0.5</td>\n",
" <td>10</td>\n",
" <td>0.90</td>\n",
" <td>0.990</td>\n",
" <td>adam</td>\n",
" <td>7</td>\n",
" <td>4</td>\n",
" <td>0.0100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>133</th>\n",
" <td>133</td>\n",
" <td>different-sweep-5</td>\n",
" <td>0.493642</td>\n",
" <td>0.821867</td>\n",
" <td>0.443422</td>\n",
" <td>9</td>\n",
" <td>1.678732e+09</td>\n",
" <td>0.714286</td>\n",
" <td>0.945946</td>\n",
" <td>1159</td>\n",
" <td>...</td>\n",
" <td>0.506896</td>\n",
" <td>NaN</td>\n",
" <td>0.5</td>\n",
" <td>10</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>sgd</td>\n",
" <td>3</td>\n",
" <td>8</td>\n",
" <td>0.0001</td>\n",
" </tr>\n",
" <tr>\n",
" <th>134</th>\n",
" <td>134</td>\n",
" <td>wise-sweep-4</td>\n",
" <td>0.548264</td>\n",
" <td>0.812039</td>\n",
" <td>0.565593</td>\n",
" <td>9</td>\n",
" <td>1.678731e+09</td>\n",
" <td>0.846154</td>\n",
" <td>0.825000</td>\n",
" <td>1159</td>\n",
" <td>...</td>\n",
" <td>0.515937</td>\n",
" <td>NaN</td>\n",
" <td>0.5</td>\n",
" <td>10</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>sgd</td>\n",
" <td>2</td>\n",
" <td>8</td>\n",
" <td>0.0001</td>\n",
" </tr>\n",
" <tr>\n",
" <th>135</th>\n",
" <td>135</td>\n",
" <td>misty-sweep-3</td>\n",
" <td>0.241948</td>\n",
" <td>0.996314</td>\n",
" <td>0.004703</td>\n",
" <td>9</td>\n",
" <td>1.678731e+09</td>\n",
" <td>0.775000</td>\n",
" <td>0.939394</td>\n",
" <td>2289</td>\n",
" <td>...</td>\n",
" <td>1.758836</td>\n",
" <td>NaN</td>\n",
" <td>0.5</td>\n",
" <td>10</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>sgd</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>0.0030</td>\n",
" </tr>\n",
" <tr>\n",
" <th>136</th>\n",
" <td>136</td>\n",
" <td>unique-sweep-2</td>\n",
" <td>0.479234</td>\n",
" <td>0.832924</td>\n",
" <td>0.534751</td>\n",
" <td>9</td>\n",
" <td>1.678730e+09</td>\n",
" <td>0.684211</td>\n",
" <td>0.838710</td>\n",
" <td>1159</td>\n",
" <td>...</td>\n",
" <td>0.455120</td>\n",
" <td>NaN</td>\n",
" <td>0.1</td>\n",
" <td>10</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>sgd</td>\n",
" <td>3</td>\n",
" <td>8</td>\n",
" <td>0.0003</td>\n",
" </tr>\n",
" <tr>\n",
" <th>137</th>\n",
" <td>137</td>\n",
" <td>polar-sweep-1</td>\n",
" <td>0.544247</td>\n",
" <td>0.990172</td>\n",
" <td>0.00574</td>\n",
" <td>9</td>\n",
" <td>1.678730e+09</td>\n",
" <td>0.863636</td>\n",
" <td>0.904762</td>\n",
" <td>2289</td>\n",
" <td>...</td>\n",
" <td>2.532007</td>\n",
" <td>NaN</td>\n",
" <td>0.5</td>\n",
" <td>10</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>sgd</td>\n",
" <td>7</td>\n",
" <td>4</td>\n",
" <td>0.0030</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>138 rows × 25 columns</p>\n",
"</div>"
],
"text/plain": [
" Unnamed: 0 name test/epoch_loss train/epoch_acc \\\n",
"0 0 fiery-sweep-26 0.566462 0.823096 \n",
"1 1 radiant-sweep-25 0.645458 0.712531 \n",
"2 2 blooming-sweep-24 0.348129 0.998771 \n",
"3 3 visionary-sweep-23 0.555318 0.835381 \n",
"4 4 ancient-sweep-22 1.560271 0.557740 \n",
".. ... ... ... ... \n",
"133 133 different-sweep-5 0.493642 0.821867 \n",
"134 134 wise-sweep-4 0.548264 0.812039 \n",
"135 135 misty-sweep-3 0.241948 0.996314 \n",
"136 136 unique-sweep-2 0.479234 0.832924 \n",
"137 137 polar-sweep-1 0.544247 0.990172 \n",
"\n",
" train/batch_loss epoch _timestamp test/recall test/precision _step \\\n",
"0 0.335779 9 1.680693e+09 0.617021 0.828571 2059 \n",
"1 0.70145 9 1.680693e+09 0.822222 0.685185 1039 \n",
"2 0.019566 9 1.680692e+09 0.783784 0.935484 1039 \n",
"3 0.522233 9 1.680692e+09 0.833333 0.760870 529 \n",
"4 0.508366 1 1.680692e+09 0.884615 0.589744 410 \n",
".. ... ... ... ... ... ... \n",
"133 0.443422 9 1.678732e+09 0.714286 0.945946 1159 \n",
"134 0.565593 9 1.678731e+09 0.846154 0.825000 1159 \n",
"135 0.004703 9 1.678731e+09 0.775000 0.939394 2289 \n",
"136 0.534751 9 1.678730e+09 0.684211 0.838710 1159 \n",
"137 0.00574 9 1.678730e+09 0.863636 0.904762 2289 \n",
"\n",
" ... test/batch_loss eps gamma epochs beta_one beta_two \\\n",
"0 ... NaN 1.000000e-01 0.1 10 0.99 0.900 \n",
"1 ... NaN 1.000000e+00 0.5 10 0.99 0.900 \n",
"2 ... NaN 1.000000e-08 0.5 10 0.90 0.999 \n",
"3 ... NaN 1.000000e+00 0.1 10 0.90 0.900 \n",
"4 ... NaN 1.000000e-08 0.5 10 0.90 0.990 \n",
".. ... ... ... ... ... ... ... \n",
"133 ... 0.506896 NaN 0.5 10 NaN NaN \n",
"134 ... 0.515937 NaN 0.5 10 NaN NaN \n",
"135 ... 1.758836 NaN 0.5 10 NaN NaN \n",
"136 ... 0.455120 NaN 0.1 10 NaN NaN \n",
"137 ... 2.532007 NaN 0.5 10 NaN NaN \n",
"\n",
" optimizer step_size batch_size learning_rate \n",
"0 adam 3 4 0.0003 \n",
"1 adam 2 8 0.0003 \n",
"2 sgd 5 8 0.0030 \n",
"3 sgd 2 16 0.0003 \n",
"4 adam 7 4 0.0100 \n",
".. ... ... ... ... \n",
"133 sgd 3 8 0.0001 \n",
"134 sgd 2 8 0.0001 \n",
"135 sgd 3 4 0.0030 \n",
"136 sgd 3 8 0.0003 \n",
"137 sgd 7 4 0.0030 \n",
"\n",
"[138 rows x 25 columns]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv('hyp-metrics.csv',\n",
" delimiter=',')\n",
"df['summary'] = df['summary'].map(eval)\n",
"df['config'] = df['config'].map(eval)\n",
"df = df.join(pd.json_normalize(df['summary'])).drop('summary', axis='columns')\n",
"df = df.join(pd.json_normalize(df['config'])).drop('config', axis='columns')\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "4679b2f8",
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/zenon/.local/share/miniconda3/lib/python3.7/site-packages/ipykernel_launcher.py:1: FutureWarning: In a future version of pandas all arguments of Series.sort_values will be keyword-only\n",
" \"\"\"Entry point for launching an IPython kernel.\n"
]
},
{
"data": {
"text/plain": [
"0.0100 21\n",
"0.1000 21\n",
"0.0003 23\n",
"0.0010 23\n",
"0.0001 23\n",
"0.0030 27\n",
"Name: learning_rate, dtype: int64"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['learning_rate'].value_counts().sort_values(0)\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "1b1a54fc",
"metadata": {},
"outputs": [],
"source": [
"# Style the plots (with grid this time)\n",
"width = 418\n",
"sns.set_theme(style='whitegrid',\n",
" rc={'text.usetex': True, 'font.family': 'serif', 'axes.labelsize': 10,\n",
" 'font.size': 10, 'legend.fontsize': 8,\n",
" 'xtick.labelsize': 8, 'ytick.labelsize': 8})\n",
"\n",
"fig_save_dir = '../../thesis/graphics/'"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "00efa25b",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 578.387x357.463 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df_prepared = df.rename(columns={'learning_rate': 'learning rate', 'batch_size': 'batch size'})\n",
"fig, ax = plt.subplots(1, 1, figsize=set_size(width, subplots=(1,1)))\n",
"sns.scatterplot(x=\"learning rate\", y=\"test/f1-score\",\n",
" style=\"optimizer\", hue=\"batch size\",\n",
" palette=sns.cubehelix_palette(5, light=0.8, gamma=1.2),\n",
" sizes=(5, 30), linewidth=0, s=15,\n",
" data=df_prepared, ax=ax)\n",
"ax.set_xscale('log')\n",
"ax.set_xticks([0.0001, 0.0003, 0.001, 0.003, 0.01, 0.1])\n",
"ax.set_xticklabels(labels = ['0.0001', '0.0003', '0.001', '0.003', '0.01', '0.1'])\n",
"fig.tight_layout()\n",
"fig.savefig(fig_save_dir + 'classifier-hyp-metrics.pdf', format='pdf', bbox_inches='tight')"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "44e275ab",
"metadata": {},
"outputs": [],
"source": [
"parameters_dict = {\n",
" 'optimizer': {\n",
" 'values': ['adam', 'sgd']\n",
" },\n",
"}\n",
"\n",
"parameters_dict.update({\n",
" 'batch_size': {\n",
" 'values': [4, 8, 16, 32, 64]},\n",
" 'learning_rate': {\n",
" 'values': [0.0001, 0.0003, 0.001, 0.003, 0.01, 0.1]},\n",
" 'step_size': {\n",
" 'values': [2, 3, 5, 7]},\n",
" 'gamma': {\n",
" 'values': [0.1, 0.5]},\n",
" 'beta_one': {\n",
" 'values': [0.9, 0.99]},\n",
" 'beta_two': {\n",
" 'values': [0.5, 0.9, 0.99, 0.999]},\n",
" 'eps': {\n",
" 'values': [1e-08, 0.1, 1]}\n",
"})"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "7d3c2860",
"metadata": {},
"outputs": [],
"source": [
"params = pd.DataFrame.from_dict(parameters_dict)\n",
"params = params.transpose()\n",
"params['values_string'] = [', '.join(map(str, l)) for l in params['values']]\n",
"params['values'] = params['values_string']\n",
"params = params.drop(['values_string'], axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "acc3a77e",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>values</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>optimizer</th>\n",
" <td>adam, sgd</td>\n",
" </tr>\n",
" <tr>\n",
" <th>batch_size</th>\n",
" <td>4, 8, 16, 32, 64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>learning_rate</th>\n",
" <td>0.0001, 0.0003, 0.001, 0.003, 0.01, 0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>step_size</th>\n",
" <td>2, 3, 5, 7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>gamma</th>\n",
" <td>0.1, 0.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>beta_one</th>\n",
" <td>0.9, 0.99</td>\n",
" </tr>\n",
" <tr>\n",
" <th>beta_two</th>\n",
" <td>0.5, 0.9, 0.99, 0.999</td>\n",
" </tr>\n",
" <tr>\n",
" <th>eps</th>\n",
" <td>1e-08, 0.1, 1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" values\n",
"optimizer adam, sgd\n",
"batch_size 4, 8, 16, 32, 64\n",
"learning_rate 0.0001, 0.0003, 0.001, 0.003, 0.01, 0.1\n",
"step_size 2, 3, 5, 7\n",
"gamma 0.1, 0.5\n",
"beta_one 0.9, 0.99\n",
"beta_two 0.5, 0.9, 0.99, 0.999\n",
"eps 1e-08, 0.1, 1"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"params"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "73a26951",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>optimizer</th>\n",
" <th>batch_size</th>\n",
" <th>learning_rate</th>\n",
" <th>step_size</th>\n",
" <th>gamma</th>\n",
" <th>beta_one</th>\n",
" <th>beta_two</th>\n",
" <th>eps</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>values</th>\n",
" <td>adam</td>\n",
" <td>4</td>\n",
" <td>0.0001</td>\n",
" <td>2</td>\n",
" <td>0.1</td>\n",
" <td>0.9</td>\n",
" <td>0.5</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>values</th>\n",
" <td>adam</td>\n",
" <td>4</td>\n",
" <td>0.0001</td>\n",
" <td>2</td>\n",
" <td>0.1</td>\n",
" <td>0.9</td>\n",
" <td>0.5</td>\n",
" <td>0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>values</th>\n",
" <td>adam</td>\n",
" <td>4</td>\n",
" <td>0.0001</td>\n",
" <td>2</td>\n",
" <td>0.1</td>\n",
" <td>0.9</td>\n",
" <td>0.5</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>values</th>\n",
" <td>adam</td>\n",
" <td>4</td>\n",
" <td>0.0001</td>\n",
" <td>2</td>\n",
" <td>0.1</td>\n",
" <td>0.9</td>\n",
" <td>0.9</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>values</th>\n",
" <td>adam</td>\n",
" <td>4</td>\n",
" <td>0.0001</td>\n",
" <td>2</td>\n",
" <td>0.1</td>\n",
" <td>0.9</td>\n",
" <td>0.9</td>\n",
" <td>0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>values</th>\n",
" <td>sgd</td>\n",
" <td>64</td>\n",
" <td>0.1</td>\n",
" <td>7</td>\n",
" <td>0.5</td>\n",
" <td>0.99</td>\n",
" <td>0.99</td>\n",
" <td>0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>values</th>\n",
" <td>sgd</td>\n",
" <td>64</td>\n",
" <td>0.1</td>\n",
" <td>7</td>\n",
" <td>0.5</td>\n",
" <td>0.99</td>\n",
" <td>0.99</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>values</th>\n",
" <td>sgd</td>\n",
" <td>64</td>\n",
" <td>0.1</td>\n",
" <td>7</td>\n",
" <td>0.5</td>\n",
" <td>0.99</td>\n",
" <td>0.999</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>values</th>\n",
" <td>sgd</td>\n",
" <td>64</td>\n",
" <td>0.1</td>\n",
" <td>7</td>\n",
" <td>0.5</td>\n",
" <td>0.99</td>\n",
" <td>0.999</td>\n",
" <td>0.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>values</th>\n",
" <td>sgd</td>\n",
" <td>64</td>\n",
" <td>0.1</td>\n",
" <td>7</td>\n",
" <td>0.5</td>\n",
" <td>0.99</td>\n",
" <td>0.999</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>11520 rows × 8 columns</p>\n",
"</div>"
],
"text/plain": [
" optimizer batch_size learning_rate step_size gamma beta_one beta_two \\\n",
"values adam 4 0.0001 2 0.1 0.9 0.5 \n",
"values adam 4 0.0001 2 0.1 0.9 0.5 \n",
"values adam 4 0.0001 2 0.1 0.9 0.5 \n",
"values adam 4 0.0001 2 0.1 0.9 0.9 \n",
"values adam 4 0.0001 2 0.1 0.9 0.9 \n",
"... ... ... ... ... ... ... ... \n",
"values sgd 64 0.1 7 0.5 0.99 0.99 \n",
"values sgd 64 0.1 7 0.5 0.99 0.99 \n",
"values sgd 64 0.1 7 0.5 0.99 0.999 \n",
"values sgd 64 0.1 7 0.5 0.99 0.999 \n",
"values sgd 64 0.1 7 0.5 0.99 0.999 \n",
"\n",
" eps \n",
"values 0.0 \n",
"values 0.1 \n",
"values 1 \n",
"values 0.0 \n",
"values 0.1 \n",
"... ... \n",
"values 0.1 \n",
"values 1 \n",
"values 0.0 \n",
"values 0.1 \n",
"values 1 \n",
"\n",
"[11520 rows x 8 columns]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.DataFrame.from_dict(parameters_dict).explode('optimizer').explode('batch_size').explode('learning_rate').explode('step_size').explode('gamma').explode('beta_one').explode('beta_two').explode('eps')"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9f163a6c",
"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.7.15"
}
},
"nbformat": 4,
"nbformat_minor": 5
}