From b21e848bef2a97487fb0e84dba15c3b60623ee57 Mon Sep 17 00:00:00 2001 From: Jeremy Leipzig Date: Tue, 30 Jun 2020 14:20:11 -0400 Subject: [PATCH 1/3] moige --- AUTHORS.rst | 5 + CHANGELOG.rst | 10 + LICENSE.txt | 21 + README.rst | 19 + docs/Makefile | 193 +++++ docs/_static/.gitignore | 1 + docs/authors.rst | 2 + docs/changelog.rst | 2 + docs/conf.py | 272 ++++++++ docs/index.rst | 59 ++ docs/license.rst | 7 + setup.cfg | 121 ++++ setup.py | 26 +- src/myhelpers/TrialStatistics.py | 367 ++++++++++ src/myhelpers/ZCA.py | 52 ++ src/myhelpers/__init__.py | 5 + src/myhelpers/color_PCA.py | 51 ++ src/myhelpers/config_plots.py | 25 + src/myhelpers/confusion_matrix_plotter.py | 95 +++ src/myhelpers/dataset_normalization.py | 25 + src/myhelpers/earlystopping.py | 53 ++ src/myhelpers/skeleton.py | 115 +++ tests/conftest.py | 10 + tests/experiment/agg_experiments.csv | 5 + tests/experiment/aggregated statistics.html | 70 ++ tests/experiment/plot by batchSize.pdf | Bin 0 -> 9952 bytes tests/experiment/plot.pdf | Bin 0 -> 8993 bytes tests/experiment/raw statistics.html | 81 +++ tests/experiment/raw_experiments.csv | 16 + tests/test-TrialStatistics.ipynb | 738 ++++++++++++++++++++ tests/test_skeleton.py | 16 + 31 files changed, 2459 insertions(+), 3 deletions(-) create mode 100644 AUTHORS.rst create mode 100644 CHANGELOG.rst create mode 100644 LICENSE.txt create mode 100644 README.rst create mode 100644 docs/Makefile create mode 100644 docs/_static/.gitignore create mode 100644 docs/authors.rst create mode 100644 docs/changelog.rst create mode 100644 docs/conf.py create mode 100644 docs/index.rst create mode 100644 docs/license.rst create mode 100644 setup.cfg create mode 100644 src/myhelpers/TrialStatistics.py create mode 100644 src/myhelpers/ZCA.py create mode 100644 src/myhelpers/__init__.py create mode 100644 src/myhelpers/color_PCA.py create mode 100644 src/myhelpers/config_plots.py create mode 100644 src/myhelpers/confusion_matrix_plotter.py create mode 100644 src/myhelpers/dataset_normalization.py create mode 100644 src/myhelpers/earlystopping.py create mode 100644 src/myhelpers/skeleton.py create mode 100644 tests/conftest.py create mode 100644 tests/experiment/agg_experiments.csv create mode 100644 tests/experiment/aggregated statistics.html create mode 100644 tests/experiment/plot by batchSize.pdf create mode 100644 tests/experiment/plot.pdf create mode 100644 tests/experiment/raw statistics.html create mode 100644 tests/experiment/raw_experiments.csv create mode 100644 tests/test-TrialStatistics.ipynb create mode 100644 tests/test_skeleton.py diff --git a/AUTHORS.rst b/AUTHORS.rst new file mode 100644 index 0000000..258a092 --- /dev/null +++ b/AUTHORS.rst @@ -0,0 +1,5 @@ +============ +Contributors +============ + +* Mohannad Elhamod diff --git a/CHANGELOG.rst b/CHANGELOG.rst new file mode 100644 index 0000000..226e6f5 --- /dev/null +++ b/CHANGELOG.rst @@ -0,0 +1,10 @@ +========= +Changelog +========= + +Version 0.1 +=========== + +- Feature A added +- FIX: nasty bug #1729 fixed +- add your changes here! diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..d0d5772 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2020 Mohannad Elhamod + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..28650cf --- /dev/null +++ b/README.rst @@ -0,0 +1,19 @@ +========= +myhelpers +========= + + +utilities for ML stuff related to BGNN + + +Description +=========== + +A longer description of your project goes here... + + +Note +==== + +This project has been set up using PyScaffold 3.2.3. For details and usage +information on PyScaffold see https://pyscaffold.org/. diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..99ff57d --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,193 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = ../build/sphinx/ +AUTODOCDIR = api +AUTODOCBUILD = sphinx-apidoc +PROJECT = myhelpers +MODULEDIR = ../src/myhelpers + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext doc-requirements + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + rm -rf $(BUILDDIR)/* $(AUTODOCDIR) + +$(AUTODOCDIR): $(MODULEDIR) + mkdir -p $@ + $(AUTODOCBUILD) -f -o $@ $^ + +doc-requirements: $(AUTODOCDIR) + +html: doc-requirements + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: doc-requirements + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: doc-requirements + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: doc-requirements + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: doc-requirements + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: doc-requirements + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: doc-requirements + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/$(PROJECT).qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/$(PROJECT).qhc" + +devhelp: doc-requirements + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $HOME/.local/share/devhelp/$(PROJECT)" + @echo "# ln -s $(BUILDDIR)/devhelp $HOME/.local/share/devhelp/$(PROJEC)" + @echo "# devhelp" + +epub: doc-requirements + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +patch-latex: + find _build/latex -iname "*.tex" | xargs -- \ + sed -i'' 's~includegraphics{~includegraphics\[keepaspectratio,max size={\\textwidth}{\\textheight}\]{~g' + +latex: doc-requirements + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + $(MAKE) patch-latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: doc-requirements + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + $(MAKE) patch-latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +latexpdfja: doc-requirements + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: doc-requirements + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: doc-requirements + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: doc-requirements + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: doc-requirements + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: doc-requirements + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: doc-requirements + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: doc-requirements + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: doc-requirements + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +xml: doc-requirements + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +pseudoxml: doc-requirements + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/docs/_static/.gitignore b/docs/_static/.gitignore new file mode 100644 index 0000000..3c96363 --- /dev/null +++ b/docs/_static/.gitignore @@ -0,0 +1 @@ +# Empty directory diff --git a/docs/authors.rst b/docs/authors.rst new file mode 100644 index 0000000..cd8e091 --- /dev/null +++ b/docs/authors.rst @@ -0,0 +1,2 @@ +.. _authors: +.. include:: ../AUTHORS.rst diff --git a/docs/changelog.rst b/docs/changelog.rst new file mode 100644 index 0000000..871950d --- /dev/null +++ b/docs/changelog.rst @@ -0,0 +1,2 @@ +.. _changes: +.. include:: ../CHANGELOG.rst diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..76922a5 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,272 @@ +# -*- coding: utf-8 -*- +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import os +import sys +import inspect +import shutil + +__location__ = os.path.join(os.getcwd(), os.path.dirname( + inspect.getfile(inspect.currentframe()))) + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +sys.path.insert(0, os.path.join(__location__, '../src')) + +# -- Run sphinx-apidoc ------------------------------------------------------ +# This hack is necessary since RTD does not issue `sphinx-apidoc` before running +# `sphinx-build -b html . _build/html`. See Issue: +# https://github.com/rtfd/readthedocs.org/issues/1139 +# DON'T FORGET: Check the box "Install your project inside a virtualenv using +# setup.py install" in the RTD Advanced Settings. +# Additionally it helps us to avoid running apidoc manually + +try: # for Sphinx >= 1.7 + from sphinx.ext import apidoc +except ImportError: + from sphinx import apidoc + +output_dir = os.path.join(__location__, "api") +module_dir = os.path.join(__location__, "../src/myhelpers") +try: + shutil.rmtree(output_dir) +except FileNotFoundError: + pass + +try: + import sphinx + from pkg_resources import parse_version + + cmd_line_template = "sphinx-apidoc -f -o {outputdir} {moduledir}" + cmd_line = cmd_line_template.format(outputdir=output_dir, moduledir=module_dir) + + args = cmd_line.split(" ") + if parse_version(sphinx.__version__) >= parse_version('1.7'): + args = args[1:] + + apidoc.main(args) +except Exception as e: + print("Running `sphinx-apidoc` failed!\n{}".format(e)) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'sphinx.ext.todo', + 'sphinx.ext.autosummary', 'sphinx.ext.viewcode', 'sphinx.ext.coverage', + 'sphinx.ext.doctest', 'sphinx.ext.ifconfig', 'sphinx.ext.mathjax', + 'sphinx.ext.napoleon'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +# source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'myhelpers' +copyright = u'2020, Mohannad Elhamod' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '' # Is set by calling `setup.py docs` +# The full version, including alpha/beta/rc tags. +release = '' # Is set by calling `setup.py docs` + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +# today = '' +# Else, today_fmt is used as the format for a strftime call. +# today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all documents. +# default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +# add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +# add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +# show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +# modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +# keep_warnings = False + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +html_theme_options = { + 'sidebar_width': '300px', + 'page_width': '1200px' +} + +# Add any paths that contain custom themes here, relative to this directory. +# html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +try: + from myhelpers import __version__ as version +except ImportError: + pass +else: + release = version + +# A shorter title for the navigation bar. Default is the same as html_title. +# html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +# html_logo = "" + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +# html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +# html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +# html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +# html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +# html_additional_pages = {} + +# If false, no module index is generated. +# html_domain_indices = True + +# If false, no index is generated. +# html_use_index = True + +# If true, the index is split into individual pages for each letter. +# html_split_index = False + +# If true, links to the reST sources are added to the pages. +# html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +# html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +# html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +# html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +# html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'myhelpers-doc' + + +# -- Options for LaTeX output -------------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +# 'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +# 'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +# 'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'user_guide.tex', u'myhelpers Documentation', + u'Mohannad Elhamod', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +# latex_logo = "" + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +# latex_use_parts = False + +# If true, show page references after internal links. +# latex_show_pagerefs = False + +# If true, show URL addresses after external links. +# latex_show_urls = False + +# Documents to append as an appendix to all manuals. +# latex_appendices = [] + +# If false, no module index is generated. +# latex_domain_indices = True + +# -- External mapping ------------------------------------------------------------ +python_version = '.'.join(map(str, sys.version_info[0:2])) +intersphinx_mapping = { + 'sphinx': ('http://www.sphinx-doc.org/en/stable', None), + 'python': ('https://docs.python.org/' + python_version, None), + 'matplotlib': ('https://matplotlib.org', None), + 'numpy': ('https://docs.scipy.org/doc/numpy', None), + 'sklearn': ('http://scikit-learn.org/stable', None), + 'pandas': ('http://pandas.pydata.org/pandas-docs/stable', None), + 'scipy': ('https://docs.scipy.org/doc/scipy/reference', None), +} diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..9a852f4 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,59 @@ +========= +myhelpers +========= + +This is the documentation of **myhelpers**. + +.. note:: + + This is the main page of your project's `Sphinx`_ documentation. + It is formatted in `reStructuredText`_. Add additional pages + by creating rst-files in ``docs`` and adding them to the `toctree`_ below. + Use then `references`_ in order to link them from this page, e.g. + :ref:`authors` and :ref:`changes`. + + It is also possible to refer to the documentation of other Python packages + with the `Python domain syntax`_. By default you can reference the + documentation of `Sphinx`_, `Python`_, `NumPy`_, `SciPy`_, `matplotlib`_, + `Pandas`_, `Scikit-Learn`_. You can add more by extending the + ``intersphinx_mapping`` in your Sphinx's ``conf.py``. + + The pretty useful extension `autodoc`_ is activated by default and lets + you include documentation from docstrings. Docstrings can be written in + `Google style`_ (recommended!), `NumPy style`_ and `classical style`_. + + +Contents +======== + +.. toctree:: + :maxdepth: 2 + + License + Authors + Changelog + Module Reference + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +.. _toctree: http://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html +.. _reStructuredText: http://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html +.. _references: http://www.sphinx-doc.org/en/stable/markup/inline.html +.. _Python domain syntax: http://sphinx-doc.org/domains.html#the-python-domain +.. _Sphinx: http://www.sphinx-doc.org/ +.. _Python: http://docs.python.org/ +.. _Numpy: http://docs.scipy.org/doc/numpy +.. _SciPy: http://docs.scipy.org/doc/scipy/reference/ +.. _matplotlib: https://matplotlib.org/contents.html# +.. _Pandas: http://pandas.pydata.org/pandas-docs/stable +.. _Scikit-Learn: http://scikit-learn.org/stable +.. _autodoc: http://www.sphinx-doc.org/en/stable/ext/autodoc.html +.. _Google style: https://github.com/google/styleguide/blob/gh-pages/pyguide.md#38-comments-and-docstrings +.. _NumPy style: https://numpydoc.readthedocs.io/en/latest/format.html +.. _classical style: http://www.sphinx-doc.org/en/stable/domains.html#info-field-lists diff --git a/docs/license.rst b/docs/license.rst new file mode 100644 index 0000000..3989c51 --- /dev/null +++ b/docs/license.rst @@ -0,0 +1,7 @@ +.. _license: + +======= +License +======= + +.. include:: ../LICENSE.txt diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..4d5db1e --- /dev/null +++ b/setup.cfg @@ -0,0 +1,121 @@ +# This file is used to configure your project. +# Read more about the various options under: +# http://setuptools.readthedocs.io/en/latest/setuptools.html#configuring-setup-using-setup-cfg-files + +[metadata] +name = myhelpers +description = utilities for ML stuff related to BGNN +author = Mohannad Elhamod +author-email = elhamod@vt.edu +license = mit +long-description = file: README.rst +long-description-content-type = text/x-rst; charset=UTF-8 +url = https://github.com/pyscaffold/pyscaffold/ +project-urls = + Documentation = https://pyscaffold.org/ +# Change if running only on Windows, Mac or Linux (comma-separated) +platforms = any +# Add here all kinds of additional classifiers as defined under +# https://pypi.python.org/pypi?%3Aaction=list_classifiers +classifiers = + Development Status :: 4 - Beta + Programming Language :: Python + +[options] +zip_safe = False +packages = find: +include_package_data = True +package_dir = + =src +# DON'T CHANGE THE FOLLOWING LINE! IT WILL BE UPDATED BY PYSCAFFOLD! +setup_requires = pyscaffold>=3.2a0,<3.3a0 +# Add here dependencies of your project (semicolon/line-separated), e.g. +# install_requires = numpy; scipy +# The usage of test_requires is discouraged, see `Dependency Management` docs +# tests_require = pytest; pytest-cov +# Require a specific Python version, e.g. Python 2.7 or >= 3.4 +# python_requires = >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* +install_requires = + pandas==1.0.5 + ipython==7.16.1 + scikit-learn==0.23.1 + matplotlib==3.2.2 + pivottablejs==0.9.0 + torch==1.5.1 + torchvision==0.6.1 + +[options.packages.find] +where = src +exclude = + tests + +[options.extras_require] +# Add here additional requirements for extra features, to install with: +# `pip install myhelpers[PDF]` like: +# PDF = ReportLab; RXP +# Add here test requirements (semicolon/line-separated) +testing = + pytest + pytest-cov + +[options.entry_points] +# Add here console scripts like: +# console_scripts = +# script_name = myhelpers.module:function +# For example: +# console_scripts = +# fibonacci = myhelpers.skeleton:run +# And any other entry points, for example: +# pyscaffold.cli = +# awesome = pyscaffoldext.awesome.extension:AwesomeExtension + +[test] +# py.test options when running `python setup.py test` +# addopts = --verbose +extras = True + +[tool:pytest] +# Options for py.test: +# Specify command line options as you would do when invoking py.test directly. +# e.g. --cov-report html (or xml) for html/xml output or --junitxml junit.xml +# in order to write a coverage file that can be read by Jenkins. +addopts = + --cov myhelpers --cov-report term-missing + --verbose +norecursedirs = + dist + build + .tox +testpaths = tests + +[aliases] +dists = bdist_wheel + +[bdist_wheel] +# Use this option if your package is pure-python +universal = 1 + +[build_sphinx] +source_dir = docs +build_dir = build/sphinx + +[devpi:upload] +# Options for the devpi: PyPI server and packaging tool +# VCS export must be deactivated since we are using setuptools-scm +no-vcs = 1 +formats = bdist_wheel + +[flake8] +# Some sane defaults for the code style checker flake8 +exclude = + .tox + build + dist + .eggs + docs/conf.py + +[pyscaffold] +# PyScaffold's parameters when the project was created. +# This will be used when updating. Do not change! +version = 3.2.3 +package = myhelpers diff --git a/setup.py b/setup.py index df4a032..2d44c9d 100644 --- a/setup.py +++ b/setup.py @@ -1,3 +1,23 @@ -from setuptools import setup, find_packages - -setup(name='myhelpers', version='1.0', packages=find_packages(where="helpers", exclude=["tests"])) # , include=["color.PCA.py","config_plots.py", "ZCA.py", "TrialStatistics.py", "confusion_matrix_plotter.py", "earlystopping.py", "dataset_normalization.py" ] +# -*- coding: utf-8 -*- +""" + Setup file for myhelpers. + Use setup.cfg to configure your project. + + This file was generated with PyScaffold 3.2.3. + PyScaffold helps you to put up the scaffold of your new Python project. + Learn more under: https://pyscaffold.org/ +""" +import sys + +from pkg_resources import VersionConflict, require +from setuptools import setup + +try: + require('setuptools>=38.3') +except VersionConflict: + print("Error: version of setuptools is too old (<38.3)!") + sys.exit(1) + + +if __name__ == "__main__": + setup(use_pyscaffold=True) diff --git a/src/myhelpers/TrialStatistics.py b/src/myhelpers/TrialStatistics.py new file mode 100644 index 0000000..b47be1d --- /dev/null +++ b/src/myhelpers/TrialStatistics.py @@ -0,0 +1,367 @@ +import pandas as pd +from IPython.display import display, HTML +import os +from sklearn.metrics import confusion_matrix +import numpy as np +import json +import hashlib + +import statistics +# import qgrid +import matplotlib.pyplot as plt +from pivottablejs import pivot_ui + +from .confusion_matrix_plotter import plot_confusion_matrix, generate_classification_report + +aggregateStatFileName = "agg_experiments.csv" +rawStatFileName = "raw_experiments.csv" +confusionMatrixParamsFileName="params.json" +confusionMatrixFileName = "confusion_matrix.pdf" + + +# Given a confusion matrix, gets metris of fine with respect to coarse +class fine_Coarse_Statistics: + def __init__(self, cm, dataset): + self.dataset = dataset + self.cm = cm + + def get_statistics(self, fine_index): + true_positives = self.cm[fine_index, fine_index] + fine_name = self.dataset.getfineOfIndex(fine_index) + fine_names = self.dataset.getfineWithinCoarse(self.dataset.getCoarseFromfine(fine_name)) + fine_indexes = list(map(lambda x: self.dataset.getfineList().index(x), fine_names)) + + within_coarse_FP = np.sum(self.cm[fine_indexes, fine_index]) - true_positives + out_of_coarse_FP = np.sum(self.cm[:, fine_index]) - true_positives - within_coarse_FP + within_coarse_FN = np.sum(self.cm[fine_index, fine_indexes]) - true_positives + out_of_coarse_FN = np.sum(self.cm[fine_index, :]) - true_positives - within_coarse_FN + return { + "TP": true_positives, + "FP_within_coarse": within_coarse_FP, + "FP_out_of_coarse": out_of_coarse_FP, + "FN_within_coarse": within_coarse_FN, + "FN_out_of_coarse": out_of_coarse_FN, + } + + def get_precision_recall(self, fine_index): + fine_statistics = self.get_statistics(fine_index) + + TP = fine_statistics["TP"] + FP_within_coarse = fine_statistics["FP_within_coarse"] + FP_out_of_coarse = fine_statistics["FP_out_of_coarse"] + FN_within_coarse = fine_statistics["FN_within_coarse"] + FN_out_of_coarse = fine_statistics["FN_out_of_coarse"] + + Precision_within_coarse = TP/(TP + FP_within_coarse) if (TP + FP_within_coarse) != 0 else 0 + Precision_out_of_coarse = TP/(TP + FP_out_of_coarse) if (TP + FP_out_of_coarse) != 0 else 0 + Recall_within_coarse = TP/(TP + FN_within_coarse) if (TP + FN_within_coarse) != 0 else 0 + Recall_out_of_coarse = TP/(TP + FN_out_of_coarse) if (TP + FN_out_of_coarse) != 0 else 0 + Precision = TP/(TP + FP_within_coarse + FP_out_of_coarse) if (TP + FP_within_coarse + FP_out_of_coarse) != 0 else 0 + Recall = TP/(TP + FN_within_coarse + FN_out_of_coarse) if (TP + FN_within_coarse + FN_out_of_coarse) != 0 else 0 + + return { + "Precision_within_coarse": Precision_within_coarse, + "Precision_out_of_coarse": Precision_out_of_coarse, + "Recall_within_coarse": Recall_within_coarse, + "Recall_out_of_coarse": Recall_out_of_coarse, + "Precision": Precision, + "Recall": Recall, + } + + def get_F1Scores(self, fine_index): + precision_recall_stats = self.get_precision_recall(fine_index) + + within_coarse_stats = [precision_recall_stats["Precision_within_coarse"], precision_recall_stats["Recall_within_coarse"]] + f1_macro_within_coarse = statistics.harmonic_mean(within_coarse_stats) + + out_of_coarse_stats = [precision_recall_stats["Precision_out_of_coarse"], precision_recall_stats["Recall_out_of_coarse"]] + f1_macro_out_of_coarse = statistics.harmonic_mean(out_of_coarse_stats) + + overall_stats = [precision_recall_stats["Precision"], precision_recall_stats["Recall"]] + f1_macro = statistics.harmonic_mean(overall_stats) + + return { + "f1_macro_within_coarse": f1_macro_within_coarse, + "f1_macro_out_of_coarse": f1_macro_out_of_coarse, + "f1_macro": f1_macro, + } + +# Given a confusion matrix, get statistics of coarse labels +class Coarse_Statistics: + def __init__(self, cm, dataset): + self.dataset = dataset + self.cm = cm + + def get_statistics(self, coarse_index): + true_positives = self.cm[coarse_index, coarse_index] + + FP = np.sum(self.cm[:, coarse_index]) - true_positives + FN = np.sum(self.cm[coarse_index, :]) - true_positives + return { + "TP": true_positives, + "FP": FP, + "FN": FN, + } + + def get_precision_recall(self, coarse_index): + fine_statistics = self.get_statistics(coarse_index) + + TP = fine_statistics["TP"] + FP = fine_statistics["FP"] + FN = fine_statistics["FN"] + + Precision = TP/(TP + FP) if (TP + FP) != 0 else 0 + Recall = TP/(TP + FN) if (TP + FN) != 0 else 0 + + return { + "Precision": Precision, + "Recall": Recall, + } + + def get_F1Scores(self, coarse_index): + precision_recall_stats = self.get_precision_recall(coarse_index) + + overall_stats = [precision_recall_stats["Precision"], precision_recall_stats["Recall"]] + f1_macro = statistics.harmonic_mean(overall_stats) + + return { + "f1_macro": f1_macro, + } + + +# Allows for addin trial results and then aggregating them +class TrialStatistics: + def __init__(self, experiment_name, prefix=None): + self.df = pd.DataFrame() + self.agg_df = pd.DataFrame() + self.experiment_name = experiment_name + + if not os.path.exists(self.experiment_name): + os.makedirs(self.experiment_name) + + self.prefix = prefix + self.trial_params_keys = [] + self.trial_results_keys = [] + + self.confusionMatrices = {} + self.agg_confusionMatrices = {} + + # Adds the parameters and results of a trial + def addTrial(self, trial_params, trial_results, trial=None): + # Reset aggregate information + self.agg_df = pd.DataFrame() + + # preprocess + trial_params_copy = self.preProcessParameters(trial_params) + row_hash = {'experimentHash': getTrialName(trial_params_copy)} + trial_params_with_hash = {**trial_params_copy, **row_hash} + row_information = {**trial_params_copy, **trial_results} + row_information = {**row_information, **row_hash} + + # Augment row information + if trial is not None: + row_information["trial"] = trial + row_information["trialHash"] = getTrialName(trial_params_copy, trial) + + # Add row + self.df = self.df.append(pd.DataFrame(row_information, index=[0]), ignore_index = True) + + # populate param and result lists keys + for key in trial_params_with_hash: + if key not in self.trial_params_keys: + self.trial_params_keys.append(key) + + for key in trial_results: + if key not in self.trial_results_keys: + self.trial_results_keys.append(key) + + # Adds the predictions for confusion matrix calculations + def addTrialPredictions(self, trial_params, predlist, lbllist, numberOffine): + self.agg_confusionMatrices = {} + # Confusion matrix + conf_mat=confusion_matrix(lbllist.cpu().numpy(), predlist.cpu().numpy(), labels = range(numberOffine)) + trial_params_copy = self.preProcessParameters(trial_params) + trial_hash = getTrialName(trial_params_copy) + if trial_hash not in self.confusionMatrices: + self.confusionMatrices[trial_hash] = [] + self.confusionMatrices[trial_hash].append(conf_mat) + + def aggregateTrials(self): + # group by trial params + groupedBy_df = self.df.groupby(self.trial_params_keys) + + # For each result key, calculate mean and std + for key in self.trial_results_keys: + groupedBy_df_summaried = groupedBy_df.agg({key:['mean','std']}) + self.agg_df = pd.concat([self.agg_df,groupedBy_df_summaried], axis=1, ignore_index=False) + + self.agg_df = self.agg_df.round(3).reset_index() + + def saveStatistics(self, aggregated=True): + if aggregated: + file_name = aggregateStatFileName + else: + file_name = rawStatFileName + + if self.prefix is not None: + file_name = self.prefix + "_" + file_name + + if aggregated: + if self.agg_df.empty: + self.aggregateTrials() + self.agg_df.to_csv(os.path.join(self.experiment_name, file_name)) + else: + self.df.to_csv(os.path.join(self.experiment_name, file_name)) + + def showStatistics(self, aggregated=True, saveHTML=False): + df = self.df.copy() + if aggregated: + if self.agg_df.empty: + self.aggregateTrials() + df = self.agg_df.copy() + + name = "aggregated statistics" if aggregated else "raw statistics" + name_html = name+'.html' +# df.columns = [' '.join(col).strip() for col in df.columns.values] # work around:https://github.com/quantopian/qgrid/issues/18#issuecomment-149321165 +# return qgrid.show_grid(df, show_toolbar=True) + display(HTML(df.to_html())) + if saveHTML: + pivot_ui(df,outfile_path=os.path.join(self.experiment_name, name_html)) +# display(HTML(self.experiment_name+"/"+name_html)) + + def getStatistic(self, trial_params, metric, statistic): + if self.agg_df.empty: + self.aggregateTrials() + trial_params_copy = self.preProcessParameters(trial_params) + row = self.agg_df.loc[self.agg_df['experimentHash'] == getTrialName(trial_params_copy)] + return row[self.trial_results_keys][(metric, statistic)].item() + + + + + + + # prints aggregate confusion matrix for trials + def printTrialConfusionMatrix(self, trial_params, lst, printOutput=False): + aggregatePath = os.path.join(self.experiment_name, getTrialName(trial_params)) + if not os.path.exists(aggregatePath): + os.makedirs(aggregatePath) + + file_name = confusionMatrixFileName + if self.prefix is not None: + file_name = self.prefix + "_" + file_name + + j = json.dumps(trial_params) + f = open(os.path.join(aggregatePath, confusionMatrixParamsFileName),"w") + f.write(j) + f.close() + + return plot_confusion_matrix(self.getTrialConfusionMatrix(trial_params), + lst, + aggregatePath, + file_name, + printOutput) + + def aggregateTrialConfusionMatrices(self): + for hash_key in self.confusionMatrices: + confusionMatricesForHash = self.confusionMatrices[hash_key] + self.agg_confusionMatrices[hash_key] = np.mean(confusionMatricesForHash, axis=0) + + def prepareConfusionMatrix(self, trial_params): + if not self.agg_confusionMatrices: + self.aggregateTrialConfusionMatrices() + + def getTrialConfusionMatrix(self, trial_params): + self.prepareConfusionMatrix(trial_params) + + return self.agg_confusionMatrices[getTrialName(trial_params)] + + + + + def printF1table(self, trial_params, dataset): + cm = self.getTrialConfusionMatrix(trial_params) + + if self.prefix == "coarse": + columns = ['coarse', 'F1'] + else: + columns = ['fine', 'coarse', 'F1'] +# if trial_params['useHeirarchy']: + columns = columns + ['F1_within_coarse', 'F1_out_of_coarse'] + + df = pd.DataFrame(columns=columns) + + if self.prefix == "coarse": + stats = Coarse_Statistics(cm, dataset) + for coarse_name in dataset.getCoarseList(): + coarse_index = dataset.getCoarseList().index(coarse_name) + coarse_stats = stats.get_F1Scores(coarse_index) + df.loc[coarse_index] = [" ".join([str(coarse_index), coarse_name]), + coarse_stats["f1_macro"]] + else: + stats = fine_Coarse_Statistics(cm, dataset) + for fine in range(len(dataset.getfineList())): + fine_stats = stats.get_F1Scores(fine) + fine_name = dataset.getfineOfIndex(fine) + coarse_name = dataset.getCoarseFromfine(fine_name) + coarse_index = dataset.getCoarseList().index(coarse_name) + vals = [" ".join([str(fine), str(fine_name)]), + " ".join([str(coarse_index), str(coarse_name)]), + fine_stats["f1_macro"],] +# if trial_params['useHeirarchy']: + vals = vals + [ fine_stats["f1_macro_within_coarse"], + fine_stats["f1_macro_out_of_coarse"]] + df.loc[fine] = vals + + display(HTML(df.to_html())) + file_name = "F1_Scores" + if self.prefix == "coarse": + file_name = file_name + "_coarse" + pivot_ui(df,outfile_path=os.path.join(self.experiment_name, file_name+".html")) + + + + def trialScatter(self, x, y, aggregatedBy=None, save_plot=False): + df = self.df + + file_name = 'plot' + ((' by ' + aggregatedBy) if aggregatedBy is not None else '') + + + # get unique values for aggregate by + uniqueValues=['all'] + if aggregatedBy is not None: + uniqueValues=df[aggregatedBy].unique() + + # prepare axis + fig=plt.figure() + ax=fig.add_axes([0,0,1,1]) + ax.set_xlabel(x) + ax.set_ylabel(y) + + + for val in uniqueValues: + if aggregatedBy: + x_values = df.loc[df[aggregatedBy] == val][x].values + y_values = df.loc[df[aggregatedBy] == val][y].values + else: + x_values = df[x].values + y_values = df[y].values + + im = ax.scatter(x=x_values, + y=y_values, + label=val) + ax.legend() + + if save_plot: + fig.savefig(os.path.join(self.experiment_name, file_name+".pdf")) + + + def preProcessParameters(self, trial_params): + trial_params_copy = {**trial_params, **{}} + return trial_params_copy + +def getTrialName(trial_params, trial_number=None): + trialName = str(trial_params) + if trial_number is not None: + trialName = trialName + str(trial_number) + return hashlib.sha224(trialName.encode('utf-8')).hexdigest() \ No newline at end of file diff --git a/src/myhelpers/ZCA.py b/src/myhelpers/ZCA.py new file mode 100644 index 0000000..9d277a3 --- /dev/null +++ b/src/myhelpers/ZCA.py @@ -0,0 +1,52 @@ +import numpy as np +import torch + +class ZCA: + def __init__(self, data): + self.epsilon = 1e-5 + self.mean = None + self.std = None + + self.data = self.scaleData(data) + + def computeZCAMatrix(self): + #This function computes the ZCA matrix for a set of observables X where + #rows are the observations and columns are thde variables (M x C x W x H matrix) + #C is number of color channels and W x H is width and height of each image + + #reshape data from M x C x W x H to M x N where N=C x W x H + X = self.data + X = X.reshape(-1, X.shape[1]*X.shape[2]*X.shape[3]) + + # compute the covariance + cov = np.cov(X, rowvar=False) # cov is (N, N) + + # singular value decomposition + U,S,V = np.linalg.svd(cov) # U is (N, N), S is (N,1) V is (N,N) + # build the ZCA matrix which is (N,N) + self.zca_matrix = np.dot(U, np.dot(np.diag(1.0/np.sqrt(S + self.epsilon)), U.T)) + + + return torch.from_numpy(self.zca_matrix).float() + + def scaleData(self, data): + data=np.stack(data, axis=0) + + #normalize the data to [0 1] range + data=data/255 + + #compute mean and std and normalize the data to -1 1 range with 1 std + if self.mean is None: + self.mean=(data.mean(axis=0)) + if self.std is None: + self.std=(data.std(axis=0)) + +# scaled = torch.tensor(np.multiply(1/(self.std+self.epsilon),np.add(data,-self.mean))) + scaled = torch.tensor(np.add(data,-self.mean)) + return scaled + + def scaleSampleToUnity(self, sample): + scaled = (sample - sample.min())/(sample.max() - sample.min()) + return scaled + + \ No newline at end of file diff --git a/src/myhelpers/__init__.py b/src/myhelpers/__init__.py new file mode 100644 index 0000000..ee2f844 --- /dev/null +++ b/src/myhelpers/__init__.py @@ -0,0 +1,5 @@ +# import color_PCA +# import config_plots +# import confusion_matrix_plotter +# import TrialStatistics +# import ZCA \ No newline at end of file diff --git a/src/myhelpers/color_PCA.py b/src/myhelpers/color_PCA.py new file mode 100644 index 0000000..32fb1bc --- /dev/null +++ b/src/myhelpers/color_PCA.py @@ -0,0 +1,51 @@ +import numpy as np +import torch + +class Color_PCA(): + def __init__(self, loader, magnitude=0.1, minimum=0.0, maximum=1.0): #loader + # if torch.cuda.is_available(): + # samples = samples.cpu() + samples = None + for batch in loader: + images = batch["image"] + if torch.cuda.is_available(): + images = images.cpu() + + if samples is None: + samples = images + else: + samples=np.concatenate((images,samples), 0) + + samples = np.transpose(samples, (0, 2, 3, 1)) + samples = samples.reshape((-1, 3)) + # samples -= np.mean(samples, axis=0) + # samples /= np.std(samples, axis=0) + + self.cov = np.cov(samples, rowvar=False) + + self.lambdas, self.p = np.linalg.eig(self.cov) + + self.minimum = minimum + self.maximum = maximum + self.magnitude = magnitude + + def perturb_color(self, img): + alphas = np.random.normal(0, self.magnitude, 3) + + delta = np.dot(self.p, alphas*self.lambdas) + delta = torch.from_numpy(delta).unsqueeze(0) + + # if torch.cuda.is_available(): + # delta = delta.cuda() + + # mean = torch.mean(img, axis=0) + # std = torch.std(img, axis=0) + delta = delta.view(3, 1,1).expand_as(img) + # print('delta',delta) + # print('img',img) + pca_augmentation_version_img = img + delta # + # print('pca_augmentation_version_img',pca_augmentation_version_img) + # print('maxed',torch.clamp(pca_augmentation_version_img, self.minimum, self.maximum)) + # pca_color_image = pca_augmentation_version_img * std + mean + # torch.maximum(torch.minimum(pca_color_image, 1), 0) + return torch.clamp(pca_augmentation_version_img, self.minimum, self.maximum) \ No newline at end of file diff --git a/src/myhelpers/config_plots.py b/src/myhelpers/config_plots.py new file mode 100644 index 0000000..fd76837 --- /dev/null +++ b/src/myhelpers/config_plots.py @@ -0,0 +1,25 @@ +import matplotlib + +def global_settings(): + pgf_with_latex = { # setup matplotlib to use latex for output + "pgf.texsystem": "pdflatex", # change this if using xetex or lautex + "text.usetex": True, # use LaTeX to write all text + "figure.figsize": (9, 5), # default fig size of 0.9 textwidth + "figure.dpi": 300, + "font.family": "serif", + "font.serif": [], # blank entries should cause plots to inherit fonts from the document + "font.sans-serif": [], + "font.monospace": [], + "axes.labelsize": 16, # LaTeX default is 10pt font. + 'axes.titlesize': 15, + "font.size": 19, + "legend.fontsize": 16, # Make the legend/label fonts a little smaller + "xtick.labelsize": 16, #23? + "ytick.labelsize": 16, +# "pgf.preamble": [ +# r"\usepackage[utf8x]{inputenc}", # use utf8 fonts becasue your computer can handle it :) +# r"\usepackage[T1]{fontenc}", # plots will be generated using this preamble +# ] + } + + matplotlib.rcParams.update(pgf_with_latex) \ No newline at end of file diff --git a/src/myhelpers/confusion_matrix_plotter.py b/src/myhelpers/confusion_matrix_plotter.py new file mode 100644 index 0000000..eb71f51 --- /dev/null +++ b/src/myhelpers/confusion_matrix_plotter.py @@ -0,0 +1,95 @@ +import numpy as np +import matplotlib.pyplot as plt +import itertools +from sklearn.metrics import classification_report +import os + +def generate_classification_report(lbllist, predlist, numberOfSpecies, experimentName): + classificationReport = classification_report(lbllist.cpu().numpy(), predlist.cpu().numpy(), labels = range(numberOfSpecies), digits=2) + classification_report_file = open(os.path.join(experimentName,"classification_report.txt"),"w") + classification_report_file.writelines(classificationReport) + classification_report_file.close() #to change file access modes + return classificationReport + +def plot_confusion_matrix(cm, + target_names, + experimentName, + fileName, + printOutput=False, + cmap=None, + normalize=True, +): + """ + given a sklearn confusion matrix (cm), make a nice plot + + Arguments + --------- + cm: confusion matrix from sklearn.metrics.confusion_matrix + + target_names: given classification classes such as [0, 1, 2] + the class names, for example: ['high', 'medium', 'low'] + + title: the text to display at the top of the matrix + + cmap: the gradient of the values displayed from matplotlib.pyplot.cm + see http://matplotlib.org/examples/color/colormaps_reference.html + plt.get_cmap('jet') or plt.cm.Blues + + normalize: If False, plot the raw numbers + If True, plot the proportions + + Usage + ----- + plot_confusion_matrix(cm = cm, # confusion matrix created by + # sklearn.metrics.confusion_matrix + normalize = True, # show proportions + target_names = y_labels_vals, # list of names of the classes + title = best_estimator_name) # title of graph + + Citiation + --------- + http://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html + + """ + + accuracy = np.trace(cm) / float(np.sum(cm)) + misclass = 1 - accuracy + + if cmap is None: + cmap = plt.get_cmap('Blues') + + plt.figure(figsize=(40, 40), dpi=300) + plt.title("Confusion Matrix") + + if target_names is not None: + tick_marks = np.arange(len(target_names)) + plt.xticks(tick_marks, target_names, rotation=90) + plt.yticks(tick_marks, target_names) + + if normalize: + cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis] + + plt.imshow(cm, cmap=cmap) # , interpolation='nearest' + plt.colorbar() + + + thresh = np.nanmax(cm) / 1.5 if normalize else np.nanmax(cm) / 2 + for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])): + if normalize: + plt.text(j, i, "{:0.2f}".format(cm[i, j]), + horizontalalignment="center", + color="white" if cm[i, j] > thresh else "black") + else: + plt.text(j, i, "{:,}".format(cm[i, j]), + horizontalalignment="center", + color="white" if cm[i, j] > thresh else "black") + + plt.tight_layout() + plt.ylabel('True label') + plt.xlabel('Predicted label\nAccuracy={:0.4f}'.format(accuracy)) + plt.tight_layout(rect=[0, 0.03, 1, 0.95]) + plt.savefig(os.path.join(experimentName, fileName)) + if printOutput: + plt.show() + plt.close() + return cm \ No newline at end of file diff --git a/src/myhelpers/dataset_normalization.py b/src/myhelpers/dataset_normalization.py new file mode 100644 index 0000000..4cf66d3 --- /dev/null +++ b/src/myhelpers/dataset_normalization.py @@ -0,0 +1,25 @@ +import torch +from torchvision import transforms + +class dataset_normalization(): + def __init__(self, dataset): + self.dataloader = torch.utils.data.DataLoader(dataset, batch_size=len(dataset)) + + def getTransform(self): + mean = 0. + std = 0. + nb_samples = 0. + + # Calculate the median per channel + for data in self.dataloader: + data = data["image"] + batch_samples = data.size(0) + data = data.view(batch_samples, data.size(1), -1) + mean += data.mean(-1).sum(0) + std += data.std(-1).sum(0) + nb_samples += batch_samples + + mean /= nb_samples + std /= nb_samples + print('dataset has a mean: {0} and std: {1}'.format(mean, std) ) + return [transforms.Normalize(mean, std)] \ No newline at end of file diff --git a/src/myhelpers/earlystopping.py b/src/myhelpers/earlystopping.py new file mode 100644 index 0000000..efedb6b --- /dev/null +++ b/src/myhelpers/earlystopping.py @@ -0,0 +1,53 @@ +import numpy as np +import torch +import copy + +class EarlyStopping: + """Early stops the training if validation loss doesn't improve after a given patience.""" + def __init__(self, path, patience=7, verbose=False): + """ + Args: + patience (int): How long to wait after last time validation loss improved. + Default: 7 + verbose (bool): If True, prints a message for each validation loss improvement. + Default: False + """ + self.patience = patience + self.verbose = verbose + self.counter = 0 + self.best_score = None + self.early_stop = False + self.best_iteration = 0 + self.val_loss_min = np.Inf + self.path=path + self.bestModelSoFar = None + + def __call__(self, val_loss, itr, model): + + score = -val_loss + + if self.best_score is None: + self.best_score = score + self.best_iteration = itr + self.save_checkpoint(val_loss, model) + elif score < self.best_score: + self.counter += 1 + if self.verbose: + print(f'EarlyStopping counter: {self.counter} out of {self.patience}') + if self.counter >= self.patience: + self.early_stop = True + else: + self.best_score = score + self.best_iteration = itr + self.save_checkpoint(val_loss, model) + self.counter = 0 + + def save_checkpoint(self, val_loss, model): + '''Saves model when validation loss decrease.''' + if self.verbose: + print(f'Validation loss decreased ({self.val_loss_min:.6f} --> {val_loss:.6f}). Saving model ...') + self.bestModelSoFar = copy.deepcopy(model.state_dict()) + self.val_loss_min = val_loss + + def getBestModel(self): + return self.bestModelSoFar diff --git a/src/myhelpers/skeleton.py b/src/myhelpers/skeleton.py new file mode 100644 index 0000000..732283f --- /dev/null +++ b/src/myhelpers/skeleton.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +""" +This is a skeleton file that can serve as a starting point for a Python +console script. To run this script uncomment the following lines in the +[options.entry_points] section in setup.cfg: + + console_scripts = + fibonacci = myhelpers.skeleton:run + +Then run `python setup.py install` which will install the command `fibonacci` +inside your current environment. +Besides console scripts, the header (i.e. until _logger...) of this file can +also be used as template for Python modules. + +Note: This skeleton file can be safely removed if not needed! +""" + +import argparse +import sys +import logging + +from myhelpers import __version__ + +__author__ = "Mohannad Elhamod" +__copyright__ = "Mohannad Elhamod" +__license__ = "mit" + +_logger = logging.getLogger(__name__) + + +def fib(n): + """Fibonacci example function + + Args: + n (int): integer + + Returns: + int: n-th Fibonacci number + """ + assert n > 0 + a, b = 1, 1 + for i in range(n-1): + a, b = b, a+b + return a + + +def parse_args(args): + """Parse command line parameters + + Args: + args ([str]): command line parameters as list of strings + + Returns: + :obj:`argparse.Namespace`: command line parameters namespace + """ + parser = argparse.ArgumentParser( + description="Just a Fibonacci demonstration") + parser.add_argument( + "--version", + action="version", + version="myhelpers {ver}".format(ver=__version__)) + parser.add_argument( + dest="n", + help="n-th Fibonacci number", + type=int, + metavar="INT") + parser.add_argument( + "-v", + "--verbose", + dest="loglevel", + help="set loglevel to INFO", + action="store_const", + const=logging.INFO) + parser.add_argument( + "-vv", + "--very-verbose", + dest="loglevel", + help="set loglevel to DEBUG", + action="store_const", + const=logging.DEBUG) + return parser.parse_args(args) + + +def setup_logging(loglevel): + """Setup basic logging + + Args: + loglevel (int): minimum loglevel for emitting messages + """ + logformat = "[%(asctime)s] %(levelname)s:%(name)s:%(message)s" + logging.basicConfig(level=loglevel, stream=sys.stdout, + format=logformat, datefmt="%Y-%m-%d %H:%M:%S") + + +def main(args): + """Main entry point allowing external calls + + Args: + args ([str]): command line parameter list + """ + args = parse_args(args) + setup_logging(args.loglevel) + _logger.debug("Starting crazy calculations...") + print("The {}-th Fibonacci number is {}".format(args.n, fib(args.n))) + _logger.info("Script ends here") + + +def run(): + """Entry point for console_scripts + """ + main(sys.argv[1:]) + + +if __name__ == "__main__": + run() diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..1e9a35f --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +""" + Dummy conftest.py for myhelpers. + + If you don't know what this is for, just leave it empty. + Read more about conftest.py under: + https://pytest.org/latest/plugins.html +""" + +# import pytest diff --git a/tests/experiment/agg_experiments.csv b/tests/experiment/agg_experiments.csv new file mode 100644 index 0000000..b8e7e40 --- /dev/null +++ b/tests/experiment/agg_experiments.csv @@ -0,0 +1,5 @@ +,image_path,suffix,training_count,validation_count,batchSize,n_epochs,learning_rate,numOfTrials,patience,fc_width,fc_layers,modelType,lambda,unsupervisedOnTest,tl_model,hash,loss,loss,time,time +,,,,,,,,,,,,,,,,,mean,std,mean,std +0,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,32,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,7523436566489146848,0.053,0.034,3.498,2.657 +1,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,64,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,848752400275043240,0.064,0.028,5.37,2.974 +2,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,128,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,-3645934616373859248,0.064,0.027,5.799,4.268 diff --git a/tests/experiment/aggregated statistics.html b/tests/experiment/aggregated statistics.html new file mode 100644 index 0000000..5b5059f --- /dev/null +++ b/tests/experiment/aggregated statistics.html @@ -0,0 +1,70 @@ + + + + + + PivotTable.js + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/experiment/plot by batchSize.pdf b/tests/experiment/plot by batchSize.pdf new file mode 100644 index 0000000000000000000000000000000000000000..69325f4b01a505da09c98c867ca91558c5d36e46 GIT binary patch literal 9952 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 literal 0 HcmV?d00001 diff --git a/tests/experiment/plot.pdf b/tests/experiment/plot.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c349cf66cdc78bb82d30df6f5432bd97383589b4 GIT binary patch literal 8993 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 + + + + PivotTable.js + + + + + + + + + + + + + + + + + + + + +

