From c87f5603962f0430eee12b16ea17d66ab92e50df Mon Sep 17 00:00:00 2001 From: Jean-Luc Parouty <Jean-Luc.Parouty@grenoble-inp.fr> Date: Mon, 14 Dec 2020 22:02:32 +0100 Subject: [PATCH] Update Finished report --- LinearReg/01-Linear-Regression.ipynb | 20 +- README.ipynb | 5 - ..._readme.ipynb => 01 - Set and reset.ipynb} | 46 ++++- fidle/02 - Finished report.ipynb | 187 ++++++++++++++++++ fidle/Finished.ipynb | 152 -------------- fidle/catalog_builder.py | 2 +- fidle/log/catalog_nb.json | 64 +++--- fidle/log/finished_file.json | 20 +- fidle/pwk.py | 34 ++-- 9 files changed, 293 insertions(+), 237 deletions(-) rename fidle/{01 - Update_readme.ipynb => 01 - Set and reset.ipynb} (86%) create mode 100644 fidle/02 - Finished report.ipynb delete mode 100644 fidle/Finished.ipynb diff --git a/LinearReg/01-Linear-Regression.ipynb b/LinearReg/01-Linear-Regression.ipynb index f032d30..4096d5e 100644 --- a/LinearReg/01-Linear-Regression.ipynb +++ b/LinearReg/01-Linear-Regression.ipynb @@ -29,7 +29,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -91,9 +91,9 @@ "text": [ "\n", "FIDLE 2020 - Practical Work Module\n", - "Version : 0.7 DEV\n", - "Notebook name : 01-Linear-Regression\n", - "Run time : Wednesday 9 December 2020, 20:16:41\n", + "Version : 0.6.1 DEV\n", + "Notebook id : LINR1\n", + "Run time : Monday 14 December 2020, 21:55:06\n", "TensorFlow version : 2.0.0\n", "Keras version : 2.2.4-tf\n", "Datasets dir : /home/pjluc/datasets/fidle\n", @@ -168,7 +168,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "<Figure size 864x432 with 1 Axes>" ] @@ -223,8 +223,8 @@ " [2]] \n", "\n", "theta hat :\n", - " [[4.13539406]\n", - " [2.03571951]]\n" + " [[4.82758394]\n", + " [1.89928368]]\n" ] } ], @@ -248,7 +248,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "<Figure size 864x432 with 1 Axes>" ] @@ -280,8 +280,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "End time is : Wednesday 9 December 2020, 20:16:41\n", - "Duration is : 00:00:00 256ms\n", + "End time is : Monday 14 December 2020, 20:52:27\n", + "Duration is : 00:00:00 225ms\n", "This notebook ends here\n" ] } diff --git a/README.ipynb b/README.ipynb index 1cd87bc..a1952ae 100644 --- a/README.ipynb +++ b/README.ipynb @@ -123,11 +123,6 @@ } ], "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, "language_info": { "codemirror_mode": { "name": "ipython", diff --git a/fidle/01 - Update_readme.ipynb b/fidle/01 - Set and reset.ipynb similarity index 86% rename from fidle/01 - Update_readme.ipynb rename to fidle/01 - Set and reset.ipynb index c080807..9f536d2 100644 --- a/fidle/01 - Update_readme.ipynb +++ b/fidle/01 - Set and reset.ipynb @@ -8,9 +8,10 @@ "\n", "\n", "## Mise a jour du catalog des notebooks et des READMEs\n", - " - Génération du catalog des notebooks : `./log/catalog_nb.json`\n", - " - Génération automatique de la table des matières\n", - " - Mise à jour des `README.md` et `REAME.ipynb`\n", + " - Génération du **catalog des notebooks** : `./log/catalog_nb.json`\n", + " - Génération automatique de la **table des matières**\n", + " - Mise à jour des **README** `README.md` et `REAME.ipynb`\n", + " - #Reset du **finihed_file**\n", "\n" ] }, @@ -36,6 +37,7 @@ "from collections import OrderedDict\n", "\n", "sys.path.append('..')\n", + "import fidle.pwk as pwk\n", "import fidle.config as config\n", "import fidle.catalog_builder as builder" ] @@ -194,7 +196,15 @@ "cell_type": "code", "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "README.ipynb built and saved\n" + ] + } + ], "source": [ "# ---- Create Notebook from scratch\n", "#\n", @@ -219,7 +229,33 @@ "# ---- Save it\n", "#\n", "with open('../README.ipynb', mode=\"w\", encoding='utf-8') as fp:\n", - " nbformat.write(notebook, fp)" + " nbformat.write(notebook, fp)\n", + "print('README.ipynb built and saved')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 7 - Reset Finished_file" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Finished file has been reset.\n", + "\n" + ] + } + ], + "source": [ + "pwk.reset_finished_file()" ] }, { diff --git a/fidle/02 - Finished report.ipynb b/fidle/02 - Finished report.ipynb new file mode 100644 index 0000000..9f5cc7f --- /dev/null +++ b/fidle/02 - Finished report.ipynb @@ -0,0 +1,187 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<img width=\"800px\" src=\"../fidle/img/00-Fidle-header-01.svg\"></img>\n", + "\n", + "\n", + "## Notebook Performance Statistics (Continuous integration)\n", + " - List of executed notebooks \n", + " - Runtime and status \n", + "\n", + "Each notebook indicates its start and end of execution:\n", + " - at the beginning, with `pwk.init()`\n", + " - at the end, with `pwk.end()` \n", + " \n", + "All of theses informations are saved in a json file (FINISHED_FILE, cf config.py)." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import sys, json\n", + "from IPython.display import display, Markdown, HTML\n", + "\n", + "sys.path.append('..')\n", + "import fidle.config as config" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<style type=\"text/css\" >\n", + " #T_0a1357a2_3e4f_11eb_ad81_8794535e7583 td {\n", + " font-size: 110%;\n", + " text-align: left;\n", + " } #T_0a1357a2_3e4f_11eb_ad81_8794535e7583 th {\n", + " font-size: 110%;\n", + " text-align: left;\n", + " }#T_0a1357a2_3e4f_11eb_ad81_8794535e7583row0_col4{\n", + " background-color: yellow;\n", + " }</style><table id=\"T_0a1357a2_3e4f_11eb_ad81_8794535e7583\" ><thead> <tr> <th class=\"col_heading level0 col0\" >id</th> <th class=\"col_heading level0 col1\" >name</th> <th class=\"col_heading level0 col2\" >start</th> <th class=\"col_heading level0 col3\" >end</th> <th class=\"col_heading level0 col4\" >duration</th> </tr></thead><tbody>\n", + " <tr>\n", + " <td id=\"T_0a1357a2_3e4f_11eb_ad81_8794535e7583row0_col0\" class=\"data row0 col0\" ><a href=\"../LinearReg/01-Linear-Regression.ipynb\">LINR1</a></td>\n", + " <td id=\"T_0a1357a2_3e4f_11eb_ad81_8794535e7583row0_col1\" class=\"data row0 col1\" ><a href=\"../LinearReg/01-Linear-Regression.ipynb\"><b>01-Linear-Regression.ipynb</b></a></td>\n", + " <td id=\"T_0a1357a2_3e4f_11eb_ad81_8794535e7583row0_col2\" class=\"data row0 col2\" >Monday 14 December 2020, 21:55:06</td>\n", + " <td id=\"T_0a1357a2_3e4f_11eb_ad81_8794535e7583row0_col3\" class=\"data row0 col3\" ></td>\n", + " <td id=\"T_0a1357a2_3e4f_11eb_ad81_8794535e7583row0_col4\" class=\"data row0 col4\" >Pending...</td>\n", + " </tr>\n", + " </tbody></table>" + ], + "text/plain": [ + "<pandas.io.formats.style.Styler at 0x7f28b6a3da90>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# ---- Load catalog (notebooks descriptions)\n", + "#\n", + "with open(config.CATALOG_FILE) as fp:\n", + " catalog = json.load(fp)\n", + "\n", + "# ---- Load finished file\n", + "#\n", + "with open(config.FINISHED_FILE) as infile:\n", + " dict_finished = json.load( infile )\n", + "\n", + "df=pd.DataFrame(dict_finished).transpose()\n", + "\n", + "df.reset_index(inplace=True)\n", + "df.rename(columns = {'index':'id'}, inplace=True)\n", + "df['name']=''\n", + "\n", + "for index, row in df.iterrows():\n", + " id = row['id']\n", + " basename = catalog[id]['basename']\n", + " dirname = catalog[id]['dirname']\n", + " title = catalog[id]['title']\n", + " description = catalog[id]['description']\n", + " row['id'] = f'<a href=\"../{dirname}/{basename}\">{id}</a>'\n", + " row['name'] = f'<a href=\"../{dirname}/{basename}\"><b>{basename}</b></a>'\n", + "\n", + "columns=['id','name','start','end','duration']\n", + "\n", + "styles = [\n", + " dict(selector=\"td\", props=[(\"font-size\", \"110%\"), (\"text-align\", \"left\")]),\n", + " dict(selector=\"th\", props=[(\"font-size\", \"110%\"), (\"text-align\", \"left\")])\n", + "]\n", + "\n", + "\n", + "def still_pending(v):\n", + " return 'background-color: yellow' if v == 'Pending...' else ''\n", + "\n", + "output = df[columns].style.set_table_styles(styles).hide_index().applymap(still_pending)\n", + "\n", + "display( output )\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "<img width=\"80px\" src=\"../fidle/img/00-Fidle-logo-01.svg\"></img>" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<style type=\"text/css\" >\n", + " #T_80832516_3e4f_11eb_ad81_8794535e7583 td {\n", + " font-size: 110%;\n", + " text-align: left;\n", + " } #T_80832516_3e4f_11eb_ad81_8794535e7583 th {\n", + " font-size: 110%;\n", + " text-align: left;\n", + " }#T_80832516_3e4f_11eb_ad81_8794535e7583row0_col4{\n", + " background-color: yellow;\n", + " background-color: yellow;\n", + " background-color: yellow;\n", + " background-color: yellow;\n", + " background-color: yellow;\n", + " }</style><table id=\"T_80832516_3e4f_11eb_ad81_8794535e7583\" ><thead> <tr> <th class=\"col_heading level0 col0\" >id</th> <th class=\"col_heading level0 col1\" >name</th> <th class=\"col_heading level0 col2\" >start</th> <th class=\"col_heading level0 col3\" >end</th> <th class=\"col_heading level0 col4\" >duration</th> </tr></thead><tbody>\n", + " <tr>\n", + " <td id=\"T_80832516_3e4f_11eb_ad81_8794535e7583row0_col0\" class=\"data row0 col0\" ><a href=\"../LinearReg/01-Linear-Regression.ipynb\">LINR1</a></td>\n", + " <td id=\"T_80832516_3e4f_11eb_ad81_8794535e7583row0_col1\" class=\"data row0 col1\" ><a href=\"../LinearReg/01-Linear-Regression.ipynb\"><b>01-Linear-Regression.ipynb</b></a></td>\n", + " <td id=\"T_80832516_3e4f_11eb_ad81_8794535e7583row0_col2\" class=\"data row0 col2\" >Monday 14 December 2020, 21:55:06</td>\n", + " <td id=\"T_80832516_3e4f_11eb_ad81_8794535e7583row0_col3\" class=\"data row0 col3\" ></td>\n", + " <td id=\"T_80832516_3e4f_11eb_ad81_8794535e7583row0_col4\" class=\"data row0 col4\" >Pending...</td>\n", + " </tr>\n", + " </tbody></table>\n" + ] + } + ], + "source": [ + "print(output.render())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/fidle/Finished.ipynb b/fidle/Finished.ipynb deleted file mode 100644 index 8faeb77..0000000 --- a/fidle/Finished.ipynb +++ /dev/null @@ -1,152 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "<img width=\"800px\" src=\"../fidle/img/00-Fidle-header-01.svg\"></img>\n", - "\n", - "\n", - "## Notebook Performance Statistics (Continuous integration)\n", - " - List of executed notebooks \n", - " - Runtime and status \n", - "\n", - "Each notebook indicates its start and end of execution:\n", - " - at the beginning, during `pwk.init()`\n", - " - at the end, with a `pwk.end()`\n", - "This information is saved in a json file (FINISHED_FILE, cf config.py)." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import os,sys,glob,json\n", - "from pathlib import Path\n", - "import pandas as pd\n", - "from IPython.display import display, Markdown, HTML\n", - "\n", - "sys.path.append('..')\n", - "import fidle.pwk as pwk\n", - "import fidle.config as config" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>Notebook</th>\n", - " <th>path</th>\n", - " <th>start</th>\n", - " <th>end</th>\n", - " <th>duration</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td><a href=\"/home/pjluc/dev/fidle/LinearReg/01-Linear-Regression.ipynb\">01-Linear-Regression</a></td>\n", - " <td>/home/pjluc/dev/fidle/LinearReg</td>\n", - " <td>Wednesday 9 December 2020, 20:16:41</td>\n", - " <td>Wednesday 9 December 2020, 20:16:41</td>\n", - " <td>00:00:00 256ms</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td><a href=\"/home/pjluc/dev/fidle/LinearReg/02-Gradient-descent.ipynb\">02-Gradient-descent</a></td>\n", - " <td>/home/pjluc/dev/fidle/LinearReg</td>\n", - " <td>Wednesday 9 December 2020, 20:16:56</td>\n", - " <td>Wednesday 9 December 2020, 20:17:00</td>\n", - " <td>00:00:03 279ms</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td><a href=\"/home/pjluc/dev/fidle/LinearReg/03-Polynomial-Regression.ipynb\">03-Polynomial-Regression</a></td>\n", - " <td>/home/pjluc/dev/fidle/LinearReg</td>\n", - " <td>Wednesday 9 December 2020, 20:20:32</td>\n", - " <td>Wednesday 9 December 2020, 20:20:33</td>\n", - " <td>00:00:01 682ms</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "with open(config.FINISHED_FILE) as infile:\n", - " dict_finished = json.load( infile )\n", - "\n", - "df=pd.DataFrame(dict_finished).transpose()\n", - "\n", - "df.reset_index(inplace=True)\n", - "df.rename(columns = {'index':'Notebook'}, inplace=True)\n", - "\n", - "# df['Notebook'] = '<a href=\"{}/{}.ipynb\">{}</a>'.format(df['path'],df['Notebook'],df['Notebook'])\n", - "\n", - "df['Notebook'] = df.apply(\n", - " lambda x: '<a href=\"{}/{}.ipynb\">{}</a>'.format(x['path'],x['Notebook'],x['Notebook']), axis=1\n", - " )\n", - " \n", - "\n", - "\n", - "HTML(df.to_html(\n", - " render_links=True,\n", - " escape=False))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "<img width=\"80px\" src=\"../fidle/img/00-Fidle-logo-01.svg\"></img>" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.7" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/fidle/catalog_builder.py b/fidle/catalog_builder.py index d8929e7..3a8ca99 100644 --- a/fidle/catalog_builder.py +++ b/fidle/catalog_builder.py @@ -50,9 +50,9 @@ def get_infos(filename, top_dir='..'): ''' about={} + about['id'] = '??' about['dirname'] = os.path.dirname(filename) about['basename'] = os.path.basename(filename) - about['id'] = '??' about['title'] = '??' about['description'] = '??' diff --git a/fidle/log/catalog_nb.json b/fidle/log/catalog_nb.json index 8a6b68e..5422c43 100644 --- a/fidle/log/catalog_nb.json +++ b/fidle/log/catalog_nb.json @@ -1,225 +1,225 @@ { "LINR1": { + "id": "LINR1", "dirname": "LinearReg", "basename": "01-Linear-Regression.ipynb", - "id": "LINR1", "title": "Linear regression with direct resolution", "description": "Direct determination of linear regression " }, "GRAD1": { + "id": "GRAD1", "dirname": "LinearReg", "basename": "02-Gradient-descent.ipynb", - "id": "GRAD1", "title": "Linear regression with gradient descent", "description": "An example of gradient descent in the simple case of a linear regression." }, "POLR1": { + "id": "POLR1", "dirname": "LinearReg", "basename": "03-Polynomial-Regression.ipynb", - "id": "POLR1", "title": "Complexity Syndrome", "description": "Illustration of the problem of complexity with the polynomial regression" }, "LOGR1": { + "id": "LOGR1", "dirname": "LinearReg", "basename": "04-Logistic-Regression.ipynb", - "id": "LOGR1", "title": "Logistic regression, in pure Tensorflow", "description": "Logistic Regression with Mini-Batch Gradient Descent using pure TensorFlow. " }, "PER57": { + "id": "PER57", "dirname": "IRIS", "basename": "01-Simple-Perceptron.ipynb", - "id": "PER57", "title": "Perceptron Model 1957", "description": "A simple perceptron, with the IRIS dataset." }, "BHP1": { + "id": "BHP1", "dirname": "BHPD", "basename": "01-DNN-Regression.ipynb", - "id": "BHP1", "title": "Regression with a Dense Network (DNN)", "description": "A Simple regression with a Dense Neural Network (DNN) - BHPD dataset" }, "BHP2": { + "id": "BHP2", "dirname": "BHPD", "basename": "02-DNN-Regression-Premium.ipynb", - "id": "BHP2", "title": "Regression with a Dense Network (DNN) - Advanced code", "description": "More advanced example of DNN network code - BHPD dataset" }, "MNIST1": { + "id": "MNIST1", "dirname": "MNIST", "basename": "01-DNN-MNIST.ipynb", - "id": "MNIST1", "title": "Simple classification with DNN", "description": "Example of classification with a fully connected neural network" }, "GTS1": { + "id": "GTS1", "dirname": "GTSRB", "basename": "01-Preparation-of-data.ipynb", - "id": "GTS1", "title": "CNN with GTSRB dataset - Data analysis and preparation", "description": "Episode 1 : Data analysis and creation of a usable dataset" }, "GTS2": { + "id": "GTS2", "dirname": "GTSRB", "basename": "02-First-convolutions.ipynb", - "id": "GTS2", "title": "CNN with GTSRB dataset - First convolutions", "description": "Episode 2 : First convolutions and first results" }, "GTS3": { + "id": "GTS3", "dirname": "GTSRB", "basename": "03-Tracking-and-visualizing.ipynb", - "id": "GTS3", "title": "CNN with GTSRB dataset - Monitoring ", "description": "Episode 3 : Monitoring and analysing training, managing checkpoints" }, "GTS4": { + "id": "GTS4", "dirname": "GTSRB", "basename": "04-Data-augmentation.ipynb", - "id": "GTS4", "title": "CNN with GTSRB dataset - Data augmentation ", "description": "Episode 4 : Improving the results with data augmentation" }, "GTS5": { + "id": "GTS5", "dirname": "GTSRB", "basename": "05-Full-convolutions.ipynb", - "id": "GTS5", "title": "CNN with GTSRB dataset - Full convolutions ", "description": "Episode 5 : A lot of models, a lot of datasets and a lot of results." }, "GTS6": { + "id": "GTS6", "dirname": "GTSRB", "basename": "06-Notebook-as-a-batch.ipynb", - "id": "GTS6", "title": "CNN with GTSRB dataset - Full convolutions as a batch", "description": "Episode 6 : Run Full convolution notebook as a batch" }, "GTS7": { + "id": "GTS7", "dirname": "GTSRB", "basename": "07-Show-report.ipynb", - "id": "GTS7", "title": "CNN with GTSRB dataset - Show reports", "description": "Episode 7 : Displaying the reports of the different jobs" }, "TSB1": { + "id": "TSB1", "dirname": "GTSRB", "basename": "99-Scripts-Tensorboard.ipynb", - "id": "TSB1", "title": "Tensorboard with/from Jupyter ", "description": "4 ways to use Tensorboard from the Jupyter environment" }, "IMDB1": { + "id": "IMDB1", "dirname": "IMDB", "basename": "01-Embedding-Keras.ipynb", - "id": "IMDB1", "title": "Text embedding with IMDB", "description": "A very classical example of word embedding for text classification (sentiment analysis)" }, "IMDB2": { + "id": "IMDB2", "dirname": "IMDB", "basename": "02-Prediction.ipynb", - "id": "IMDB2", "title": "Text embedding with IMDB - Reloaded", "description": "Example of reusing a previously saved model" }, "IMDB3": { + "id": "IMDB3", "dirname": "IMDB", "basename": "03-LSTM-Keras.ipynb", - "id": "IMDB3", "title": "Text embedding/LSTM model with IMDB", "description": "Still the same problem, but with a network combining embedding and LSTM" }, "SYNOP1": { + "id": "SYNOP1", "dirname": "SYNOP", "basename": "01-Preparation-of-data.ipynb", - "id": "SYNOP1", "title": "Time series with RNN - Preparation of data", "description": "Episode 1 : Data analysis and creation of a usable dataset" }, "SYNOP2": { + "id": "SYNOP2", "dirname": "SYNOP", "basename": "02-First-predictions.ipynb", - "id": "SYNOP2", "title": "Time series with RNN - Try a prediction", "description": "Episode 2 : Training session and first predictions" }, "SYNOP3": { + "id": "SYNOP3", "dirname": "SYNOP", "basename": "03-12h-predictions.ipynb", - "id": "SYNOP3", "title": "Time series with RNN - 12h predictions", "description": "Episode 3: Attempt to predict in the longer term " }, "VAE1": { + "id": "VAE1", "dirname": "VAE", "basename": "01-VAE-with-MNIST.nbconvert.ipynb", - "id": "VAE1", "title": "Variational AutoEncoder (VAE) with MNIST", "description": "Episode 1 : Model construction and Training" }, "VAE2": { + "id": "VAE2", "dirname": "VAE", "basename": "02-VAE-with-MNIST-post.ipynb", - "id": "VAE2", "title": "Variational AutoEncoder (VAE) with MNIST - Analysis", "description": "Episode 2 : Exploring our latent space" }, "VAE3": { + "id": "VAE3", "dirname": "VAE", "basename": "03-About-CelebA.ipynb", - "id": "VAE3", "title": "About the CelebA dataset", "description": "Episode 3\u00a0: About the CelebA dataset, a more fun dataset ;-)" }, "VAE4": { + "id": "VAE4", "dirname": "VAE", "basename": "04-Prepare-CelebA-datasets.ipynb", - "id": "VAE4", "title": "Preparation of the CelebA dataset", "description": "Episode 4\u00a0: Preparation of a clustered dataset, batchable" }, "VAE5": { + "id": "VAE5", "dirname": "VAE", "basename": "05-Check-CelebA.ipynb", - "id": "VAE5", "title": "Checking the clustered CelebA dataset", "description": "Episode 5\u00a0:\tChecking the clustered dataset" }, "VAE6": { + "id": "VAE6", "dirname": "VAE", "basename": "06-VAE-with-CelebA-s.nbconvert.ipynb", - "id": "VAE6", "title": "Variational AutoEncoder (VAE) with CelebA (small)", "description": "Episode 6\u00a0: Variational AutoEncoder (VAE) with CelebA (small res.)" }, "VAE7": { + "id": "VAE7", "dirname": "VAE", "basename": "07-VAE-with-CelebA-m.nbconvert.ipynb", - "id": "VAE7", "title": "Variational AutoEncoder (VAE) with CelebA (medium)", "description": "Episode 7\u00a0: Variational AutoEncoder (VAE) with CelebA (medium res.)" }, "VAE8": { + "id": "VAE8", "dirname": "VAE", "basename": "08-VAE-withCelebA-post.ipynb", - "id": "VAE8", "title": "Variational AutoEncoder (VAE) with CelebA - Analysis", "description": "Episode 8\u00a0: Exploring latent space of our trained models" }, "ACTF1": { + "id": "ACTF1", "dirname": "Misc", "basename": "Activation-Functions.ipynb", - "id": "ACTF1", "title": "Activation functions", "description": "Some activation functions, with their derivatives." }, "NP1": { + "id": "NP1", "dirname": "Misc", "basename": "Numpy.ipynb", - "id": "NP1", "title": "A short introduction to Numpy", "description": "Numpy is an essential tool for the Scientific Python." } diff --git a/fidle/log/finished_file.json b/fidle/log/finished_file.json index 40f804c..d98683b 100644 --- a/fidle/log/finished_file.json +++ b/fidle/log/finished_file.json @@ -1,20 +1,8 @@ { - "01-Linear-Regression": { + "LINR1": { "path": "/home/pjluc/dev/fidle/LinearReg", - "start": "Wednesday 9 December 2020, 20:16:41", - "end": "Wednesday 9 December 2020, 20:16:41", - "duration": "00:00:00 256ms" - }, - "02-Gradient-descent": { - "path": "/home/pjluc/dev/fidle/LinearReg", - "start": "Wednesday 9 December 2020, 20:16:56", - "end": "Wednesday 9 December 2020, 20:17:00", - "duration": "00:00:03 279ms" - }, - "03-Polynomial-Regression": { - "path": "/home/pjluc/dev/fidle/LinearReg", - "start": "Wednesday 9 December 2020, 20:20:32", - "end": "Wednesday 9 December 2020, 20:20:33", - "duration": "00:00:01 682ms" + "start": "Monday 14 December 2020, 21:55:06", + "end": "", + "duration": "Pending..." } } \ No newline at end of file diff --git a/fidle/pwk.py b/fidle/pwk.py index c6d3bfc..2c3fbc1 100644 --- a/fidle/pwk.py +++ b/fidle/pwk.py @@ -36,7 +36,7 @@ import fidle.config as config datasets_dir = None -notebook_name = None +notebook_id = None _save_figs = False _figs_dir = './figs' @@ -51,13 +51,13 @@ _end_time = None # ------------------------------------------------------------- # def init(name=None, mplstyle=None, cssfile=None): - global notebook_name + global notebook_id global datasets_dir global _start_time # ---- Parameters # - notebook_name = config.DEFAULT_NOTEBOOK_NAME if name is None else name + notebook_id = config.DEFAULT_NOTEBOOK_NAME if name is None else name if mplstyle is None: mplstyle = config.FIDLE_MPLSTYLE @@ -89,14 +89,14 @@ def init(name=None, mplstyle=None, cssfile=None): # ---- Hello world print('\nFIDLE 2020 - Practical Work Module') print('Version :', config.VERSION) - print('Notebook name :',notebook_name) - print('Run time :',_start_time.strftime("%A %-d %B %Y, %H:%M:%S")) + print('Notebook id :', notebook_id) + print('Run time :', _start_time.strftime("%A %-d %B %Y, %H:%M:%S")) print('TensorFlow version :', tf.__version__) print('Keras version :', tf.keras.__version__) print('Datasets dir :', datasets_dir) print('Update keras cache :',updated) - update_finished_file(end=False) + update_finished_file(start=True) return datasets_dir @@ -603,16 +603,17 @@ def check_finished_file(): def reset_finished_file(): - if check_finished_file() is False : return + if check_finished_file()==False : return data={} # ---- Save it with open(config.FINISHED_FILE,'wt') as fp: json.dump(data,fp,indent=4) + print(f'Finished file has been reset.\n') -def update_finished_file(end=False): +def update_finished_file(start=False, end=False): - # ---- No finished file ? + # ---- No writable finished file ? if check_finished_file() is False : return # ---- Load it @@ -620,16 +621,17 @@ def update_finished_file(end=False): data = json.load(fp) # ---- Update as a start - data[notebook_name] = {} - data[notebook_name]['path'] = os.getcwd() - data[notebook_name]['start'] = _start_time.strftime("%A %-d %B %Y, %H:%M:%S") - data[notebook_name]['end'] = '' - data[notebook_name]['duration'] = 'Pending...' + if start is True: + data[notebook_id] = {} + data[notebook_id]['path'] = os.getcwd() + data[notebook_id]['start'] = _start_time.strftime("%A %-d %B %Y, %H:%M:%S") + data[notebook_id]['end'] = '' + data[notebook_id]['duration'] = 'Pending...' # ---- Update as an end if end is True: - data[notebook_name]['end'] = _end_time.strftime("%A %-d %B %Y, %H:%M:%S") - data[notebook_name]['duration'] = hdelay_ms(_end_time - _start_time) + data[notebook_id]['end'] = _end_time.strftime("%A %-d %B %Y, %H:%M:%S") + data[notebook_id]['duration'] = hdelay_ms(_end_time - _start_time) # ---- Save it with open(config.FINISHED_FILE,'wt') as fp: -- GitLab