{ "info": { "author": "Ge Yang", "author_email": "yangge1987@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Science/Research", "Programming Language :: Python :: 3" ], "description": "TF\\_Logger, A Tensorboard Logging Utility for Non-Tensorflow Python Projects\n============================================================================\n\n.. code-block:: bash\n\n pip install tf_logger\n\nUsage\n-----\n\n.. code-block:: python\n\n from tf_logger import TF_Logger\n\n logger = TF_Logger(log_directory=\"/tmp/logs/tf_logger_test/\")\n\n logger.log(index=3, note='this is a log entry!')\n logger.flush()\n\n # Images\n face = scipy.misc.face()\n face_bw = scipy.misc.face(gray=True)\n logger.log_image(index=4, color_image=face, black_white=face_bw)\n image_bw = np.zeros((64, 64, 1))\n image_bw_2 = scipy.misc.face(gray=True)[::4, ::4]\n\n # now print a stack\n for i in range(10):\n logger.log_image(i, animation=[face] * 5)\n\n.. figure:: https://github.com/episodeyang/tf_logger/blob/master/figures/logging_images.png?raw=true\n :alt: logging images using tf\\_logger\n\n logging images using tf\\_logger\n\n I'm planning on writing a better ML dashboard in the future.\n\nThis version of logger is integrated with ``tensorboard`` and at the\nsame time prints the data in a tabular format to your ``stdout``. - can\nsilence ``stdout`` per key (per ``logger.log`` call) - can print with\ncolor: ``logger.log(timestep, some_key=green(some_data))`` - can print\nwith custom formatting:\n``logger.log(timestep, some_key=green(some_data, percent))`` where\n``percent`` - uses the correct ``unix`` table characters (please stop\nusing ``|`` and ``+``. **Use ``\u2502``, ``\u253c`` instead**)\n\nA typical print out of this logger look like the following:\n\n.. code-block:: python\n\n from tf_logger import TF_Logger\n\n logger = TF_Logger(log_directory=f\"/mnt/bucket/deep_Q_learning/{datetime.now(%Y%m%d-%H%M%S.%f):}\")\n\n logger.log_params(G=vars(G), RUN=vars(RUN), Reporting=vars(Reporting))\n\noutputs the following\n\n.. figure:: https://github.com/episodeyang/tf_logger/blob/master/figures/example_log_output.png?raw=true\n :alt: example\\_real\\_log\\_output\n\n example\\_real\\_log\\_output\n\nAnd the data from multiple experiments can be views with tensorboard.\n\n.. figure:: https://github.com/episodeyang/tf_logger/blob/master/figures/tensorboard_example.png?raw=true\n :alt: tensorboard\\_example\n\n tensorboard\\_example\n\n.. code-block:: text\n\n \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n G \n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n env_name \u2502 MountainCar-v0 \n seed \u2502 None \n stochastic_action \u2502 True \n conv_params \u2502 None \n value_params \u2502 (64,) \n use_layer_norm \u2502 True \n buffer_size \u2502 50000 \n replay_batch_size \u2502 32 \n prioritized_replay \u2502 True \n alpha \u2502 0.6 \n beta_start \u2502 0.4 \n beta_end \u2502 1.0 \n prioritized_replay_eps \u2502 1e-06 \n grad_norm_clipping \u2502 10 \n double_q \u2502 True \n use_dueling \u2502 False \n exploration_fraction \u2502 0.1 \n final_eps \u2502 0.1 \n n_timesteps \u2502 100000 \n learning_rate \u2502 0.001 \n gamma \u2502 1.0 \n learning_start \u2502 1000 \n learn_interval \u2502 1 \n target_network_update_interval \u2502 500 \n \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n RUN \n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n log_directory \u2502 /mnt/slab/krypton/machine_learning/ge_dqn/2017-11-20/162048.353909-MountainCar-v0-prioritized_replay(True)\n checkpoint \u2502 checkpoint.cp \n log_file \u2502 output.log \n \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n Reporting \n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n checkpoint_interval \u2502 10000 \n reward_average \u2502 100 \n print_interval \u2502 10 \n \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n \u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n \u2502 timestep \u2502 1999 \u2502\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n \u2502 episode \u2502 10 \u2502\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n \u2502 total reward \u2502 -200.0 \u2502\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n \u2502 total reward/mean \u2502 -200.0 \u2502\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n \u2502 total reward/max \u2502 -200.0 \u2502\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n \u2502time spent exploring\u2502 82.0% \u2502\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n \u2502 replay beta \u2502 0.41 \u2502\n \u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\n\n.. code-block:: python\n\n from tf_logger import TF_Logger\n\n logger = TF_Logger('/mnt/slab/krypton/unitest')\n logger.log(0, some=Color(0.1, 'yellow'))\n logger.log(1, some=Color(0.28571, 'yellow', lambda v: f\"{v * 100:.5f}%\"))\n logger.log(2, some=Color(0.85, 'yellow', percent))\n logger.log(3, {\"some_var/smooth\": 10}, some=Color(0.85, 'yellow', percent))\n logger.log(4, some=Color(10, 'yellow'))\n logger.log_histogram(4, td_error_weights=[0, 1, 2, 3, 4, 2, 3, 4, 5])\n\ncolored output: (where the values are yellow)\n\n.. code-block:: text\n\n \u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n \u2502 some \u2502 0.1 \u2502\n \u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\n \u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n \u2502 some \u2502 28.57100% \u2502\n \u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\n \u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n \u2502 some \u2502 85.0% \u2502\n \u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\n \u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n \u2502 some var/smooth \u2502 10 \u2502\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n \u2502 some \u2502 85.0% \u2502\n \u2558\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\n\n.. figure:: https://github.com/episodeyang/tf_logger/blob/master/figures/logger_color_output.png?raw=true\n :alt: logger-colored-output\n\n logger-colored-output\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/episodeyang/tf_logger", "keywords": "tf_logger,tensorflow,logging,debug,debugging", "license": "", "maintainer": "", "maintainer_email": "", "name": "tf-logger", "package_url": "https://pypi.org/project/tf-logger/", "platform": "", "project_url": "https://pypi.org/project/tf-logger/", "project_urls": { "Homepage": "https://github.com/episodeyang/tf_logger" }, "release_url": "https://pypi.org/project/tf-logger/1.1.1/", "requires_dist": [ "typing", "tensorflow", "numpy", "termcolor", "pprint" ], "requires_python": "", "summary": "A print and debugging utility that makes your error printouts look nice", "version": "1.1.1" }, "last_serial": 3751068, "releases": { "0.0.0": [ { "comment_text": "", "digests": { "md5": "31ff89f2030b72787793487645c1d800", "sha256": "64a45d9dc1ba296fe7b8f9e923621990964b250641448c1dc25fabf5a3f0955a" }, "downloads": -1, "filename": "tf_logger-0.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "31ff89f2030b72787793487645c1d800", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5768, "upload_time": "2017-12-14T19:31:31", "url": "https://files.pythonhosted.org/packages/09/46/97c8f83c1387a99d003c876fa7b8a519c2fe72b31cfd709dd55ffaa91529/tf_logger-0.0.0-py3-none-any.whl" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "b63f88533f1378e121644c8be613e782", "sha256": "627fab0a0fa833d93047ad9609aa5c941e069424c6c8928eebd9b4360d9de65b" }, "downloads": -1, "filename": "tf_logger-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b63f88533f1378e121644c8be613e782", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8834, "upload_time": "2017-12-14T19:55:06", "url": "https://files.pythonhosted.org/packages/d0/bb/cf44bdb5c134c8cb0a4f76a5d8c6cd1fcd6c541f83515442ddca16fb9373/tf_logger-1.0.0-py3-none-any.whl" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "3fbdf9d6cdd2b8780c4ff25371caf018", "sha256": "e75010ca41a2cf46be7c3296c69a8331d40c0effbbf124bebce8f21e1f40cb73" }, "downloads": -1, "filename": "tf_logger-1.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "3fbdf9d6cdd2b8780c4ff25371caf018", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8690, "upload_time": "2018-03-17T07:46:17", "url": "https://files.pythonhosted.org/packages/ae/c1/ccc0cdbd12972a8611eae21f380a047ae2d52472a0172b6c4d57f20cace1/tf_logger-1.0.1-py3-none-any.whl" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "74a82b82127a5bb023d9819fb55fc54e", "sha256": "a9725d8cffa9457d419ae7fcdd8f8040e9d5adbe7693f200a0fb9747314f890f" }, "downloads": -1, "filename": "tf_logger-1.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "74a82b82127a5bb023d9819fb55fc54e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8723, "upload_time": "2018-03-23T19:29:00", "url": "https://files.pythonhosted.org/packages/ca/b9/1e62e38742bdf35ec270695c9dec4652a99e6012af487cdf2bf4c2d8f2b0/tf_logger-1.0.2-py3-none-any.whl" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "d7e047d8583d574e6729f64e50c24e59", "sha256": "29bad99591ac37fc4b2da9de59cc52fe3d37430cd234a295e70e2eb87e23c6fd" }, "downloads": -1, "filename": "tf_logger-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d7e047d8583d574e6729f64e50c24e59", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9319, "upload_time": "2018-04-10T00:43:12", "url": "https://files.pythonhosted.org/packages/e6/99/abe4c1c31ade7492bbf90c0e5cd8c1706263ba6191e389dbca85b7de58f3/tf_logger-1.1.0-py3-none-any.whl" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "e74e69749e47dccfd53ba0f14d128230", "sha256": "0089c0747834372e6d0e0c2ce714e2bae4b84e7733de55e6a4a33031f3d519e0" }, "downloads": -1, "filename": "tf_logger-1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "e74e69749e47dccfd53ba0f14d128230", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6984, "upload_time": "2018-04-10T07:46:01", "url": "https://files.pythonhosted.org/packages/3c/cf/be052d8c193423df7a961e6fae3206e9ed9f1439b6a69177932ce65b0ddd/tf_logger-1.1.1-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e74e69749e47dccfd53ba0f14d128230", "sha256": "0089c0747834372e6d0e0c2ce714e2bae4b84e7733de55e6a4a33031f3d519e0" }, "downloads": -1, "filename": "tf_logger-1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "e74e69749e47dccfd53ba0f14d128230", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6984, "upload_time": "2018-04-10T07:46:01", "url": "https://files.pythonhosted.org/packages/3c/cf/be052d8c193423df7a961e6fae3206e9ed9f1439b6a69177932ce65b0ddd/tf_logger-1.1.1-py3-none-any.whl" } ] }