+ + diff --git a/tests/experiment/raw_experiments.csv b/tests/experiment/raw_experiments.csv new file mode 100644 index 0000000..4362012 --- /dev/null +++ b/tests/experiment/raw_experiments.csv @@ -0,0 +1,16 @@ +,image_path,suffix,training_count,validation_count,batchSize,n_epochs,learning_rate,numOfTrials,patience,fc_width,fc_layers,modelType,lambda,unsupervisedOnTest,tl_model,loss,time,hash,trial +0,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,32,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.08246078401519345,5.953239030380464,7523436566489146848,0 +1,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,32,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.021058343099300127,0.703635047022354,7523436566489146848,1 +2,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,32,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.06866148820062024,0.9081553014073263,7523436566489146848,2 +3,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,32,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.012027769412850742,6.268079010017793,7523436566489146848,3 +4,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,32,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.08091720993434807,3.6544246718676265,7523436566489146848,4 +5,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,64,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.07756087317273633,5.660095188401496,848752400275043240,0 +6,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,64,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.025553703670690688,8.069991257726157,848752400275043240,1 +7,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,64,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.08103899152363264,6.093114351410426,848752400275043240,2 +8,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,64,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.09080661951488321,0.30613439026149547,848752400275043240,3 +9,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,64,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.04293054840633795,6.721960231037336,848752400275043240,4 +10,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,128,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.026191347843988314,9.326968213933043,-3645934616373859248,0 +11,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,128,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.08125067379222689,1.6532471924916192,-3645934616373859248,1 +12,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,128,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.08360901113028786,9.01287976811761,-3645934616373859248,2 +13,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,128,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.08673956618213487,0.6597640241175817,-3645934616373859248,3 +14,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,128,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.04435478721853064,8.343113170333007,-3645934616373859248,4 diff --git a/tests/test-TrialStatistics.ipynb b/tests/test-TrialStatistics.ipynb new file mode 100644 index 0000000..0a8e82f --- /dev/null +++ b/tests/test-TrialStatistics.ipynb @@ -0,0 +1,738 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
image_pathsuffixtraining_countvalidation_countbatchSizen_epochslearning_ratenumOfTrialspatiencefc_widthfc_layersmodelTypelambdaunsupervisedOnTesttl_model
0/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet18
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "script_root_dir = '../../'\n", + "import sys\n", + "import os\n", + "if script_root_dir not in sys.path:\n", + " sys.path.append(script_root_dir)\n", + "\n", + "import pandas as pd\n", + "from IPython.display import display, HTML\n", + "\n", + "# getModelName(trial_params)\n", + "experimentName = \"experiment\"\n", + "if not os.path.exists(experimentName):\n", + " os.makedirs(experimentName)\n", + " \n", + "experiments = [{'image_path': '/data/BGNN_data/INHS_cropped', 'suffix': '50_11', 'training_count': 0.64, 'validation_count': 0.16, 'batchSize': 32, 'n_epochs': 5000, 'learning_rate': 0.01, 'numOfTrials': 3, 'patience': 100, 'fc_width': 200, 'fc_layers': 1, 'modelType': 'blackbox', 'lambda': 0, 'unsupervisedOnTest': False, 'tl_model': 'ResNet18'},\n", + " {'image_path': '/data/BGNN_data/INHS_cropped', 'suffix': '50_11', 'training_count': 0.64, 'validation_count': 0.16, 'batchSize': 64, 'n_epochs': 5000, 'learning_rate': 0.01, 'numOfTrials': 3, 'patience': 100, 'fc_width': 200, 'fc_layers': 1, 'modelType': 'blackbox', 'lambda': 0, 'unsupervisedOnTest': False, 'tl_model': 'ResNet18'},\n", + " {'image_path': '/data/BGNN_data/INHS_cropped', 'suffix': '50_11', 'training_count': 0.64, 'validation_count': 0.16, 'batchSize': 128, 'n_epochs': 5000, 'learning_rate': 0.01, 'numOfTrials': 3, 'patience': 100, 'fc_width': 200, 'fc_layers': 1, 'modelType': 'blackbox', 'lambda': 0, 'unsupervisedOnTest': False, 'tl_model': 'ResNet18'}]\n", + " \n", + "\n", + "a = pd.DataFrame()\n", + "a = a.append(pd.DataFrame(experiments[0], index=[0]))\n", + "\n", + "display(HTML(a.to_html()))" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "raw statistics\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
image_pathsuffixtraining_countvalidation_countbatchSizen_epochslearning_ratenumOfTrialspatiencefc_widthfc_layersmodelTypelambdaunsupervisedOnTesttl_modellosstimehashtrial
0/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet180.0824615.95323975234365664891468480
1/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet180.0210580.70363575234365664891468481
2/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet180.0686610.90815575234365664891468482
3/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet180.0120286.26807975234365664891468483
4/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet180.0809173.65442575234365664891468484
5/data/BGNN_data/INHS_cropped50_110.640.166450000.0131002001blackbox0FalseResNet180.0775615.6600958487524002750432400
6/data/BGNN_data/INHS_cropped50_110.640.166450000.0131002001blackbox0FalseResNet180.0255548.0699918487524002750432401
7/data/BGNN_data/INHS_cropped50_110.640.166450000.0131002001blackbox0FalseResNet180.0810396.0931148487524002750432402
8/data/BGNN_data/INHS_cropped50_110.640.166450000.0131002001blackbox0FalseResNet180.0908070.3061348487524002750432403
9/data/BGNN_data/INHS_cropped50_110.640.166450000.0131002001blackbox0FalseResNet180.0429316.7219608487524002750432404
10/data/BGNN_data/INHS_cropped50_110.640.1612850000.0131002001blackbox0FalseResNet180.0261919.326968-36459346163738592480
11/data/BGNN_data/INHS_cropped50_110.640.1612850000.0131002001blackbox0FalseResNet180.0812511.653247-36459346163738592481
12/data/BGNN_data/INHS_cropped50_110.640.1612850000.0131002001blackbox0FalseResNet180.0836099.012880-36459346163738592482
13/data/BGNN_data/INHS_cropped50_110.640.1612850000.0131002001blackbox0FalseResNet180.0867400.659764-36459346163738592483
14/data/BGNN_data/INHS_cropped50_110.640.1612850000.0131002001blackbox0FalseResNet180.0443558.343113-36459346163738592484
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import helpers.TrialStatistics as TS\n", + "import random\n", + "\n", + "ts = TS.TrialStatistics(experimentName)\n", + "\n", + "for ex in experiments:\n", + " for j in range(5):\n", + " ts.addTrial(ex, {'loss': random.random()*0.1,\n", + " 'time': random.random()*10\n", + " }, j)\n", + " \n", + "ts.showStatistics(False, saveHTML=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "aggregated statistics\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
image_pathsuffixtraining_countvalidation_countbatchSizen_epochslearning_ratenumOfTrialspatiencefc_widthfc_layersmodelTypelambdaunsupervisedOnTesttl_modelhashlosstime
meanstdmeanstd
0/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet1875234365664891468480.0530.0343.4982.657
1/data/BGNN_data/INHS_cropped50_110.640.166450000.0131002001blackbox0FalseResNet188487524002750432400.0640.0285.3702.974
2/data/BGNN_data/INHS_cropped50_110.640.1612850000.0131002001blackbox0FalseResNet18-36459346163738592480.0640.0275.7994.268
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ts.showStatistics(saveHTML=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.657\n" + ] + } + ], + "source": [ + "import torch\n", + "\n", + "a = ts.getStatistic(experiments[0],'time', 'std')\n", + "print(a)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "ts.trialScatter('loss', 'time', save_plot=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdkAAAFNCAYAAABMsBVXAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAa1klEQVR4nO3df3TV9Z3n8dfbEE0AS6YKJ5KIyLSCFQOkFHUd3WkdfljqlDoM1WW2Vj3ruq1j6kzpyu4cTD2n41kZdaLbs6cOVj1W7SJlONp0wBany2zRKgRMUJtz3EBLQjIGZsJovJFLfO8f9wZJDJqbez/3e+/3Ph/ncK73fb/e7zvfc8mLz/f7uZ+vubsAAEDunRZ1AwAAxBUhCwBAIIQsAACBELIAAARCyAIAEAghCwBAIBOibuBkZ599ts+cOTPqNgAAyMju3bsPu/vUkfWCCtmZM2dq165dUbcBAEBGzOy3o9U5XQwAQCCELAAAgRCyAAAEUlDXZEeTTCbV2dmpgYGBqFvJqYqKCtXW1qq8vDzqVgAAgRR8yHZ2durMM8/UzJkzZWZRt5MT7q4jR46os7NT559/ftTtAAACKfjTxQMDAzrrrLNiE7CSZGY666yzYjc6BwAMV/AhKylWATskjj8TAGC4ogjZKA0MDGjRokWaN2+eLrroIt11112SpNWrV2v27NmaO3eubrrpJiWTyYg7BQAUGkL2Y5xxxhl64YUX9Oqrr2rv3r3aunWrXnrpJa1evVq/+c1v1NbWpkQioQ0bNkTdKgCgwBT8xKdMbdnTpfXb2nWoL6HpVZVas3S2ViyoGff7mZkmT54sKTXTOZlMysz0xS9+8cQ2ixYtUmdnZ9a9AwDiJVYj2S17urR2c5u6+hJySV19Ca3d3KYte7qyet/BwUHNnz9f06ZN0+LFi3XJJZeceC2ZTOqJJ57QsmXLsuw+Hpo7mrVk0xLVPV6nJZuWqLmjOeqWACAysQrZ9dvalUgODqslkoNav609q/ctKyvT3r171dnZqZdffln79u078do3vvENXXnllbriiiuy2kccNHc0q3Fno7r7u+Vydfd3q3FnI0ELoGTFKmQP9SUyqmeqqqpKn//857V161ZJ0ne/+1319vbq/vvvz8n7F7umliYNDA7/WtLA4ICaWpoi6ggAohWrkJ1eVZlRfSx6e3vV19cnSUokEvr5z3+uOXPmaMOGDdq2bZuefvppnXZarA7juPX092RUB4C4i9XEpzVLZ2vt5rZhp4wry8u0Zunscb9nd3e3brjhBg0ODur999/XqlWr9KUvfUkTJkzQeeedp8suu0ySdO2112rdunVZ/wzFrHpStbr7u0etA0ApilXIDs0izuXs4rq6Ou3Zs+dD9ePHj4/7PeOqob5BjTsbh50yriirUEN9Q4RdAUB0YhWyUiposwlVjN/yWcslpa7N9vT3qHpStRrqG07UAaDUxC5kEa3ls5YTqgCQxowdAAACIWQBAMGU+gI1nC4GAAQxtEDN0GTIoQVqJJXMZSVGsgCAIFighpAdk76+Pq1cuVJz5szRhRdeqBdffPHEa/fdd5/MTIcPH46wQwAoPCxQw+niMWloaNCyZcu0adMmHTt2TO+++64k6eDBg3r++ec1Y8aMiDsEgMLDAjVxHMm2bpQemCs1VqUeWzdm9XZHjx7Vjh07dPPNN0uSTj/9dFVVVUmS7rjjDt17770ys6zbBoC4aahvUEVZxbBaqS1QE6+RbOtG6bnbpWT6hgBHD6aeS1LdqnG95f79+zV16lTdeOONevXVV/XZz35WTU1N+sUvfqGamhrNmzcvR80DQLywQE3cQnb73R8E7JBkIlUfZ8geP35cLS0teuihh3TJJZeooaFBjY2N2rFjh55//vkcNA0A8VXqC9TE63Tx0c7M6mNQW1ur2traEzdqX7lypVpaWrR//37NmzdPM2fOVGdnp+rr69XTUzoX8wEAHy9eITulNrP6GFRXV+vcc89Ve3vqxu/bt29XfX293nrrLR04cEAHDhxQbW2tWlpaVF1dOhfzAQAfL16ni69aN/yarCSVV6bqWXjooYe0evVqHTt2TLNmzdKjjz6aZaMAgFIQr5Aduu66/e7UKeIptamAHef12CHz58/Xrl27Tvn6gQMHsnp/AEA8xStkpVSgZhmqAADkQryuyQIAUEAIWQAAAiFkAQAIhJAFACAQQhYAgEAI2TG46aabNG3aNM2dO/dEbc2aNZozZ47q6ur0la98RX19fZKkZDKpG264QRdffLEuvPBC3XPPPVG1DQCIGCE7Bl//+te1devWYbXFixdr3759am1t1QUXXHAiTJ955hm99957amtr0+7du/WDH/yA79ECQImKXcg2dzRryaYlqnu8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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "ts.trialScatter('loss', 'time', 'batchSize', save_plot=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "ts.saveStatistics()\n", + "ts.saveStatistics(False)" + ] + }, + { + "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.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests/test_skeleton.py b/tests/test_skeleton.py new file mode 100644 index 0000000..ce99668 --- /dev/null +++ b/tests/test_skeleton.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- + +import pytest +from myhelpers.skeleton import fib + +__author__ = "Mohannad Elhamod" +__copyright__ = "Mohannad Elhamod" +__license__ = "mit" + + +def test_fib(): + assert fib(1) == 1 + assert fib(2) == 1 + assert fib(7) == 13 + with pytest.raises(AssertionError): + fib(-10) From 5109c76658c556aecff70b4202e190e952e04073 Mon Sep 17 00:00:00 2001 From: Jeremy Leipzig Date: Tue, 30 Jun 2020 14:21:48 -0400 Subject: [PATCH 2/3] cleanup --- README.md | 1 - myhelpers.egg-info/PKG-INFO | 10 - myhelpers.egg-info/SOURCES.txt | 5 - myhelpers.egg-info/dependency_links.txt | 1 - myhelpers.egg-info/top_level.txt | 1 - myhelpers/TrialStatistics.py | 367 --------- myhelpers/ZCA.py | 52 -- myhelpers/__init__.py | 5 - .../TrialStatistics.cpython-36.pyc | Bin 10151 -> 0 bytes .../TrialStatistics.cpython-37.pyc | Bin 10166 -> 0 bytes myhelpers/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 0 bytes myhelpers/__pycache__/__init__.cpython-37.pyc | Bin 138 -> 0 bytes .../__pycache__/color_PCA.cpython-37.pyc | Bin 1266 -> 0 bytes .../__pycache__/config_plots.cpython-36.pyc | Bin 637 -> 0 bytes .../__pycache__/config_plots.cpython-37.pyc | Bin 637 -> 0 bytes .../confusion_matrix_plotter.cpython-36.pyc | Bin 3266 -> 0 bytes .../confusion_matrix_plotter.cpython-37.pyc | Bin 3271 -> 0 bytes .../__pycache__/earlystopping.cpython-36.pyc | Bin 1969 -> 0 bytes .../__pycache__/earlystopping.cpython-37.pyc | Bin 1979 -> 0 bytes myhelpers/color_PCA.py | 51 -- myhelpers/config_plots.py | 25 - myhelpers/confusion_matrix_plotter.py | 95 --- myhelpers/dataset_normalization.py | 25 - myhelpers/earlystopping.py | 53 -- .../test-TrialStatistics-checkpoint.ipynb | 738 ------------------ myhelpers/tests/__init__.py | 0 .../tests/experiment/agg_experiments.csv | 5 - .../experiment/aggregated statistics.html | 70 -- .../tests/experiment/plot by batchSize.pdf | Bin 9952 -> 0 bytes myhelpers/tests/experiment/plot.pdf | Bin 8993 -> 0 bytes .../tests/experiment/raw statistics.html | 81 -- .../tests/experiment/raw_experiments.csv | 16 - myhelpers/tests/test-TrialStatistics.ipynb | 738 ------------------ 33 files changed, 2339 deletions(-) delete mode 100644 README.md delete mode 100644 myhelpers.egg-info/PKG-INFO delete mode 100644 myhelpers.egg-info/SOURCES.txt delete mode 100644 myhelpers.egg-info/dependency_links.txt delete mode 100644 myhelpers.egg-info/top_level.txt delete mode 100644 myhelpers/TrialStatistics.py delete mode 100644 myhelpers/ZCA.py delete mode 100644 myhelpers/__init__.py delete mode 100644 myhelpers/__pycache__/TrialStatistics.cpython-36.pyc delete mode 100644 myhelpers/__pycache__/TrialStatistics.cpython-37.pyc delete mode 100644 myhelpers/__pycache__/__init__.cpython-36.pyc delete mode 100644 myhelpers/__pycache__/__init__.cpython-37.pyc delete mode 100644 myhelpers/__pycache__/color_PCA.cpython-37.pyc delete mode 100644 myhelpers/__pycache__/config_plots.cpython-36.pyc delete mode 100644 myhelpers/__pycache__/config_plots.cpython-37.pyc delete mode 100644 myhelpers/__pycache__/confusion_matrix_plotter.cpython-36.pyc delete mode 100644 myhelpers/__pycache__/confusion_matrix_plotter.cpython-37.pyc delete mode 100644 myhelpers/__pycache__/earlystopping.cpython-36.pyc delete mode 100644 myhelpers/__pycache__/earlystopping.cpython-37.pyc delete mode 100644 myhelpers/color_PCA.py delete mode 100644 myhelpers/config_plots.py delete mode 100644 myhelpers/confusion_matrix_plotter.py delete mode 100644 myhelpers/dataset_normalization.py delete mode 100644 myhelpers/earlystopping.py delete mode 100644 myhelpers/tests/.ipynb_checkpoints/test-TrialStatistics-checkpoint.ipynb delete mode 100644 myhelpers/tests/__init__.py delete mode 100644 myhelpers/tests/experiment/agg_experiments.csv delete mode 100644 myhelpers/tests/experiment/aggregated statistics.html delete mode 100644 myhelpers/tests/experiment/plot by batchSize.pdf delete mode 100644 myhelpers/tests/experiment/plot.pdf delete mode 100644 myhelpers/tests/experiment/raw statistics.html delete mode 100644 myhelpers/tests/experiment/raw_experiments.csv delete mode 100644 myhelpers/tests/test-TrialStatistics.ipynb diff --git a/README.md b/README.md deleted file mode 100644 index 1954514..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -# myhelpers diff --git a/myhelpers.egg-info/PKG-INFO b/myhelpers.egg-info/PKG-INFO deleted file mode 100644 index c728460..0000000 --- a/myhelpers.egg-info/PKG-INFO +++ /dev/null @@ -1,10 +0,0 @@ -Metadata-Version: 1.0 -Name: myhelpers -Version: 1.0 -Summary: UNKNOWN -Home-page: UNKNOWN -Author: UNKNOWN -Author-email: UNKNOWN -License: UNKNOWN -Description: UNKNOWN -Platform: UNKNOWN diff --git a/myhelpers.egg-info/SOURCES.txt b/myhelpers.egg-info/SOURCES.txt deleted file mode 100644 index 8da986e..0000000 --- a/myhelpers.egg-info/SOURCES.txt +++ /dev/null @@ -1,5 +0,0 @@ -setup.py -myhelpers.egg-info/PKG-INFO -myhelpers.egg-info/SOURCES.txt -myhelpers.egg-info/dependency_links.txt -myhelpers.egg-info/top_level.txt \ No newline at end of file diff --git a/myhelpers.egg-info/dependency_links.txt b/myhelpers.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/myhelpers.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/myhelpers.egg-info/top_level.txt b/myhelpers.egg-info/top_level.txt deleted file mode 100644 index 8b13789..0000000 --- a/myhelpers.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/myhelpers/TrialStatistics.py b/myhelpers/TrialStatistics.py deleted file mode 100644 index b47be1d..0000000 --- a/myhelpers/TrialStatistics.py +++ /dev/null @@ -1,367 +0,0 @@ -import pandas as pd -from IPython.display import display, HTML -import os -from sklearn.metrics import confusion_matrix -import numpy as np -import json -import hashlib - -import statistics -# import qgrid -import matplotlib.pyplot as plt -from pivottablejs import pivot_ui - -from .confusion_matrix_plotter import plot_confusion_matrix, generate_classification_report - -aggregateStatFileName = "agg_experiments.csv" -rawStatFileName = "raw_experiments.csv" -confusionMatrixParamsFileName="params.json" -confusionMatrixFileName = "confusion_matrix.pdf" - - -# Given a confusion matrix, gets metris of fine with respect to coarse -class fine_Coarse_Statistics: - def __init__(self, cm, dataset): - self.dataset = dataset - self.cm = cm - - def get_statistics(self, fine_index): - true_positives = self.cm[fine_index, fine_index] - fine_name = self.dataset.getfineOfIndex(fine_index) - fine_names = self.dataset.getfineWithinCoarse(self.dataset.getCoarseFromfine(fine_name)) - fine_indexes = list(map(lambda x: self.dataset.getfineList().index(x), fine_names)) - - within_coarse_FP = np.sum(self.cm[fine_indexes, fine_index]) - true_positives - out_of_coarse_FP = np.sum(self.cm[:, fine_index]) - true_positives - within_coarse_FP - within_coarse_FN = np.sum(self.cm[fine_index, fine_indexes]) - true_positives - out_of_coarse_FN = np.sum(self.cm[fine_index, :]) - true_positives - within_coarse_FN - return { - "TP": true_positives, - "FP_within_coarse": within_coarse_FP, - "FP_out_of_coarse": out_of_coarse_FP, - "FN_within_coarse": within_coarse_FN, - "FN_out_of_coarse": out_of_coarse_FN, - } - - def get_precision_recall(self, fine_index): - fine_statistics = self.get_statistics(fine_index) - - TP = fine_statistics["TP"] - FP_within_coarse = fine_statistics["FP_within_coarse"] - FP_out_of_coarse = fine_statistics["FP_out_of_coarse"] - FN_within_coarse = fine_statistics["FN_within_coarse"] - FN_out_of_coarse = fine_statistics["FN_out_of_coarse"] - - Precision_within_coarse = TP/(TP + FP_within_coarse) if (TP + FP_within_coarse) != 0 else 0 - Precision_out_of_coarse = TP/(TP + FP_out_of_coarse) if (TP + FP_out_of_coarse) != 0 else 0 - Recall_within_coarse = TP/(TP + FN_within_coarse) if (TP + FN_within_coarse) != 0 else 0 - Recall_out_of_coarse = TP/(TP + FN_out_of_coarse) if (TP + FN_out_of_coarse) != 0 else 0 - Precision = TP/(TP + FP_within_coarse + FP_out_of_coarse) if (TP + FP_within_coarse + FP_out_of_coarse) != 0 else 0 - Recall = TP/(TP + FN_within_coarse + FN_out_of_coarse) if (TP + FN_within_coarse + FN_out_of_coarse) != 0 else 0 - - return { - "Precision_within_coarse": Precision_within_coarse, - "Precision_out_of_coarse": Precision_out_of_coarse, - "Recall_within_coarse": Recall_within_coarse, - "Recall_out_of_coarse": Recall_out_of_coarse, - "Precision": Precision, - "Recall": Recall, - } - - def get_F1Scores(self, fine_index): - precision_recall_stats = self.get_precision_recall(fine_index) - - within_coarse_stats = [precision_recall_stats["Precision_within_coarse"], precision_recall_stats["Recall_within_coarse"]] - f1_macro_within_coarse = statistics.harmonic_mean(within_coarse_stats) - - out_of_coarse_stats = [precision_recall_stats["Precision_out_of_coarse"], precision_recall_stats["Recall_out_of_coarse"]] - f1_macro_out_of_coarse = statistics.harmonic_mean(out_of_coarse_stats) - - overall_stats = [precision_recall_stats["Precision"], precision_recall_stats["Recall"]] - f1_macro = statistics.harmonic_mean(overall_stats) - - return { - "f1_macro_within_coarse": f1_macro_within_coarse, - "f1_macro_out_of_coarse": f1_macro_out_of_coarse, - "f1_macro": f1_macro, - } - -# Given a confusion matrix, get statistics of coarse labels -class Coarse_Statistics: - def __init__(self, cm, dataset): - self.dataset = dataset - self.cm = cm - - def get_statistics(self, coarse_index): - true_positives = self.cm[coarse_index, coarse_index] - - FP = np.sum(self.cm[:, coarse_index]) - true_positives - FN = np.sum(self.cm[coarse_index, :]) - true_positives - return { - "TP": true_positives, - "FP": FP, - "FN": FN, - } - - def get_precision_recall(self, coarse_index): - fine_statistics = self.get_statistics(coarse_index) - - TP = fine_statistics["TP"] - FP = fine_statistics["FP"] - FN = fine_statistics["FN"] - - Precision = TP/(TP + FP) if (TP + FP) != 0 else 0 - Recall = TP/(TP + FN) if (TP + FN) != 0 else 0 - - return { - "Precision": Precision, - "Recall": Recall, - } - - def get_F1Scores(self, coarse_index): - precision_recall_stats = self.get_precision_recall(coarse_index) - - overall_stats = [precision_recall_stats["Precision"], precision_recall_stats["Recall"]] - f1_macro = statistics.harmonic_mean(overall_stats) - - return { - "f1_macro": f1_macro, - } - - -# Allows for addin trial results and then aggregating them -class TrialStatistics: - def __init__(self, experiment_name, prefix=None): - self.df = pd.DataFrame() - self.agg_df = pd.DataFrame() - self.experiment_name = experiment_name - - if not os.path.exists(self.experiment_name): - os.makedirs(self.experiment_name) - - self.prefix = prefix - self.trial_params_keys = [] - self.trial_results_keys = [] - - self.confusionMatrices = {} - self.agg_confusionMatrices = {} - - # Adds the parameters and results of a trial - def addTrial(self, trial_params, trial_results, trial=None): - # Reset aggregate information - self.agg_df = pd.DataFrame() - - # preprocess - trial_params_copy = self.preProcessParameters(trial_params) - row_hash = {'experimentHash': getTrialName(trial_params_copy)} - trial_params_with_hash = {**trial_params_copy, **row_hash} - row_information = {**trial_params_copy, **trial_results} - row_information = {**row_information, **row_hash} - - # Augment row information - if trial is not None: - row_information["trial"] = trial - row_information["trialHash"] = getTrialName(trial_params_copy, trial) - - # Add row - self.df = self.df.append(pd.DataFrame(row_information, index=[0]), ignore_index = True) - - # populate param and result lists keys - for key in trial_params_with_hash: - if key not in self.trial_params_keys: - self.trial_params_keys.append(key) - - for key in trial_results: - if key not in self.trial_results_keys: - self.trial_results_keys.append(key) - - # Adds the predictions for confusion matrix calculations - def addTrialPredictions(self, trial_params, predlist, lbllist, numberOffine): - self.agg_confusionMatrices = {} - # Confusion matrix - conf_mat=confusion_matrix(lbllist.cpu().numpy(), predlist.cpu().numpy(), labels = range(numberOffine)) - trial_params_copy = self.preProcessParameters(trial_params) - trial_hash = getTrialName(trial_params_copy) - if trial_hash not in self.confusionMatrices: - self.confusionMatrices[trial_hash] = [] - self.confusionMatrices[trial_hash].append(conf_mat) - - def aggregateTrials(self): - # group by trial params - groupedBy_df = self.df.groupby(self.trial_params_keys) - - # For each result key, calculate mean and std - for key in self.trial_results_keys: - groupedBy_df_summaried = groupedBy_df.agg({key:['mean','std']}) - self.agg_df = pd.concat([self.agg_df,groupedBy_df_summaried], axis=1, ignore_index=False) - - self.agg_df = self.agg_df.round(3).reset_index() - - def saveStatistics(self, aggregated=True): - if aggregated: - file_name = aggregateStatFileName - else: - file_name = rawStatFileName - - if self.prefix is not None: - file_name = self.prefix + "_" + file_name - - if aggregated: - if self.agg_df.empty: - self.aggregateTrials() - self.agg_df.to_csv(os.path.join(self.experiment_name, file_name)) - else: - self.df.to_csv(os.path.join(self.experiment_name, file_name)) - - def showStatistics(self, aggregated=True, saveHTML=False): - df = self.df.copy() - if aggregated: - if self.agg_df.empty: - self.aggregateTrials() - df = self.agg_df.copy() - - name = "aggregated statistics" if aggregated else "raw statistics" - name_html = name+'.html' -# df.columns = [' '.join(col).strip() for col in df.columns.values] # work around:https://github.com/quantopian/qgrid/issues/18#issuecomment-149321165 -# return qgrid.show_grid(df, show_toolbar=True) - display(HTML(df.to_html())) - if saveHTML: - pivot_ui(df,outfile_path=os.path.join(self.experiment_name, name_html)) -# display(HTML(self.experiment_name+"/"+name_html)) - - def getStatistic(self, trial_params, metric, statistic): - if self.agg_df.empty: - self.aggregateTrials() - trial_params_copy = self.preProcessParameters(trial_params) - row = self.agg_df.loc[self.agg_df['experimentHash'] == getTrialName(trial_params_copy)] - return row[self.trial_results_keys][(metric, statistic)].item() - - - - - - - # prints aggregate confusion matrix for trials - def printTrialConfusionMatrix(self, trial_params, lst, printOutput=False): - aggregatePath = os.path.join(self.experiment_name, getTrialName(trial_params)) - if not os.path.exists(aggregatePath): - os.makedirs(aggregatePath) - - file_name = confusionMatrixFileName - if self.prefix is not None: - file_name = self.prefix + "_" + file_name - - j = json.dumps(trial_params) - f = open(os.path.join(aggregatePath, confusionMatrixParamsFileName),"w") - f.write(j) - f.close() - - return plot_confusion_matrix(self.getTrialConfusionMatrix(trial_params), - lst, - aggregatePath, - file_name, - printOutput) - - def aggregateTrialConfusionMatrices(self): - for hash_key in self.confusionMatrices: - confusionMatricesForHash = self.confusionMatrices[hash_key] - self.agg_confusionMatrices[hash_key] = np.mean(confusionMatricesForHash, axis=0) - - def prepareConfusionMatrix(self, trial_params): - if not self.agg_confusionMatrices: - self.aggregateTrialConfusionMatrices() - - def getTrialConfusionMatrix(self, trial_params): - self.prepareConfusionMatrix(trial_params) - - return self.agg_confusionMatrices[getTrialName(trial_params)] - - - - - def printF1table(self, trial_params, dataset): - cm = self.getTrialConfusionMatrix(trial_params) - - if self.prefix == "coarse": - columns = ['coarse', 'F1'] - else: - columns = ['fine', 'coarse', 'F1'] -# if trial_params['useHeirarchy']: - columns = columns + ['F1_within_coarse', 'F1_out_of_coarse'] - - df = pd.DataFrame(columns=columns) - - if self.prefix == "coarse": - stats = Coarse_Statistics(cm, dataset) - for coarse_name in dataset.getCoarseList(): - coarse_index = dataset.getCoarseList().index(coarse_name) - coarse_stats = stats.get_F1Scores(coarse_index) - df.loc[coarse_index] = [" ".join([str(coarse_index), coarse_name]), - coarse_stats["f1_macro"]] - else: - stats = fine_Coarse_Statistics(cm, dataset) - for fine in range(len(dataset.getfineList())): - fine_stats = stats.get_F1Scores(fine) - fine_name = dataset.getfineOfIndex(fine) - coarse_name = dataset.getCoarseFromfine(fine_name) - coarse_index = dataset.getCoarseList().index(coarse_name) - vals = [" ".join([str(fine), str(fine_name)]), - " ".join([str(coarse_index), str(coarse_name)]), - fine_stats["f1_macro"],] -# if trial_params['useHeirarchy']: - vals = vals + [ fine_stats["f1_macro_within_coarse"], - fine_stats["f1_macro_out_of_coarse"]] - df.loc[fine] = vals - - display(HTML(df.to_html())) - file_name = "F1_Scores" - if self.prefix == "coarse": - file_name = file_name + "_coarse" - pivot_ui(df,outfile_path=os.path.join(self.experiment_name, file_name+".html")) - - - - def trialScatter(self, x, y, aggregatedBy=None, save_plot=False): - df = self.df - - file_name = 'plot' + ((' by ' + aggregatedBy) if aggregatedBy is not None else '') - - - # get unique values for aggregate by - uniqueValues=['all'] - if aggregatedBy is not None: - uniqueValues=df[aggregatedBy].unique() - - # prepare axis - fig=plt.figure() - ax=fig.add_axes([0,0,1,1]) - ax.set_xlabel(x) - ax.set_ylabel(y) - - - for val in uniqueValues: - if aggregatedBy: - x_values = df.loc[df[aggregatedBy] == val][x].values - y_values = df.loc[df[aggregatedBy] == val][y].values - else: - x_values = df[x].values - y_values = df[y].values - - im = ax.scatter(x=x_values, - y=y_values, - label=val) - ax.legend() - - if save_plot: - fig.savefig(os.path.join(self.experiment_name, file_name+".pdf")) - - - def preProcessParameters(self, trial_params): - trial_params_copy = {**trial_params, **{}} - return trial_params_copy - -def getTrialName(trial_params, trial_number=None): - trialName = str(trial_params) - if trial_number is not None: - trialName = trialName + str(trial_number) - return hashlib.sha224(trialName.encode('utf-8')).hexdigest() \ No newline at end of file diff --git a/myhelpers/ZCA.py b/myhelpers/ZCA.py deleted file mode 100644 index 9d277a3..0000000 --- a/myhelpers/ZCA.py +++ /dev/null @@ -1,52 +0,0 @@ -import numpy as np -import torch - -class ZCA: - def __init__(self, data): - self.epsilon = 1e-5 - self.mean = None - self.std = None - - self.data = self.scaleData(data) - - def computeZCAMatrix(self): - #This function computes the ZCA matrix for a set of observables X where - #rows are the observations and columns are thde variables (M x C x W x H matrix) - #C is number of color channels and W x H is width and height of each image - - #reshape data from M x C x W x H to M x N where N=C x W x H - X = self.data - X = X.reshape(-1, X.shape[1]*X.shape[2]*X.shape[3]) - - # compute the covariance - cov = np.cov(X, rowvar=False) # cov is (N, N) - - # singular value decomposition - U,S,V = np.linalg.svd(cov) # U is (N, N), S is (N,1) V is (N,N) - # build the ZCA matrix which is (N,N) - self.zca_matrix = np.dot(U, np.dot(np.diag(1.0/np.sqrt(S + self.epsilon)), U.T)) - - - return torch.from_numpy(self.zca_matrix).float() - - def scaleData(self, data): - data=np.stack(data, axis=0) - - #normalize the data to [0 1] range - data=data/255 - - #compute mean and std and normalize the data to -1 1 range with 1 std - if self.mean is None: - self.mean=(data.mean(axis=0)) - if self.std is None: - self.std=(data.std(axis=0)) - -# scaled = torch.tensor(np.multiply(1/(self.std+self.epsilon),np.add(data,-self.mean))) - scaled = torch.tensor(np.add(data,-self.mean)) - return scaled - - def scaleSampleToUnity(self, sample): - scaled = (sample - sample.min())/(sample.max() - sample.min()) - return scaled - - \ No newline at end of file diff --git a/myhelpers/__init__.py b/myhelpers/__init__.py deleted file mode 100644 index ee2f844..0000000 --- a/myhelpers/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# import color_PCA -# import config_plots -# import confusion_matrix_plotter -# import TrialStatistics -# import ZCA \ No newline at end of file diff --git a/myhelpers/__pycache__/TrialStatistics.cpython-36.pyc b/myhelpers/__pycache__/TrialStatistics.cpython-36.pyc deleted file mode 100644 index d59d61af24ab523be1945272be03b8e3ceb3ae5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10151 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 diff --git a/myhelpers/__pycache__/TrialStatistics.cpython-37.pyc b/myhelpers/__pycache__/TrialStatistics.cpython-37.pyc deleted file mode 100644 index a5b4985a2525b90b9ce4b93e866080680e135df7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10166 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 VS~hC9IsDJ6zFB>t`g>aYe*j=`wBG;# diff --git a/myhelpers/__pycache__/__init__.cpython-36.pyc b/myhelpers/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index ec5b92f62ea495aa85bfb4002f68756ac41d0ca5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 zcmXr!<>gA@{}orjz`*brh~a<{$Z`PUViq8g!Vt`$$>_I|p$H_5Ab#oUXXNLm>Zj&p uB+8h8{xz diff --git a/myhelpers/__pycache__/__init__.cpython-37.pyc b/myhelpers/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 3a62b028c03ac11d0dc9ad390b48540df6e51fe7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmZ?b<>g`k0@wSW;|hTEV-N=h7=a82ATDMB5-AM944RC7D;bJF!U*D*v3^E=ZmNE2 zPDWyGeu}<_yPuzaa(+sxesOY9W&ryk0@&Ee;!?+R~g< LJCI?YftUdRP5U74 diff --git a/myhelpers/__pycache__/color_PCA.cpython-37.pyc b/myhelpers/__pycache__/color_PCA.cpython-37.pyc deleted file mode 100644 index 860537e9429c3dd9c9d3b22392703a788ed5abb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1266 zcmY*YOK&7K5cZ?pugvU5tBA1d3h~$jeMxSdRxFSe+#)0nNF$)-w4F&0{ffJLHbgxV z61nmNKpc9G`~?04KfqTGtGOYLT%gL6$u5@sx%|1R+ODtq)9ExOF#h=A?{A+3g#3w{ z-QZw+46}U?KoLa?GNW!~Gxj-AOz|6{_>XMH75$PV-Uj^0X@Yq}Dhw+Mk1%KwQCBn@F7jqyMh;hKJp%pT0izyYU&2Y7El_P!$Uy5Q7` zyp(foC|ou1+_GU{Z?H%k$Fj}8FbuxzvxHjT)GwCOB>Pr$waG55m-R~8N#3S%Df2>} z725Kw=`E`oyO-5fCOcihv{7ed)i!mjZD4eJAsh6pm)0-xN)~g=bw0O2Af#)tYpJv`kKl&pA;Mb#HfUwp6uPzIOm=Wj-@UZ` zjhJ`g_@Be0qvH!*G}^Ss*-ql4=6f5aDSWg`Q`E7=9wFSLF%5CDkoxR^O=#@xvp1Me zeR}=iu0xJ?p&8Z?2j;lz2L+q0@`{2&9JJ*t){zl(SqRi+;U5stmv_M!4t!0=NKsIk z4}6TVw?TbA?hRXx4*Za;Jn)^MvWqFqduxtef9jNUnwbc`n%p=0uz+~7Qgvzlsy3x8 zT*)j~b!Xm$V{?cwLC5&q)MZ-rB@`s;tM;18jA?TL9G z{f`l_MP38El0i)|V~YUY@W?TVXN9YitFWt{<6nz*$=s{Lr`s=ogn!m;o{;?qcfUTt diff --git a/myhelpers/__pycache__/config_plots.cpython-36.pyc b/myhelpers/__pycache__/config_plots.cpython-36.pyc deleted file mode 100644 index 828710a3d3e9ed415e7c179e7fd5944159ef20ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 637 zcmZ`%J8#=C5GLg~mhD&y(9GQhBr?*jMNy!;Q6QZ>#GrL2nF;j(NuidIPRY;6lCghD zYbX7MOg+jOoS{72$9wP|Jo58mF@x~+_T_}JzwBsvB!43|7X-k7E4F6f!RU#tIq(}6 zo%G~ktHhyOoH!)@PHa9A0H^bF7{h7C9Ki&9m=ZdgJqN#;Wq16}dti^8Qw_>_w(9%} zQY9?zfA&*K(vJz`B_;312DME4b7ysh`VRzA&@QShjVZu1#$w*iNwjfokoGo6Wmap9 zX*06LcJ`)2CEIyg7B)^rE>%MgrwkR^@F0uATpbL-V93j&G?hrO4a6Qzti%@8koBNj zX%!Co^pL<63>9WrKSC{xJ0!Rc?rwB*`caXnje0rNcmKk_F!pcB-zd#ynp8aRRlIXeFfwNWel>b{9_zsvXj E0lgBe-v9sr diff --git a/myhelpers/__pycache__/config_plots.cpython-37.pyc b/myhelpers/__pycache__/config_plots.cpython-37.pyc deleted file mode 100644 index 28c79914035dfc130f7bfaa1bdb7de688d5c62d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 637 zcmZ`%Kd;j;5VzCzy|j-eNHDWUf<$6rK?v~%-c%vM)Pc&4FR8(aEuSme2sS>(8+aol zAA&EDl_?uD6Xz79$H1NL=lf&-&bj!-a=Bn6-@gBRdoyM1M+p8(M9ydj~l!s5cTt(v=ap!bK2jkBV}~w1`J%-~r$jO)8q*rIqJ%CH z2f$p5E$ET;6no`0jPd+L5E`Z$YG`F1GGi@0cvZf?bvQl#o5&{pq7mL|wpcH%5xBQgtxN}Zx8gsM(z!$2OQw2g}ZOkLu1yCjdg zf7xAHqH=sGlScvh1br$B^c&wPR~94vu&%wa21iq~zK5m5z1QsnX=6(-gQ&*TQ_F-E@-VQ|*c%9dhktIZw5n zN$uo;8fj;oMX7F{h)D4`O1ac-7-y1qJYA2E;y98@`?=r@soomsI^yD!!KXP7BM@HY zr#TlGdN zI<0fi!tAfno0WmRZGkUnW3>Rtuy$o}%|OQ!{{*RZ^qH;Pw$k<`w+gG8r+-)1#@E#i z(7eIcwsDUoO^}}3kF95a`I9|s&Dw?c4H1vQ%4X3nT5Ns%23TtqZL|-%ul>Lk&0_~- z_u2K-W;fWzxl63{SC=a{e{!W-Uippn#dn|K?r!3KVBBJFU?hRsW;a0>#I@pYvNg5^ z@!1|a?ACcHb4%SGzd3%ZunR~qa{}m_hShf}eQ%pMS&(9H1}`9+n-tnGdd^cCPU0{wmNTpH8DMGMm7Jn#)6HEhXxOW%LaAC5K`m6Su+JVTDh0$)p z0o$SMUP@JHFRiFR47uv3kZW?ka`r4ODNR~Al`qZ;v2 zo*Iq2bdU+kPlF_n`9A%8XA})bJG*oz;VhaYNX6O7&a=vwNTF2KP?h4RimHsVNak@c zr2%j_o#iwe7_tmxxjsyS{BpVZcPIiDK@1nt&x3dZJE_!hMopwZ2ZlY4jv(`q>W0Y` zdy|~gky82o-rmxRObqv`4a&VRi!)L7;ERNNX}|?fL*5;!B)&pt9;+_KA6>t{Gv;ci zLm^@~9VXr1qPOMV(o7^l9G#W%`Dj3&1hM411}|o-A~>PtWm*De5yo;Hs9VM;8F9nd2#RUf_x0GJ7rwHVs$~0m8b*^5|^+(c<}~ADid*q6e~2BKaay#&his;w(@wzVWA z{_gCoi3vi@;hoXnL4gv5h*mSv{4fkBA_%7kXy+G$+3?#tU;pR#-~RRCaA4YhAEI{x zLe#Ov7P^I9hiW^`wX0w$7jMCguE|NFYmndCU*x^^ATARD&YE-7UQkw6wHOL3?^H$M zF_dZ3Y7C^B=3LiPeu6>KUX&nMwQu%v6bS95L7D`ox&Z+YD$AhAs{@qTBvb+m679-S z04f~3UBNisEK0W(T+Ir=JIy9AJ2m?T^W|8V!E+97iWcszjUCoE+Ckf54am-lw!;L} zEIlaVI?DK1mSHicTe*l*^~pr#6D8ip{~DL+sQsXdanDa8X;P!t#7)C{B`^YNB)A-D z5@|9vHD1|mpq|YuQ3-{;B|m`9>TD6;_DR!Th0iCeWSz8ahuj0+uTkm$RMKS} mv0^l;m$rk&t1x@=e+{WOiTQ63;c^{1bjv4g+)4||81g-}TB2zH diff --git a/myhelpers/__pycache__/confusion_matrix_plotter.cpython-37.pyc b/myhelpers/__pycache__/confusion_matrix_plotter.cpython-37.pyc deleted file mode 100644 index 097f3189d9f6c67f936514ff19bba7c7ae11876e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3271 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 diff --git a/myhelpers/color_PCA.py b/myhelpers/color_PCA.py deleted file mode 100644 index 32fb1bc..0000000 --- a/myhelpers/color_PCA.py +++ /dev/null @@ -1,51 +0,0 @@ -import numpy as np -import torch - -class Color_PCA(): - def __init__(self, loader, magnitude=0.1, minimum=0.0, maximum=1.0): #loader - # if torch.cuda.is_available(): - # samples = samples.cpu() - samples = None - for batch in loader: - images = batch["image"] - if torch.cuda.is_available(): - images = images.cpu() - - if samples is None: - samples = images - else: - samples=np.concatenate((images,samples), 0) - - samples = np.transpose(samples, (0, 2, 3, 1)) - samples = samples.reshape((-1, 3)) - # samples -= np.mean(samples, axis=0) - # samples /= np.std(samples, axis=0) - - self.cov = np.cov(samples, rowvar=False) - - self.lambdas, self.p = np.linalg.eig(self.cov) - - self.minimum = minimum - self.maximum = maximum - self.magnitude = magnitude - - def perturb_color(self, img): - alphas = np.random.normal(0, self.magnitude, 3) - - delta = np.dot(self.p, alphas*self.lambdas) - delta = torch.from_numpy(delta).unsqueeze(0) - - # if torch.cuda.is_available(): - # delta = delta.cuda() - - # mean = torch.mean(img, axis=0) - # std = torch.std(img, axis=0) - delta = delta.view(3, 1,1).expand_as(img) - # print('delta',delta) - # print('img',img) - pca_augmentation_version_img = img + delta # - # print('pca_augmentation_version_img',pca_augmentation_version_img) - # print('maxed',torch.clamp(pca_augmentation_version_img, self.minimum, self.maximum)) - # pca_color_image = pca_augmentation_version_img * std + mean - # torch.maximum(torch.minimum(pca_color_image, 1), 0) - return torch.clamp(pca_augmentation_version_img, self.minimum, self.maximum) \ No newline at end of file diff --git a/myhelpers/config_plots.py b/myhelpers/config_plots.py deleted file mode 100644 index fd76837..0000000 --- a/myhelpers/config_plots.py +++ /dev/null @@ -1,25 +0,0 @@ -import matplotlib - -def global_settings(): - pgf_with_latex = { # setup matplotlib to use latex for output - "pgf.texsystem": "pdflatex", # change this if using xetex or lautex - "text.usetex": True, # use LaTeX to write all text - "figure.figsize": (9, 5), # default fig size of 0.9 textwidth - "figure.dpi": 300, - "font.family": "serif", - "font.serif": [], # blank entries should cause plots to inherit fonts from the document - "font.sans-serif": [], - "font.monospace": [], - "axes.labelsize": 16, # LaTeX default is 10pt font. - 'axes.titlesize': 15, - "font.size": 19, - "legend.fontsize": 16, # Make the legend/label fonts a little smaller - "xtick.labelsize": 16, #23? - "ytick.labelsize": 16, -# "pgf.preamble": [ -# r"\usepackage[utf8x]{inputenc}", # use utf8 fonts becasue your computer can handle it :) -# r"\usepackage[T1]{fontenc}", # plots will be generated using this preamble -# ] - } - - matplotlib.rcParams.update(pgf_with_latex) \ No newline at end of file diff --git a/myhelpers/confusion_matrix_plotter.py b/myhelpers/confusion_matrix_plotter.py deleted file mode 100644 index eb71f51..0000000 --- a/myhelpers/confusion_matrix_plotter.py +++ /dev/null @@ -1,95 +0,0 @@ -import numpy as np -import matplotlib.pyplot as plt -import itertools -from sklearn.metrics import classification_report -import os - -def generate_classification_report(lbllist, predlist, numberOfSpecies, experimentName): - classificationReport = classification_report(lbllist.cpu().numpy(), predlist.cpu().numpy(), labels = range(numberOfSpecies), digits=2) - classification_report_file = open(os.path.join(experimentName,"classification_report.txt"),"w") - classification_report_file.writelines(classificationReport) - classification_report_file.close() #to change file access modes - return classificationReport - -def plot_confusion_matrix(cm, - target_names, - experimentName, - fileName, - printOutput=False, - cmap=None, - normalize=True, -): - """ - given a sklearn confusion matrix (cm), make a nice plot - - Arguments - --------- - cm: confusion matrix from sklearn.metrics.confusion_matrix - - target_names: given classification classes such as [0, 1, 2] - the class names, for example: ['high', 'medium', 'low'] - - title: the text to display at the top of the matrix - - cmap: the gradient of the values displayed from matplotlib.pyplot.cm - see http://matplotlib.org/examples/color/colormaps_reference.html - plt.get_cmap('jet') or plt.cm.Blues - - normalize: If False, plot the raw numbers - If True, plot the proportions - - Usage - ----- - plot_confusion_matrix(cm = cm, # confusion matrix created by - # sklearn.metrics.confusion_matrix - normalize = True, # show proportions - target_names = y_labels_vals, # list of names of the classes - title = best_estimator_name) # title of graph - - Citiation - --------- - http://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html - - """ - - accuracy = np.trace(cm) / float(np.sum(cm)) - misclass = 1 - accuracy - - if cmap is None: - cmap = plt.get_cmap('Blues') - - plt.figure(figsize=(40, 40), dpi=300) - plt.title("Confusion Matrix") - - if target_names is not None: - tick_marks = np.arange(len(target_names)) - plt.xticks(tick_marks, target_names, rotation=90) - plt.yticks(tick_marks, target_names) - - if normalize: - cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis] - - plt.imshow(cm, cmap=cmap) # , interpolation='nearest' - plt.colorbar() - - - thresh = np.nanmax(cm) / 1.5 if normalize else np.nanmax(cm) / 2 - for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])): - if normalize: - plt.text(j, i, "{:0.2f}".format(cm[i, j]), - horizontalalignment="center", - color="white" if cm[i, j] > thresh else "black") - else: - plt.text(j, i, "{:,}".format(cm[i, j]), - horizontalalignment="center", - color="white" if cm[i, j] > thresh else "black") - - plt.tight_layout() - plt.ylabel('True label') - plt.xlabel('Predicted label\nAccuracy={:0.4f}'.format(accuracy)) - plt.tight_layout(rect=[0, 0.03, 1, 0.95]) - plt.savefig(os.path.join(experimentName, fileName)) - if printOutput: - plt.show() - plt.close() - return cm \ No newline at end of file diff --git a/myhelpers/dataset_normalization.py b/myhelpers/dataset_normalization.py deleted file mode 100644 index 4cf66d3..0000000 --- a/myhelpers/dataset_normalization.py +++ /dev/null @@ -1,25 +0,0 @@ -import torch -from torchvision import transforms - -class dataset_normalization(): - def __init__(self, dataset): - self.dataloader = torch.utils.data.DataLoader(dataset, batch_size=len(dataset)) - - def getTransform(self): - mean = 0. - std = 0. - nb_samples = 0. - - # Calculate the median per channel - for data in self.dataloader: - data = data["image"] - batch_samples = data.size(0) - data = data.view(batch_samples, data.size(1), -1) - mean += data.mean(-1).sum(0) - std += data.std(-1).sum(0) - nb_samples += batch_samples - - mean /= nb_samples - std /= nb_samples - print('dataset has a mean: {0} and std: {1}'.format(mean, std) ) - return [transforms.Normalize(mean, std)] \ No newline at end of file diff --git a/myhelpers/earlystopping.py b/myhelpers/earlystopping.py deleted file mode 100644 index efedb6b..0000000 --- a/myhelpers/earlystopping.py +++ /dev/null @@ -1,53 +0,0 @@ -import numpy as np -import torch -import copy - -class EarlyStopping: - """Early stops the training if validation loss doesn't improve after a given patience.""" - def __init__(self, path, patience=7, verbose=False): - """ - Args: - patience (int): How long to wait after last time validation loss improved. - Default: 7 - verbose (bool): If True, prints a message for each validation loss improvement. - Default: False - """ - self.patience = patience - self.verbose = verbose - self.counter = 0 - self.best_score = None - self.early_stop = False - self.best_iteration = 0 - self.val_loss_min = np.Inf - self.path=path - self.bestModelSoFar = None - - def __call__(self, val_loss, itr, model): - - score = -val_loss - - if self.best_score is None: - self.best_score = score - self.best_iteration = itr - self.save_checkpoint(val_loss, model) - elif score < self.best_score: - self.counter += 1 - if self.verbose: - print(f'EarlyStopping counter: {self.counter} out of {self.patience}') - if self.counter >= self.patience: - self.early_stop = True - else: - self.best_score = score - self.best_iteration = itr - self.save_checkpoint(val_loss, model) - self.counter = 0 - - def save_checkpoint(self, val_loss, model): - '''Saves model when validation loss decrease.''' - if self.verbose: - print(f'Validation loss decreased ({self.val_loss_min:.6f} --> {val_loss:.6f}). Saving model ...') - self.bestModelSoFar = copy.deepcopy(model.state_dict()) - self.val_loss_min = val_loss - - def getBestModel(self): - return self.bestModelSoFar diff --git a/myhelpers/tests/.ipynb_checkpoints/test-TrialStatistics-checkpoint.ipynb b/myhelpers/tests/.ipynb_checkpoints/test-TrialStatistics-checkpoint.ipynb deleted file mode 100644 index 787dc08..0000000 --- a/myhelpers/tests/.ipynb_checkpoints/test-TrialStatistics-checkpoint.ipynb +++ /dev/null @@ -1,738 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
image_pathsuffixtraining_countvalidation_countbatchSizen_epochslearning_ratenumOfTrialspatiencefc_widthfc_layersmodelTypelambdaunsupervisedOnTesttl_model
0/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet18
" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "script_root_dir = '../../'\n", - "import sys\n", - "import os\n", - "if script_root_dir not in sys.path:\n", - " sys.path.append(script_root_dir)\n", - "\n", - "import pandas as pd\n", - "from IPython.display import display, HTML\n", - "\n", - "# getModelName(trial_params)\n", - "experimentName = \"experiment\"\n", - "if not os.path.exists(experimentName):\n", - " os.makedirs(experimentName)\n", - " \n", - "experiments = [{'image_path': '/data/BGNN_data/INHS_cropped', 'suffix': '50_11', 'training_count': 0.64, 'validation_count': 0.16, 'batchSize': 32, 'n_epochs': 5000, 'learning_rate': 0.01, 'numOfTrials': 3, 'patience': 100, 'fc_width': 200, 'fc_layers': 1, 'modelType': 'blackbox', 'lambda': 0, 'unsupervisedOnTest': False, 'tl_model': 'ResNet18'},\n", - " {'image_path': '/data/BGNN_data/INHS_cropped', 'suffix': '50_11', 'training_count': 0.64, 'validation_count': 0.16, 'batchSize': 64, 'n_epochs': 5000, 'learning_rate': 0.01, 'numOfTrials': 3, 'patience': 100, 'fc_width': 200, 'fc_layers': 1, 'modelType': 'blackbox', 'lambda': 0, 'unsupervisedOnTest': False, 'tl_model': 'ResNet18'},\n", - " {'image_path': '/data/BGNN_data/INHS_cropped', 'suffix': '50_11', 'training_count': 0.64, 'validation_count': 0.16, 'batchSize': 128, 'n_epochs': 5000, 'learning_rate': 0.01, 'numOfTrials': 3, 'patience': 100, 'fc_width': 200, 'fc_layers': 1, 'modelType': 'blackbox', 'lambda': 0, 'unsupervisedOnTest': False, 'tl_model': 'ResNet18'}]\n", - " \n", - "\n", - "a = pd.DataFrame()\n", - "a = a.append(pd.DataFrame(experiments[0], index=[0]))\n", - "\n", - "display(HTML(a.to_html()))" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "raw statistics\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
image_pathsuffixtraining_countvalidation_countbatchSizen_epochslearning_ratenumOfTrialspatiencefc_widthfc_layersmodelTypelambdaunsupervisedOnTesttl_modellosstimehashtrial
0/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet180.0824615.95323975234365664891468480
1/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet180.0210580.70363575234365664891468481
2/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet180.0686610.90815575234365664891468482
3/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet180.0120286.26807975234365664891468483
4/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet180.0809173.65442575234365664891468484
5/data/BGNN_data/INHS_cropped50_110.640.166450000.0131002001blackbox0FalseResNet180.0775615.6600958487524002750432400
6/data/BGNN_data/INHS_cropped50_110.640.166450000.0131002001blackbox0FalseResNet180.0255548.0699918487524002750432401
7/data/BGNN_data/INHS_cropped50_110.640.166450000.0131002001blackbox0FalseResNet180.0810396.0931148487524002750432402
8/data/BGNN_data/INHS_cropped50_110.640.166450000.0131002001blackbox0FalseResNet180.0908070.3061348487524002750432403
9/data/BGNN_data/INHS_cropped50_110.640.166450000.0131002001blackbox0FalseResNet180.0429316.7219608487524002750432404
10/data/BGNN_data/INHS_cropped50_110.640.1612850000.0131002001blackbox0FalseResNet180.0261919.326968-36459346163738592480
11/data/BGNN_data/INHS_cropped50_110.640.1612850000.0131002001blackbox0FalseResNet180.0812511.653247-36459346163738592481
12/data/BGNN_data/INHS_cropped50_110.640.1612850000.0131002001blackbox0FalseResNet180.0836099.012880-36459346163738592482
13/data/BGNN_data/INHS_cropped50_110.640.1612850000.0131002001blackbox0FalseResNet180.0867400.659764-36459346163738592483
14/data/BGNN_data/INHS_cropped50_110.640.1612850000.0131002001blackbox0FalseResNet180.0443558.343113-36459346163738592484
" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import helpers.TrialStatistics as TS\n", - "import random\n", - "\n", - "ts = TS.TrialStatistics(experimentName)\n", - "\n", - "for ex in experiments:\n", - " for j in range(5):\n", - " ts.addTrial(ex, {'loss': random.random()*0.1,\n", - " 'time': random.random()*10\n", - " }, j)\n", - " \n", - "ts.showStatistics(False, saveHTML=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "aggregated statistics\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
image_pathsuffixtraining_countvalidation_countbatchSizen_epochslearning_ratenumOfTrialspatiencefc_widthfc_layersmodelTypelambdaunsupervisedOnTesttl_modelhashlosstime
meanstdmeanstd
0/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet1875234365664891468480.0530.0343.4982.657
1/data/BGNN_data/INHS_cropped50_110.640.166450000.0131002001blackbox0FalseResNet188487524002750432400.0640.0285.3702.974
2/data/BGNN_data/INHS_cropped50_110.640.1612850000.0131002001blackbox0FalseResNet18-36459346163738592480.0640.0275.7994.268
" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "ts.showStatistics(saveHTML=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.657\n" - ] - } - ], - "source": [ - "import torch\n", - "\n", - "a = ts.getStatistic(experiments[0],'time', 'std')\n", - "print(a)\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "ts.trialScatter('loss', 'time', save_plot=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdkAAAFNCAYAAABMsBVXAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAa1klEQVR4nO3df3TV9Z3n8dfbEE0AS6YKJ5KIyLSCFQOkFHUd3WkdfljqlDoM1WW2Vj3ruq1j6kzpyu4cTD2n41kZdaLbs6cOVj1W7SJlONp0wBany2zRKgRMUJtz3EBLQjIGZsJovJFLfO8f9wZJDJqbez/3e+/3Ph/ncK73fb/e7zvfc8mLz/f7uZ+vubsAAEDunRZ1AwAAxBUhCwBAIIQsAACBELIAAARCyAIAEAghCwBAIBOibuBkZ599ts+cOTPqNgAAyMju3bsPu/vUkfWCCtmZM2dq165dUbcBAEBGzOy3o9U5XQwAQCCELAAAgRCyAAAEUlDXZEeTTCbV2dmpgYGBqFvJqYqKCtXW1qq8vDzqVgAAgRR8yHZ2durMM8/UzJkzZWZRt5MT7q4jR46os7NT559/ftTtAAACKfjTxQMDAzrrrLNiE7CSZGY666yzYjc6BwAMV/AhKylWATskjj8TAGC4ogjZKA0MDGjRokWaN2+eLrroIt11112SpNWrV2v27NmaO3eubrrpJiWTyYg7BQAUGkL2Y5xxxhl64YUX9Oqrr2rv3r3aunWrXnrpJa1evVq/+c1v1NbWpkQioQ0bNkTdKgCgwBT8xKdMbdnTpfXb2nWoL6HpVZVas3S2ViyoGff7mZkmT54sKTXTOZlMysz0xS9+8cQ2ixYtUmdnZ9a9AwDiJVYj2S17urR2c5u6+hJySV19Ca3d3KYte7qyet/BwUHNnz9f06ZN0+LFi3XJJZeceC2ZTOqJJ57QsmXLsuw+Hpo7mrVk0xLVPV6nJZuWqLmjOeqWACAysQrZ9dvalUgODqslkoNav609q/ctKyvT3r171dnZqZdffln79u078do3vvENXXnllbriiiuy2kccNHc0q3Fno7r7u+Vydfd3q3FnI0ELoGTFKmQP9SUyqmeqqqpKn//857V161ZJ0ne/+1319vbq/vvvz8n7F7umliYNDA7/WtLA4ICaWpoi6ggAohWrkJ1eVZlRfSx6e3vV19cnSUokEvr5z3+uOXPmaMOGDdq2bZuefvppnXZarA7juPX092RUB4C4i9XEpzVLZ2vt5rZhp4wry8u0Zunscb9nd3e3brjhBg0ODur999/XqlWr9KUvfUkTJkzQeeedp8suu0ySdO2112rdunVZ/wzFrHpStbr7u0etA0ApilXIDs0izuXs4rq6Ou3Zs+dD9ePHj4/7PeOqob5BjTsbh50yriirUEN9Q4RdAUB0YhWyUiposwlVjN/yWcslpa7N9vT3qHpStRrqG07UAaDUxC5kEa3ls5YTqgCQxowdAAACIWQBAMGU+gI1nC4GAAQxtEDN0GTIoQVqJJXMZSVGsgCAIFighpAdk76+Pq1cuVJz5szRhRdeqBdffPHEa/fdd5/MTIcPH46wQwAoPCxQw+niMWloaNCyZcu0adMmHTt2TO+++64k6eDBg3r++ec1Y8aMiDsEgMLDAjVxHMm2bpQemCs1VqUeWzdm9XZHjx7Vjh07dPPNN0uSTj/9dFVVVUmS7rjjDt17770ys6zbBoC4aahvUEVZxbBaqS1QE6+RbOtG6bnbpWT6hgBHD6aeS1LdqnG95f79+zV16lTdeOONevXVV/XZz35WTU1N+sUvfqGamhrNmzcvR80DQLywQE3cQnb73R8E7JBkIlUfZ8geP35cLS0teuihh3TJJZeooaFBjY2N2rFjh55//vkcNA0A8VXqC9TE63Tx0c7M6mNQW1ur2traEzdqX7lypVpaWrR//37NmzdPM2fOVGdnp+rr69XTUzoX8wEAHy9eITulNrP6GFRXV+vcc89Ve3vqxu/bt29XfX293nrrLR04cEAHDhxQbW2tWlpaVF1dOhfzAQAfL16ni69aN/yarCSVV6bqWXjooYe0evVqHTt2TLNmzdKjjz6aZaMAgFIQr5Aduu66/e7UKeIptamAHef12CHz58/Xrl27Tvn6gQMHsnp/AEA8xStkpVSgZhmqAADkQryuyQIAUEAIWQAAAiFkAQAIhJAFACAQQhYAgEAI2TG46aabNG3aNM2dO/dEbc2aNZozZ47q6ur0la98RX19fZKkZDKpG264QRdffLEuvPBC3XPPPVG1DQCIGCE7Bl//+te1devWYbXFixdr3759am1t1QUXXHAiTJ955hm99957amtr0+7du/WDH/yA79ECQImKXcg2dzRryaYlqnu8Tks2LVFzR3PW73nllVfqk5/85LDakiVLNGFC6mvGl156qTo7U+sjm5n6+/t1/PhxJRIJnX766frEJz6RdQ8oPSE+ywDyK1Yh29zRrMadjeru75bL1d3frcadjcF/Of3whz/U1VdfLSl1A4FJkybpnHPO0YwZM/Ttb3/7QwENfJyoPssAcitWIdvU0qSBwYFhtYHBATW1NAXb5/e+9z1NmDBBq1evliS9/PLLKisr06FDh7R//37dd9996ujoCLZ/xFMUn2UAuRerkO3pH/1Wc6eqZ+uxxx7TT3/6Uz355JMyM0nSU089pWXLlqm8vFzTpk3T5Zdf/pHrHgOjyfdnGUAYsQrZ6kmj32ruVPVsbN26Vffee6+effZZTZw48UR9xowZeuGFFyRJ/f39eumllzRnzpyc7x/xls/PMoBwYhWyDfUNqiirGFarKKtQQ31DVu97/fXX67LLLlN7e7tqa2v1yCOP6LbbbtPbb7+txYsXa/78+br11lslSd/85jf1zjvv6KKLLtLnPvc53Xjjjaqrq8tq/yg9oT7LAPIrVnfhWT5ruaTU9aye/h5VT6pWQ33Difp4Pf300x+q3XzzzaNuO3nyZD3zzDNZ7Q8I9VkGkF+xClkp9cuJX0R51rox5/fwBZ9lIA5iF7LIs9aN0nO3S8lE6vnRg6nnEkELoOQFvSZrZneY2Wtmts/Mnjazio//v1BUtt/9QcAOSSZSdQAoccFC1sxqJN0uaaG7z5VUJum68byXu+eytYIQm5/paGdmdQAoIaFnF0+QVGlmEyRNlHQo0zeoqKjQkSNH4hNKSgXskSNHVFERg4H9lNrM6gBQQoJdk3X3LjP7G0m/k5SQ9Ly7Pz9yOzO7RdItUuo7piPV1taqs7NTvb29oVqNREVFhWprYxBEV60bfk1WksorU3UAKHEWaoRoZr8n6SeSviqpT9Izkja5+49O9f8sXLjQWR2pCDG7GECJM7Pd7r5wZD3k7OI/krTf3XvTDWyW9O8knTJkUaTqVhGqADCKkNdkfyfpUjObaKmFfa+S9EbA/QEAUFCChay7/1rSJkktktrS+3o41P4AACg0QRejcPe7JN0Vch8AABSqWN0gAACAQkLIAgAQCCELAEAghCwAAIEQsgAABELIAgAQCCELAEAghCwAAIEQsgAABELIAgAQCCELAEAghCwAAIEQsgAABELIAgAQCCELAEAghCwAAIEQsgAABELIAgAQCCELAEAghCwAAIEQsgAABELIAgAQCCELAEAghCwAAIEQsgAABELIAgAQCCELAEAghCwAAIEQskCUWjdKD8yVGqtSj60bo+4IQA5NiLoBoGS1bpSeu11KJlLPjx5MPZekulXR9QUgZxjJAlHZfvcHATskmUjVAcQCIQtE5WhnZnUARYeQBaIypTazOoCiQ8gCUblqnVReObxWXpmqA4gFQhaISt0q6ZoHpSnnSrLU4zUPMukJiBFmFwNRqltFqAIxxkgWAIBACFkAAAIhZAEACISQBQAgEEIWAIBAmF2cY1v2dGn9tnYd6ktoelWl1iydrRULaqJuCwAQAUI2h7bs6dLazW1KJAclSV19Ca3d3CZJBC0AlCBOF+fQ+m3tJwJ2SCI5qPXb2iPqCAAQJUI2hw71JTKqAwDijZDNoelVlRnVAQDxRsjm0Jqls1VZXjasVllepjVLZ0fUEQAE0LpRemCu1FiVemzdGHVHBYuJTzk0NLmJ2cUAYqt1o/Tc7VIyfRns6MHUc4l1uEdh7h7uzc2qJG2QNFeSS7rJ3V881fYLFy70Xbt2BesHAJClB+amgnWkKedKd+zLfz8Fwsx2u/vCkfXQI9kmSVvdfaWZnS5pYuD9AQBCOtqZWb3EBQtZM5si6UpJX5ckdz8m6Vio/QEA8mBK7SlGsrUsxjOKkBOfzpfUK+lRM9tjZhvMbNLIjczsFjPbZWa7ent7A7YDAMjaVeuk8hHfmCiv1Cu//+dau7lNXX0JuT5YjGfLnq5I2iwUIUN2gqR6Sf/L3RdI6pd058iN3P1hd1/o7gunTp0asB0AQNbqVknXPJi6BitLPV7zoL71+qdZjGcUIa/JdkrqdPdfp59v0ighCwAoMnWrPjST+NBTzaNuWuqL8QQbybp7j6SDZjb0JdGrJL0ean8AgOiwGM/oQi9G8eeSnjSzVknzJf114P0BACLAYjyjC/oVHnffK+lD3xsCAMQLi/GMjhWfAAA5sWJBTcmH6kisXQwApYa1h/OGkSwAlBLWHs4rRrIAUEq23/1BwA5JJlJ15BwhCwClhLWH84qQBYBSMqU2szqyQsgCQCk5xdrDumpdNP3EHCELAKXkFGsPM+kpDGYXA0CpGWXtYYTBSBYAgEAIWQAAAiFkAQAIhJAFACAQQhYAgEAIWQAAAiFkAQAIhJAFACAQQhYAgEAIWQAAAvnYkDWzC8xsu5ntSz+vM7O/Ct8aAADFbSwj2b+TtFZSUpLcvVXSdSGbAgAgDsYSshPd/eURteMhmgEAIE7GErKHzez3JbkkmdlKSd1BuwIAIAbGcqu7b0p6WNIcM+uStF/SnwXtCgCAGPjYkHX3Dkl/ZGaTJJ3m7m+HbwsAgOL3sSFrZlWSviZppqQJZiZJcvfbg3YGAECRG8vp4p9JeklSm6T3w7YDAEB8jCVkK9z9L4J3AgBAzIxldvETZvafzOwcM/vk0J/gnQEAUOTGMpI9Jmm9pP+u9Nd40o+zQjUFAEAcjCVk/1LSp9z9cOhmAACIk7GcLn5T0ruhGwEAIG7GMpLtl7TXzP5R0ntDRb7CAwDARxtLyG5J/wEAABkYy4pPj+ejEQAA4uaUIWtmG919lZm16YNZxUPc3eeFbQ0AgOL2USPZhvTjG5LWnFQ3SfcG6wgAgJg4Zci6+9Dt7D7l7r89+TUzmxO0KwAAYuCjThf/F0nfkDTLzFpPeulMSb8K3RgAAMXuo04XPyXpHyTdI+nOk+pvu/u/BO0KAIAY+KjTxUclHZV0ff7aAQAgPsay4hMAABgHQhYAgEAIWQAAAiFkAQAIhJAFACAQQhYAgEAIWQAAAgkesmZWZmZ7zOynofcFAEAhycdItkGpmwwAAFBSgoasmdVKWi5pQ8j9AABQiEKPZP9W0nckvX+qDczsFjPbZWa7ent7A7cDAED+BAtZM/uSpLfcffdHbefuD7v7QndfOHXq1FDtAACQdyFHspdL+mMzOyDpx5K+YGY/Crg/AAAKSrCQdfe17l7r7jMlXSfpBXf/s1D7AwCg0PA9WQAAAvmom7bnjLv/UtIv87EvAAAKBSNZAAACyctIFgAQD1v2dGn9tnYd6ktoelWl1iydrRULaqJuq2ARsgCAMdmyp0trN7cpkRyUJHX1JbR2c5skEbSnwOliAMCYrN/WfiJghySSg1q/rT2ijgofIQsAGJNDfYmM6iBkAQBjNL2qMqM6CFkAwBitWTpbleVlw2qV5WVas3R2RB0VPiY+AQDGZGhyE7OLx46QBQCM2YoFNYRqBjhdDABAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAAQSLGTN7Fwz+0cze93MXjOzhlD7AgCgEE0I+N7HJf2lu7eY2ZmSdpvZz9399YD7BACgYAQbybp7t7u3pP/7bUlvSKoJtT8AAApNXq7JmtlMSQsk/Tof+wMAoBAED1kzmyzpJ5K+5e7/Nsrrt5jZLjPb1dvbG7odAADyJmjImlm5UgH7pLtvHm0bd3/Y3Re6+8KpU6eGbAcAgLwKObvYJD0i6Q13vz/UfgAAKFQhR7KXS/qPkr5gZnvTf74YcH8AABSUYF/hcff/K8lCvT8AAIWOFZ8AAAiEkAUAZKy5o1lLNi1R3eN1WrJpiZo7mqNuqSCFXPEJABBDzR3NatzZqIHBAUlSd3+3Gnc2SpKWz1oeYWeFh5EsACAjTS1NJwJ2yMDggJpamiLqqHARsgCAjPT092RUL2WELAAgI9WTqjOqlzJCFgCQkYb6BlWUVQyrVZRVqKGeO5qOxMQnAEBGhiY3NbU0qae/R9WTqtVQ38Ckp1EQsgCAjC2ftZxQHQNOFwMAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAINzqDgByaMueLq3f1q5DfQlNr6rUmqWztWJBTdRtISKELADkyJY9XVq7uU2J5KAkqasvobWb2ySJoC1RnC4GgBxZv639RMAOSSQHtX5be0QdIWqELADkyKG+REZ1xB8hCwA5Mr2qMqM64o+QBYAcWbN0tirLy4bVKsvLtGbp7Ig6QtSY+FSCmP0IhDH094i/XxhCyJYYZj8CYa1YUMPfpRxp7mhWU0uTevp7VD2pWg31DVo+a3nUbWWE08UlhtmPAIpBc0ezGnc2qru/Wy5Xd3+3Gnc2qrmjOerWMkLIlhhmPwIoBk0tTRoYHBhWGxgcUFNLU0QdjQ8hW2KY/QigGPT092RUL1SEbIlh9iOAYlA9qTqjeqEiZEvMigU1uufai1VTVSmTVFNVqXuuvZiJGgAKSkN9gyrKKobVKsoq1FDfEFFH48Ps4hLE7EcAhW5oFnGxzy4mZAEABWn5rOVFF6ojcboYAIBACFkAAAIhZAEA8da6UXpgrtRYlXps3Zi3XXNNFgAQX60bpedul5LpBXeOHkw9l6S6VcF3z0gWABBf2+/+IGCHJBOpeh4QsgCA+DramVk9xwhZAEB8TanNrJ5jhCwAIL6uWieVj1ibvbwyVc8DQhYAEF91q6RrHpSmnCvJUo/XPJiXSU8Ss4sBAHFXtypvoTpS0JGsmS0zs3Yze9PM7gy5LwAACk2wkDWzMknfl3S1pM9Iut7MPhNqfwAAFJqQI9lFkt509w53Pybpx5K+HHB/AAAUlJAhWyPp4EnPO9M1AABKQuSzi83sFjPbZWa7ent7o24HAICcCRmyXZLOPel5bbo2jLs/7O4L3X3h1KlTA7YDAEB+hQzZVyR92szON7PTJV0n6dmA+wMAoKAE+56sux83s9skbZNUJumH7v5aqP0BAFBogi5G4e4/k/SzkPsAAKBQRT7xCQCAuDJ3j7qHE8ysV9Jvo+4jps6WdDjqJkoExzp/ONb5w7H+aOe5+4dm7xZUyCIcM9vl7guj7qMUcKzzh2OdPxzr8eF0MQAAgRCyAAAEQsiWjoejbqCEcKzzh2OdPxzrceCaLAAAgTCSBQAgEEI2BsxsmZm1m9mbZnbnKK+fYWb/O/36r81sZrq+2Mx2m1lb+vEL+e692Iz3WJ/0+gwze8fMvp2vnotRNsfZzOrM7EUzey392a7IZ+/FJovfH+Vm9nj6GL9hZmvz3XsxIGSLnJmVSfq+pKslfUbS9Wb2mRGb3SzpX939U5IekPQ/0vXDkq5x94sl3SDpifx0XZyyPNZD7pf0D6F7LWbZHGczmyDpR5JudfeLJP2hpGSeWi86WX6m/1TSGenfH5+V9J9H/qMShGwcLJL0prt3uPsxST+W9OUR23xZ0uPp/94k6SozM3ff4+6H0vXXJFWa2Rl56bo4jftYS5KZrZC0X6ljjVPL5jgvkdTq7q9KkrsfcffBPPVdjLI51i5pUvofNpWSjkn6t/y0XTwI2eJXI+ngSc8707VRt3H345KOSjprxDZ/IqnF3d8L1GccjPtYm9lkSf9V0nfz0Gexy+YzfYEkN7NtZtZiZt/JQ7/FLJtjvUlSv6RuSb+T9Dfu/i+hGy42QW8QgOJgZhcpdQpoSdS9xFijpAfc/Z30wBZhTJD0B5I+J+ldSdvNbLe7b4+2rVhaJGlQ0nRJvyfpn8zsF+7eEW1bhYWRbPHrknTuSc9r07VRt0mf2pki6Uj6ea2kv5f0NXf/f8G7LW7ZHOtLJN1rZgckfUvSf0vfChIfls1x7pS0w90Pu/u7St0FrD54x8Urm2P9HyRtdfeku78l6VeSWHZxBEK2+L0i6dNmdr6ZnS7pOknPjtjmWaUmNknSSkkvuLubWZWkZkl3uvuv8tZx8Rr3sXb3K9x9prvPlPS3kv7a3f9nvhovMuM+zkrdv/piM5uYDoR/L+n1PPVdjLI51r+T9AVJMrNJki6V9Ju8dF1ECNkil75GcptSv1zekLTR3V8zs7vN7I/Tmz2i1HXBNyX9haShafq3SfqUpHVmtjf9Z1qef4SikeWxxhhlc5zd/V+VmsH9iqS9Ss0zaM73z1AssvxMf1/SZDN7Tanj/ai7t+b3Jyh8rPgEAEAgjGQBAAiEkAUAIBBCFgCAQAhZAAACIWQBAAiEkAViwMzeiboHAB9GyAIAEAghC8SIpaw3s33p+3x+NV0/x8x2pBcc2WdmV5hZmZk9dtK2d0TdPxA33CAAiJdrJc2XNE/S2ZJeMbMdSq0zu83dv5e+h+jE9HY17j5XktLLbALIIUayQLz8gaSn3X3Q3f9Z0v9R6o40r0i60cwaJV3s7m9L6pA0y8weMrNl4l6gQM4RskAJcPcdkq5U6o4qj5nZ19Lr/M6T9EtJt0raEF2HQDwRskC8/JOkr6avt05VKlhfNrPzJP2zu/+dUmFab2ZnSzrN3X8i6a/ELeGAnOOaLBAvfy/pMkmvSnJJ33H3HjO7QdIaM0tKekfS1yTVSHrUzIb+sb02ioaBOOMuPAAABMLpYgAAAiFkAQAIhJAFACAQQhYAgEAIWQAAAiFkAQAIhJAFACAQQhYAgED+P3j5MzI0+6xrAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "ts.trialScatter('loss', 'time', 'batchSize', save_plot=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "ts.saveStatistics()\n", - "ts.saveStatistics(False)" - ] - }, - { - "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.6.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/myhelpers/tests/__init__.py b/myhelpers/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/myhelpers/tests/experiment/agg_experiments.csv b/myhelpers/tests/experiment/agg_experiments.csv deleted file mode 100644 index b8e7e40..0000000 --- a/myhelpers/tests/experiment/agg_experiments.csv +++ /dev/null @@ -1,5 +0,0 @@ -,image_path,suffix,training_count,validation_count,batchSize,n_epochs,learning_rate,numOfTrials,patience,fc_width,fc_layers,modelType,lambda,unsupervisedOnTest,tl_model,hash,loss,loss,time,time -,,,,,,,,,,,,,,,,,mean,std,mean,std -0,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,32,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,7523436566489146848,0.053,0.034,3.498,2.657 -1,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,64,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,848752400275043240,0.064,0.028,5.37,2.974 -2,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,128,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,-3645934616373859248,0.064,0.027,5.799,4.268 diff --git a/myhelpers/tests/experiment/aggregated statistics.html b/myhelpers/tests/experiment/aggregated statistics.html deleted file mode 100644 index 5b5059f..0000000 --- a/myhelpers/tests/experiment/aggregated statistics.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - PivotTable.js - - - - - - - - - - - - - - - - - - - - - - - diff --git a/myhelpers/tests/experiment/plot by batchSize.pdf b/myhelpers/tests/experiment/plot by batchSize.pdf deleted file mode 100644 index 69325f4b01a505da09c98c867ca91558c5d36e46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9952 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 diff --git a/myhelpers/tests/experiment/plot.pdf b/myhelpers/tests/experiment/plot.pdf deleted file mode 100644 index c349cf66cdc78bb82d30df6f5432bd97383589b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8993 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 - - - - PivotTable.js - - - - - - - - - - - - - - - - - - - - -

- - diff --git a/myhelpers/tests/experiment/raw_experiments.csv b/myhelpers/tests/experiment/raw_experiments.csv deleted file mode 100644 index 4362012..0000000 --- a/myhelpers/tests/experiment/raw_experiments.csv +++ /dev/null @@ -1,16 +0,0 @@ -,image_path,suffix,training_count,validation_count,batchSize,n_epochs,learning_rate,numOfTrials,patience,fc_width,fc_layers,modelType,lambda,unsupervisedOnTest,tl_model,loss,time,hash,trial -0,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,32,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.08246078401519345,5.953239030380464,7523436566489146848,0 -1,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,32,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.021058343099300127,0.703635047022354,7523436566489146848,1 -2,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,32,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.06866148820062024,0.9081553014073263,7523436566489146848,2 -3,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,32,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.012027769412850742,6.268079010017793,7523436566489146848,3 -4,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,32,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.08091720993434807,3.6544246718676265,7523436566489146848,4 -5,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,64,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.07756087317273633,5.660095188401496,848752400275043240,0 -6,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,64,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.025553703670690688,8.069991257726157,848752400275043240,1 -7,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,64,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.08103899152363264,6.093114351410426,848752400275043240,2 -8,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,64,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.09080661951488321,0.30613439026149547,848752400275043240,3 -9,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,64,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.04293054840633795,6.721960231037336,848752400275043240,4 -10,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,128,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.026191347843988314,9.326968213933043,-3645934616373859248,0 -11,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,128,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.08125067379222689,1.6532471924916192,-3645934616373859248,1 -12,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,128,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.08360901113028786,9.01287976811761,-3645934616373859248,2 -13,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,128,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.08673956618213487,0.6597640241175817,-3645934616373859248,3 -14,/data/BGNN_data/INHS_cropped,50_11,0.64,0.16,128,5000,0.01,3,100,200,1,blackbox,0,False,ResNet18,0.04435478721853064,8.343113170333007,-3645934616373859248,4 diff --git a/myhelpers/tests/test-TrialStatistics.ipynb b/myhelpers/tests/test-TrialStatistics.ipynb deleted file mode 100644 index 0a8e82f..0000000 --- a/myhelpers/tests/test-TrialStatistics.ipynb +++ /dev/null @@ -1,738 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
image_pathsuffixtraining_countvalidation_countbatchSizen_epochslearning_ratenumOfTrialspatiencefc_widthfc_layersmodelTypelambdaunsupervisedOnTesttl_model
0/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet18
" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "script_root_dir = '../../'\n", - "import sys\n", - "import os\n", - "if script_root_dir not in sys.path:\n", - " sys.path.append(script_root_dir)\n", - "\n", - "import pandas as pd\n", - "from IPython.display import display, HTML\n", - "\n", - "# getModelName(trial_params)\n", - "experimentName = \"experiment\"\n", - "if not os.path.exists(experimentName):\n", - " os.makedirs(experimentName)\n", - " \n", - "experiments = [{'image_path': '/data/BGNN_data/INHS_cropped', 'suffix': '50_11', 'training_count': 0.64, 'validation_count': 0.16, 'batchSize': 32, 'n_epochs': 5000, 'learning_rate': 0.01, 'numOfTrials': 3, 'patience': 100, 'fc_width': 200, 'fc_layers': 1, 'modelType': 'blackbox', 'lambda': 0, 'unsupervisedOnTest': False, 'tl_model': 'ResNet18'},\n", - " {'image_path': '/data/BGNN_data/INHS_cropped', 'suffix': '50_11', 'training_count': 0.64, 'validation_count': 0.16, 'batchSize': 64, 'n_epochs': 5000, 'learning_rate': 0.01, 'numOfTrials': 3, 'patience': 100, 'fc_width': 200, 'fc_layers': 1, 'modelType': 'blackbox', 'lambda': 0, 'unsupervisedOnTest': False, 'tl_model': 'ResNet18'},\n", - " {'image_path': '/data/BGNN_data/INHS_cropped', 'suffix': '50_11', 'training_count': 0.64, 'validation_count': 0.16, 'batchSize': 128, 'n_epochs': 5000, 'learning_rate': 0.01, 'numOfTrials': 3, 'patience': 100, 'fc_width': 200, 'fc_layers': 1, 'modelType': 'blackbox', 'lambda': 0, 'unsupervisedOnTest': False, 'tl_model': 'ResNet18'}]\n", - " \n", - "\n", - "a = pd.DataFrame()\n", - "a = a.append(pd.DataFrame(experiments[0], index=[0]))\n", - "\n", - "display(HTML(a.to_html()))" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "raw statistics\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
image_pathsuffixtraining_countvalidation_countbatchSizen_epochslearning_ratenumOfTrialspatiencefc_widthfc_layersmodelTypelambdaunsupervisedOnTesttl_modellosstimehashtrial
0/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet180.0824615.95323975234365664891468480
1/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet180.0210580.70363575234365664891468481
2/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet180.0686610.90815575234365664891468482
3/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet180.0120286.26807975234365664891468483
4/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet180.0809173.65442575234365664891468484
5/data/BGNN_data/INHS_cropped50_110.640.166450000.0131002001blackbox0FalseResNet180.0775615.6600958487524002750432400
6/data/BGNN_data/INHS_cropped50_110.640.166450000.0131002001blackbox0FalseResNet180.0255548.0699918487524002750432401
7/data/BGNN_data/INHS_cropped50_110.640.166450000.0131002001blackbox0FalseResNet180.0810396.0931148487524002750432402
8/data/BGNN_data/INHS_cropped50_110.640.166450000.0131002001blackbox0FalseResNet180.0908070.3061348487524002750432403
9/data/BGNN_data/INHS_cropped50_110.640.166450000.0131002001blackbox0FalseResNet180.0429316.7219608487524002750432404
10/data/BGNN_data/INHS_cropped50_110.640.1612850000.0131002001blackbox0FalseResNet180.0261919.326968-36459346163738592480
11/data/BGNN_data/INHS_cropped50_110.640.1612850000.0131002001blackbox0FalseResNet180.0812511.653247-36459346163738592481
12/data/BGNN_data/INHS_cropped50_110.640.1612850000.0131002001blackbox0FalseResNet180.0836099.012880-36459346163738592482
13/data/BGNN_data/INHS_cropped50_110.640.1612850000.0131002001blackbox0FalseResNet180.0867400.659764-36459346163738592483
14/data/BGNN_data/INHS_cropped50_110.640.1612850000.0131002001blackbox0FalseResNet180.0443558.343113-36459346163738592484
" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import helpers.TrialStatistics as TS\n", - "import random\n", - "\n", - "ts = TS.TrialStatistics(experimentName)\n", - "\n", - "for ex in experiments:\n", - " for j in range(5):\n", - " ts.addTrial(ex, {'loss': random.random()*0.1,\n", - " 'time': random.random()*10\n", - " }, j)\n", - " \n", - "ts.showStatistics(False, saveHTML=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "aggregated statistics\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
image_pathsuffixtraining_countvalidation_countbatchSizen_epochslearning_ratenumOfTrialspatiencefc_widthfc_layersmodelTypelambdaunsupervisedOnTesttl_modelhashlosstime
meanstdmeanstd
0/data/BGNN_data/INHS_cropped50_110.640.163250000.0131002001blackbox0FalseResNet1875234365664891468480.0530.0343.4982.657
1/data/BGNN_data/INHS_cropped50_110.640.166450000.0131002001blackbox0FalseResNet188487524002750432400.0640.0285.3702.974
2/data/BGNN_data/INHS_cropped50_110.640.1612850000.0131002001blackbox0FalseResNet18-36459346163738592480.0640.0275.7994.268
" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "ts.showStatistics(saveHTML=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.657\n" - ] - } - ], - "source": [ - "import torch\n", - "\n", - "a = ts.getStatistic(experiments[0],'time', 'std')\n", - "print(a)\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "ts.trialScatter('loss', 'time', save_plot=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdkAAAFNCAYAAABMsBVXAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAa1klEQVR4nO3df3TV9Z3n8dfbEE0AS6YKJ5KIyLSCFQOkFHUd3WkdfljqlDoM1WW2Vj3ruq1j6kzpyu4cTD2n41kZdaLbs6cOVj1W7SJlONp0wBany2zRKgRMUJtz3EBLQjIGZsJovJFLfO8f9wZJDJqbez/3e+/3Ph/ncK73fb/e7zvfc8mLz/f7uZ+vubsAAEDunRZ1AwAAxBUhCwBAIIQsAACBELIAAARCyAIAEAghCwBAIBOibuBkZ599ts+cOTPqNgAAyMju3bsPu/vUkfWCCtmZM2dq165dUbcBAEBGzOy3o9U5XQwAQCCELAAAgRCyAAAEUlDXZEeTTCbV2dmpgYGBqFvJqYqKCtXW1qq8vDzqVgAAgRR8yHZ2durMM8/UzJkzZWZRt5MT7q4jR46os7NT559/ftTtAAACKfjTxQMDAzrrrLNiE7CSZGY666yzYjc6BwAMV/AhKylWATskjj8TAGC4ogjZKA0MDGjRokWaN2+eLrroIt11112SpNWrV2v27NmaO3eubrrpJiWTyYg7BQAUGkL2Y5xxxhl64YUX9Oqrr2rv3r3aunWrXnrpJa1evVq/+c1v1NbWpkQioQ0bNkTdKgCgwBT8xKdMbdnTpfXb2nWoL6HpVZVas3S2ViyoGff7mZkmT54sKTXTOZlMysz0xS9+8cQ2ixYtUmdnZ9a9AwDiJVYj2S17urR2c5u6+hJySV19Ca3d3KYte7qyet/BwUHNnz9f06ZN0+LFi3XJJZeceC2ZTOqJJ57QsmXLsuw+Hpo7mrVk0xLVPV6nJZuWqLmjOeqWACAysQrZ9dvalUgODqslkoNav609q/ctKyvT3r171dnZqZdffln79u078do3vvENXXnllbriiiuy2kccNHc0q3Fno7r7u+Vydfd3q3FnI0ELoGTFKmQP9SUyqmeqqqpKn//857V161ZJ0ne/+1319vbq/vvvz8n7F7umliYNDA7/WtLA4ICaWpoi6ggAohWrkJ1eVZlRfSx6e3vV19cnSUokEvr5z3+uOXPmaMOGDdq2bZuefvppnXZarA7juPX092RUB4C4i9XEpzVLZ2vt5rZhp4wry8u0Zunscb9nd3e3brjhBg0ODur999/XqlWr9KUvfUkTJkzQeeedp8suu0ySdO2112rdunVZ/wzFrHpStbr7u0etA0ApilXIDs0izuXs4rq6Ou3Zs+dD9ePHj4/7PeOqob5BjTsbh50yriirUEN9Q4RdAUB0YhWyUiposwlVjN/yWcslpa7N9vT3qHpStRrqG07UAaDUxC5kEa3ls5YTqgCQxowdAAACIWQBAMGU+gI1nC4GAAQxtEDN0GTIoQVqJJXMZSVGsgCAIFighpAdk76+Pq1cuVJz5szRhRdeqBdffPHEa/fdd5/MTIcPH46wQwAoPCxQw+niMWloaNCyZcu0adMmHTt2TO+++64k6eDBg3r++ec1Y8aMiDsEgMLDAjVxHMm2bpQemCs1VqUeWzdm9XZHjx7Vjh07dPPNN0uSTj/9dFVVVUmS7rjjDt17770ys6zbBoC4aahvUEVZxbBaqS1QE6+RbOtG6bnbpWT6hgBHD6aeS1LdqnG95f79+zV16lTdeOONevXVV/XZz35WTU1N+sUvfqGamhrNmzcvR80DQLywQE3cQnb73R8E7JBkIlUfZ8geP35cLS0teuihh3TJJZeooaFBjY2N2rFjh55//vkcNA0A8VXqC9TE63Tx0c7M6mNQW1ur2traEzdqX7lypVpaWrR//37NmzdPM2fOVGdnp+rr69XTUzoX8wEAHy9eITulNrP6GFRXV+vcc89Ve3vqxu/bt29XfX293nrrLR04cEAHDhxQbW2tWlpaVF1dOhfzAQAfL16ni69aN/yarCSVV6bqWXjooYe0evVqHTt2TLNmzdKjjz6aZaMAgFIQr5Aduu66/e7UKeIptamAHef12CHz58/Xrl27Tvn6gQMHsnp/AEA8xStkpVSgZhmqAADkQryuyQIAUEAIWQAAAiFkAQAIhJAFACAQQhYAgEAI2TG46aabNG3aNM2dO/dEbc2aNZozZ47q6ur0la98RX19fZKkZDKpG264QRdffLEuvPBC3XPPPVG1DQCIGCE7Bl//+te1devWYbXFixdr3759am1t1QUXXHAiTJ955hm99957amtr0+7du/WDH/yA79ECQImKXcg2dzRryaYlqnu8Tks2LVFzR3PW73nllVfqk5/85LDakiVLNGFC6mvGl156qTo7U+sjm5n6+/t1/PhxJRIJnX766frEJz6RdQ8oPSE+ywDyK1Yh29zRrMadjeru75bL1d3frcadjcF/Of3whz/U1VdfLSl1A4FJkybpnHPO0YwZM/Ttb3/7QwENfJyoPssAcitWIdvU0qSBwYFhtYHBATW1NAXb5/e+9z1NmDBBq1evliS9/PLLKisr06FDh7R//37dd9996ujoCLZ/xFMUn2UAuRerkO3pH/1Wc6eqZ+uxxx7TT3/6Uz355JMyM0nSU089pWXLlqm8vFzTpk3T5Zdf/pHrHgOjyfdnGUAYsQrZ6kmj32ruVPVsbN26Vffee6+effZZTZw48UR9xowZeuGFFyRJ/f39eumllzRnzpyc7x/xls/PMoBwYhWyDfUNqiirGFarKKtQQ31DVu97/fXX67LLLlN7e7tqa2v1yCOP6LbbbtPbb7+txYsXa/78+br11lslSd/85jf1zjvv6KKLLtLnPvc53Xjjjaqrq8tq/yg9oT7LAPIrVnfhWT5ruaTU9aye/h5VT6pWQ33Difp4Pf300x+q3XzzzaNuO3nyZD3zzDNZ7Q8I9VkGkF+xClkp9cuJX0R51rox5/fwBZ9lIA5iF7LIs9aN0nO3S8lE6vnRg6nnEkELoOQFvSZrZneY2Wtmts/Mnjazio//v1BUtt/9QcAOSSZSdQAoccFC1sxqJN0uaaG7z5VUJum68byXu+eytYIQm5/paGdmdQAoIaFnF0+QVGlmEyRNlHQo0zeoqKjQkSNH4hNKSgXskSNHVFERg4H9lNrM6gBQQoJdk3X3LjP7G0m/k5SQ9Ly7Pz9yOzO7RdItUuo7piPV1taqs7NTvb29oVqNREVFhWprYxBEV60bfk1WksorU3UAKHEWaoRoZr8n6SeSviqpT9Izkja5+49O9f8sXLjQWR2pCDG7GECJM7Pd7r5wZD3k7OI/krTf3XvTDWyW9O8knTJkUaTqVhGqADCKkNdkfyfpUjObaKmFfa+S9EbA/QEAUFCChay7/1rSJkktktrS+3o41P4AACg0QRejcPe7JN0Vch8AABSqWN0gAACAQkLIAgAQCCELAEAghCwAAIEQsgAABELIAgAQCCELAEAghCwAAIEQsgAABELIAgAQCCELAEAghCwAAIEQsgAABELIAgAQCCELAEAghCwAAIEQsgAABELIAgAQCCELAEAghCwAAIEQsgAABELIAgAQCCELAEAghCwAAIEQsgAABELIAgAQCCELAEAghCwAAIEQskCUWjdKD8yVGqtSj60bo+4IQA5NiLoBoGS1bpSeu11KJlLPjx5MPZekulXR9QUgZxjJAlHZfvcHATskmUjVAcQCIQtE5WhnZnUARYeQBaIypTazOoCiQ8gCUblqnVReObxWXpmqA4gFQhaISt0q6ZoHpSnnSrLU4zUPMukJiBFmFwNRqltFqAIxxkgWAIBACFkAAAIhZAEACISQBQAgEEIWAIBAmF2cY1v2dGn9tnYd6ktoelWl1iydrRULaqJuCwAQAUI2h7bs6dLazW1KJAclSV19Ca3d3CZJBC0AlCBOF+fQ+m3tJwJ2SCI5qPXb2iPqCAAQJUI2hw71JTKqAwDijZDNoelVlRnVAQDxRsjm0Jqls1VZXjasVllepjVLZ0fUEQAE0LpRemCu1FiVemzdGHVHBYuJTzk0NLmJ2cUAYqt1o/Tc7VIyfRns6MHUc4l1uEdh7h7uzc2qJG2QNFeSS7rJ3V881fYLFy70Xbt2BesHAJClB+amgnWkKedKd+zLfz8Fwsx2u/vCkfXQI9kmSVvdfaWZnS5pYuD9AQBCOtqZWb3EBQtZM5si6UpJX5ckdz8m6Vio/QEA8mBK7SlGsrUsxjOKkBOfzpfUK+lRM9tjZhvMbNLIjczsFjPbZWa7ent7A7YDAMjaVeuk8hHfmCiv1Cu//+dau7lNXX0JuT5YjGfLnq5I2iwUIUN2gqR6Sf/L3RdI6pd058iN3P1hd1/o7gunTp0asB0AQNbqVknXPJi6BitLPV7zoL71+qdZjGcUIa/JdkrqdPdfp59v0ighCwAoMnWrPjST+NBTzaNuWuqL8QQbybp7j6SDZjb0JdGrJL0ean8AgOiwGM/oQi9G8eeSnjSzVknzJf114P0BACLAYjyjC/oVHnffK+lD3xsCAMQLi/GMjhWfAAA5sWJBTcmH6kisXQwApYa1h/OGkSwAlBLWHs4rRrIAUEq23/1BwA5JJlJ15BwhCwClhLWH84qQBYBSMqU2szqyQsgCQCk5xdrDumpdNP3EHCELAKXkFGsPM+kpDGYXA0CpGWXtYYTBSBYAgEAIWQAAAiFkAQAIhJAFACAQQhYAgEAIWQAAAiFkAQAIhJAFACAQQhYAgEAIWQAAAvnYkDWzC8xsu5ntSz+vM7O/Ct8aAADFbSwj2b+TtFZSUpLcvVXSdSGbAgAgDsYSshPd/eURteMhmgEAIE7GErKHzez3JbkkmdlKSd1BuwIAIAbGcqu7b0p6WNIcM+uStF/SnwXtCgCAGPjYkHX3Dkl/ZGaTJJ3m7m+HbwsAgOL3sSFrZlWSviZppqQJZiZJcvfbg3YGAECRG8vp4p9JeklSm6T3w7YDAEB8jCVkK9z9L4J3AgBAzIxldvETZvafzOwcM/vk0J/gnQEAUOTGMpI9Jmm9pP+u9Nd40o+zQjUFAEAcjCVk/1LSp9z9cOhmAACIk7GcLn5T0ruhGwEAIG7GMpLtl7TXzP5R0ntDRb7CAwDARxtLyG5J/wEAABkYy4pPj+ejEQAA4uaUIWtmG919lZm16YNZxUPc3eeFbQ0AgOL2USPZhvTjG5LWnFQ3SfcG6wgAgJg4Zci6+9Dt7D7l7r89+TUzmxO0KwAAYuCjThf/F0nfkDTLzFpPeulMSb8K3RgAAMXuo04XPyXpHyTdI+nOk+pvu/u/BO0KAIAY+KjTxUclHZV0ff7aAQAgPsay4hMAABgHQhYAgEAIWQAAAiFkAQAIhJAFACAQQhYAgEAIWQAAAgkesmZWZmZ7zOynofcFAEAhycdItkGpmwwAAFBSgoasmdVKWi5pQ8j9AABQiEKPZP9W0nckvX+qDczsFjPbZWa7ent7A7cDAED+BAtZM/uSpLfcffdHbefuD7v7QndfOHXq1FDtAACQdyFHspdL+mMzOyDpx5K+YGY/Crg/AAAKSrCQdfe17l7r7jMlXSfpBXf/s1D7AwCg0PA9WQAAAvmom7bnjLv/UtIv87EvAAAKBSNZAAACyctIFgAQD1v2dGn9tnYd6ktoelWl1iydrRULaqJuq2ARsgCAMdmyp0trN7cpkRyUJHX1JbR2c5skEbSnwOliAMCYrN/WfiJghySSg1q/rT2ijgofIQsAGJNDfYmM6iBkAQBjNL2qMqM6CFkAwBitWTpbleVlw2qV5WVas3R2RB0VPiY+AQDGZGhyE7OLx46QBQCM2YoFNYRqBjhdDABAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAAQSLGTN7Fwz+0cze93MXjOzhlD7AgCgEE0I+N7HJf2lu7eY2ZmSdpvZz9399YD7BACgYAQbybp7t7u3pP/7bUlvSKoJtT8AAApNXq7JmtlMSQsk/Tof+wMAoBAED1kzmyzpJ5K+5e7/Nsrrt5jZLjPb1dvbG7odAADyJmjImlm5UgH7pLtvHm0bd3/Y3Re6+8KpU6eGbAcAgLwKObvYJD0i6Q13vz/UfgAAKFQhR7KXS/qPkr5gZnvTf74YcH8AABSUYF/hcff/K8lCvT8AAIWOFZ8AAAiEkAUAZKy5o1lLNi1R3eN1WrJpiZo7mqNuqSCFXPEJABBDzR3NatzZqIHBAUlSd3+3Gnc2SpKWz1oeYWeFh5EsACAjTS1NJwJ2yMDggJpamiLqqHARsgCAjPT092RUL2WELAAgI9WTqjOqlzJCFgCQkYb6BlWUVQyrVZRVqKGeO5qOxMQnAEBGhiY3NbU0qae/R9WTqtVQ38Ckp1EQsgCAjC2ftZxQHQNOFwMAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAIIQsAACBELIAAARCyAIAEAghCwBAINzqDgByaMueLq3f1q5DfQlNr6rUmqWztWJBTdRtISKELADkyJY9XVq7uU2J5KAkqasvobWb2ySJoC1RnC4GgBxZv639RMAOSSQHtX5be0QdIWqELADkyKG+REZ1xB8hCwA5Mr2qMqM64o+QBYAcWbN0tirLy4bVKsvLtGbp7Ig6QtSY+FSCmP0IhDH094i/XxhCyJYYZj8CYa1YUMPfpRxp7mhWU0uTevp7VD2pWg31DVo+a3nUbWWE08UlhtmPAIpBc0ezGnc2qru/Wy5Xd3+3Gnc2qrmjOerWMkLIlhhmPwIoBk0tTRoYHBhWGxgcUFNLU0QdjQ8hW2KY/QigGPT092RUL1SEbIlh9iOAYlA9qTqjeqEiZEvMigU1uufai1VTVSmTVFNVqXuuvZiJGgAKSkN9gyrKKobVKsoq1FDfEFFH48Ps4hLE7EcAhW5oFnGxzy4mZAEABWn5rOVFF6ojcboYAIBACFkAAAIhZAEA8da6UXpgrtRYlXps3Zi3XXNNFgAQX60bpedul5LpBXeOHkw9l6S6VcF3z0gWABBf2+/+IGCHJBOpeh4QsgCA+DramVk9xwhZAEB8TanNrJ5jhCwAIL6uWieVj1ibvbwyVc8DQhYAEF91q6RrHpSmnCvJUo/XPJiXSU8Ss4sBAHFXtypvoTpS0JGsmS0zs3Yze9PM7gy5LwAACk2wkDWzMknfl3S1pM9Iut7MPhNqfwAAFJqQI9lFkt509w53Pybpx5K+HHB/AAAUlJAhWyPp4EnPO9M1AABKQuSzi83sFjPbZWa7ent7o24HAICcCRmyXZLOPel5bbo2jLs/7O4L3X3h1KlTA7YDAEB+hQzZVyR92szON7PTJV0n6dmA+wMAoKAE+56sux83s9skbZNUJumH7v5aqP0BAFBogi5G4e4/k/SzkPsAAKBQRT7xCQCAuDJ3j7qHE8ysV9Jvo+4jps6WdDjqJkoExzp/ONb5w7H+aOe5+4dm7xZUyCIcM9vl7guj7qMUcKzzh2OdPxzr8eF0MQAAgRCyAAAEQsiWjoejbqCEcKzzh2OdPxzrceCaLAAAgTCSBQAgEEI2BsxsmZm1m9mbZnbnKK+fYWb/O/36r81sZrq+2Mx2m1lb+vEL+e692Iz3WJ/0+gwze8fMvp2vnotRNsfZzOrM7EUzey392a7IZ+/FJovfH+Vm9nj6GL9hZmvz3XsxIGSLnJmVSfq+pKslfUbS9Wb2mRGb3SzpX939U5IekPQ/0vXDkq5x94sl3SDpifx0XZyyPNZD7pf0D6F7LWbZHGczmyDpR5JudfeLJP2hpGSeWi86WX6m/1TSGenfH5+V9J9H/qMShGwcLJL0prt3uPsxST+W9OUR23xZ0uPp/94k6SozM3ff4+6H0vXXJFWa2Rl56bo4jftYS5KZrZC0X6ljjVPL5jgvkdTq7q9KkrsfcffBPPVdjLI51i5pUvofNpWSjkn6t/y0XTwI2eJXI+ngSc8707VRt3H345KOSjprxDZ/IqnF3d8L1GccjPtYm9lkSf9V0nfz0Gexy+YzfYEkN7NtZtZiZt/JQ7/FLJtjvUlSv6RuSb+T9Dfu/i+hGy42QW8QgOJgZhcpdQpoSdS9xFijpAfc/Z30wBZhTJD0B5I+J+ldSdvNbLe7b4+2rVhaJGlQ0nRJvyfpn8zsF+7eEW1bhYWRbPHrknTuSc9r07VRt0mf2pki6Uj6ea2kv5f0NXf/f8G7LW7ZHOtLJN1rZgckfUvSf0vfChIfls1x7pS0w90Pu/u7St0FrD54x8Urm2P9HyRtdfeku78l6VeSWHZxBEK2+L0i6dNmdr6ZnS7pOknPjtjmWaUmNknSSkkvuLubWZWkZkl3uvuv8tZx8Rr3sXb3K9x9prvPlPS3kv7a3f9nvhovMuM+zkrdv/piM5uYDoR/L+n1PPVdjLI51r+T9AVJMrNJki6V9Ju8dF1ECNkil75GcptSv1zekLTR3V8zs7vN7I/Tmz2i1HXBNyX9haShafq3SfqUpHVmtjf9Z1qef4SikeWxxhhlc5zd/V+VmsH9iqS9Ss0zaM73z1AssvxMf1/SZDN7Tanj/ai7t+b3Jyh8rPgEAEAgjGQBAAiEkAUAIBBCFgCAQAhZAAACIWQBAAiEkAViwMzeiboHAB9GyAIAEAghC8SIpaw3s33p+3x+NV0/x8x2pBcc2WdmV5hZmZk9dtK2d0TdPxA33CAAiJdrJc2XNE/S2ZJeMbMdSq0zu83dv5e+h+jE9HY17j5XktLLbALIIUayQLz8gaSn3X3Q3f9Z0v9R6o40r0i60cwaJV3s7m9L6pA0y8weMrNl4l6gQM4RskAJcPcdkq5U6o4qj5nZ19Lr/M6T9EtJt0raEF2HQDwRskC8/JOkr6avt05VKlhfNrPzJP2zu/+dUmFab2ZnSzrN3X8i6a/ELeGAnOOaLBAvfy/pMkmvSnJJ33H3HjO7QdIaM0tKekfS1yTVSHrUzIb+sb02ioaBOOMuPAAABMLpYgAAAiFkAQAIhJAFACAQQhYAgEAIWQAAAiFkAQAIhJAFACAQQhYAgED+P3j5MzI0+6xrAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "ts.trialScatter('loss', 'time', 'batchSize', save_plot=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "ts.saveStatistics()\n", - "ts.saveStatistics(False)" - ] - }, - { - "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.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 1af312d3ff092ed57fb58b34bfaf64f6fc3b089a Mon Sep 17 00:00:00 2001 From: Jeremy Leipzig Date: Tue, 28 Jul 2020 11:49:59 -0400 Subject: [PATCH 3/3] not weird names --- src/myhelpers/TrialStatistics.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/myhelpers/TrialStatistics.py b/src/myhelpers/TrialStatistics.py index f3f76f8..d17bf9e 100644 --- a/src/myhelpers/TrialStatistics.py +++ b/src/myhelpers/TrialStatistics.py @@ -20,7 +20,7 @@ # Given a confusion matrix, gets metris of fine with respect to coarse -class fine_Coarse_Statistics: +class fine_statistics: def __init__(self, cm, dataset): self.dataset = dataset self.cm = cm @@ -87,7 +87,7 @@ def get_F1Scores(self, fine_index): } # Given a confusion matrix, get statistics of coarse labels -class Coarse_Statistics: +class coarse_statistics: def __init__(self, cm, dataset): self.dataset = dataset self.cm = cm @@ -292,14 +292,14 @@ def printF1table(self, trial_params, dataset): df = pd.DataFrame(columns=columns) if self.prefix == "coarse": - stats = Coarse_Statistics(cm, dataset) + stats = coarse_statistics(cm, dataset) for coarse_name in dataset.getCoarseList(): coarse_index = dataset.getCoarseList().index(coarse_name) coarse_stats = stats.get_F1Scores(coarse_index) df.loc[coarse_index] = [" ".join([str(coarse_index), coarse_name]), coarse_stats["f1_macro"]] else: - stats = fine_Coarse_Statistics(cm, dataset) + stats = fine_statistics(cm, dataset) for fine in range(len(dataset.getfineList())): fine_stats = stats.get_F1Scores(fine) fine_name = dataset.getfineOfIndex(fine) @@ -324,7 +324,7 @@ def printF1table(self, trial_params, dataset): def trialScatter(self, x, y, aggregatedBy=None, save_plot=False): df = self.df - file_name = 'plot ' + y + " to " + x + ((' by ' + aggregatedBy) if aggregatedBy is not None else '') + file_name = 'plot' + ((' by ' + aggregatedBy) if aggregatedBy is not None else '') # get unique values for aggregate by @@ -333,7 +333,6 @@ def trialScatter(self, x, y, aggregatedBy=None, save_plot=False): uniqueValues=df[aggregatedBy].unique() # prepare axis - plt.tight_layout(rect=[0, 0.03, 1, 0.95]) fig=plt.figure() ax=fig.add_axes([0,0,1,1]) ax.set_xlabel(x)