ChainerRL is a deep reinforcement learning library built on top of Chainer.

ChainerRL

Build Status Coverage Status Documentation Status PyPI

ChainerRL is a deep reinforcement learning library that implements various state-of-the-art deep reinforcement algorithms in Python using Chainer, a flexible deep learning framework.

Breakout Humanoid Grasping Atlas

Installation

ChainerRL is tested with 3.6. For other requirements, see requirements.txt.

ChainerRL can be installed via PyPI:

pip install chainerrl

It can also be installed from the source code:

python setup.py install

Refer to Installation for more information on installation.

Getting started

You can try ChainerRL Quickstart Guide first, or check the examples ready for Atari 2600 and Open AI Gym.

For more information, you can refer to ChainerRL's documentation.

Algorithms

Algorithm Discrete Action Continous Action Recurrent Model Batch Training CPU Async Training
DQN (including DoubleDQN etc.) ✓ (NAF) x
Categorical DQN x x
Rainbow x x
IQN x x
DDPG x x
A3C ✓ (A2C)
ACER x
NSQ (N-step Q-learning) ✓ (NAF) x
PCL (Path Consistency Learning) x
PPO x
TRPO x
TD3 x x x
SAC x x x

Following algorithms have been implemented in ChainerRL:

Following useful techniques have been also implemented in ChainerRL:

Visualization

ChainerRL has a set of accompanying visualization tools in order to aid developers' ability to understand and debug their RL agents. With this visualization tool, the behavior of ChainerRL agents can be easily inspected from a browser UI.

Environments

Environments that support the subset of OpenAI Gym's interface (reset and step methods) can be used.

Contributing

Any kind of contribution to ChainerRL would be highly appreciated! If you are interested in contributing to ChainerRL, please read CONTRIBUTING.md.

License

MIT License.

Citations

To cite ChainerRL in publications:

@InProceedings{fujita2019chainerrl,
  author = {Fujita, Yasuhiro and Kataoka, Toshiki and Nagarajan, Prabhat and Ishikawa, Takahiro},
  title = {ChainerRL: A Deep Reinforcement Learning Library},
  booktitle = {Workshop on Deep Reinforcement Learning at the 33rd Conference on Neural Information Processing Systems},
  location = {Vancouver, Canada},
  month = {December},
  year = {2019}
}
Comments
  • Fix CI errors due to pyglet, zipp, mock, and gym

    Fix CI errors due to pyglet, zipp, mock, and gym

    • Use newer gym because old gym does not work with pyglet>=1.4.
    • Modify some example scripts that are not compatible with newer gym.
    • Use zipp==1.0.0 in flexCI because new zipp does not work with Python 3.5.
    • Remove mock from dependency as we do not support py2 now.
  • Rainbow Scores

    Rainbow Scores

    The previous Rainbow scores were generated with an incorrect hyperparameter. This PR aims to rectify that. We reran Rainbow using the correct hyperparameters, and have the new results here.

    This resolves issue #466

  • Recurrent and batched TRPO

    Recurrent and batched TRPO

    ~Merge #431 before this PR.~

    • Precompute action distributions for importance weighting and KL divergence as #430 did
    • Support recurrent models as #431 did
    • Support batch training
  • Fix weight normalization inside prioritized experience replay

    Fix weight normalization inside prioritized experience replay

    This PR fixes the wrong computation of min_probability in PrioritizedReplayBuffer when normalize_by_max == 'batch', which is the default behavior. The previous behavior was unexpectedly the same as normalize_by_max == 'memory'.

  • Drop python2 support

    Drop python2 support

    ~Resolves #463~ Resolves #392 Resolves #467

    • Travis CI with python 2 is stopped
    • future is removed from dependencies
    • import from __future__ is removed
    • hacks for python 2 are removed (#392)
    • switched from ppa:jonathanf to ppa:cran for installing ffmpeg since the former is no longer available
    • remove use of six
    • remove fastcache, funcsigs, statistics as dependencies
  • Implicit quantile networks (IQN)

    Implicit quantile networks (IQN)

    Please merge ~#350~ ~#356~ first.

    This PR resolves #282

    For its scores, see recent comments below. For some games it achieves same-level scores as the paper's. For some other games, it still underperforms the paper, but I don't know why.

    • [x] Add tests for QantileDiscreteActionValue
    • [x] Add tests for quantile huber loss
    • [x] Try i=1,...,n (from Appendix) instead of i=0,...,n-1 (from eq. 4) (the former is correct, confirmed by Georg Ostrovski)
  • guide on how to use LSTM version of DDPG on gym environments

    guide on how to use LSTM version of DDPG on gym environments

    I am trying to run DDPG with the gym Pendulum-v0 environment. However I am getting this error:

    TypeError: The batch size of x must be equal to or less thanthe size of the previous state h.

    This is my code:

    env = gym.make('Pendulum-v0')
    obs_size = env.observation_space.shape[0]
    n_actions = env.action_space.shape[0]
    
    q_func = q_func_.FCLSTMSAQFunction(obs_size, n_actions, n_hidden_channels=50, n_hidden_layers=2)
    pi = policy.FCLSTMDeterministicPolicy(n_input_channels=obs_size, n_hidden_channels=50, n_hidden_layers=2, 
                                          action_size=n_actions, 
                                          min_action=env.action_space.low, 
                                          max_action=env.action_space.high, 
                                          bound_action=True
                                         )
    model = DDPGModel(policy=pi, q_func=q_func)
    opt_a = optimizers.Adam(alpha=1e-4)
    opt_c = optimizers.Adam(alpha=1e-3)
    opt_a.setup(model['policy'])
    opt_c.setup(model['q_function'])
    opt_a.add_hook(chainer.optimizer.GradientClipping(1.0), 'hook_a')
    opt_c.add_hook(chainer.optimizer.GradientClipping(1.0), 'hook_c')
    
    ou_sigma = (env.action_space.high - env.action_space.low) * 0.2
    explorer = explorers.AdditiveOU(sigma=ou_sigma)
    
    replay_buffer = chainerrl.replay_buffer.ReplayBuffer(capacity=5 * 10 ** 5)
    
    phi = lambda x: x.astype(np.float32, copy=False)
    
    agent = DDPG(model, opt_a, opt_c, replay_buffer, gamma=0.995, explorer=explorer, 
                 replay_start_size=5000, target_update_method='soft', 
                 target_update_interval=1, update_interval=1,
                 soft_update_tau=1e-2, n_times_update=1, 
                 gpu=0, minibatch_size=200, phi=phi)
    
    n_episodes = 200
    max_episode_len = 200
    for i in range(1, n_episodes + 1):
        obs = env.reset()
        reward = 0
        done = False
        R = 0  # return (sum of rewards)
        t = 0  # time step
        while not done and t < max_episode_len:
            # Uncomment to watch the behaviour
    #         env.render()
            action = agent.act_and_train(obs, reward)
            obs, reward, done, _ = env.step(action)
            R += reward
            t += 1
        if i % 10 == 0:
            print('episode:', i,
                  '\nR:', R,
                  '\nstatistics:', agent.get_statistics())
        agent.stop_episode_and_train(obs, reward, done)
    print('Finished.')
    

    Here is the full initial running and error:

    episode: 10 R: -1069.3354146961874 statistics: [('average_q', -0.1465160510604003), ('average_actor_loss', 0.0), ('average_critic_loss', 0.0)] episode: 20 R: -1583.6140918088897 statistics: [('average_q', -0.16802258113631832), ('average_actor_loss', 0.0), ('average_critic_loss', 0.0)]

    TypeError Traceback (most recent call last) in 10 # Uncomment to watch the behaviour 11 # env.render() ---> 12 action = agent.act_and_train(obs, reward) 13 obs, reward, done, _ = env.step(action) 14 R += reward

    ~\AppData\Local\Continuum\anaconda3\envs\chainer\lib\site-packages\chainerrl\agents\ddpg.py in act_and_train(self, obs, reward) 335 self.last_action = action 336 --> 337 self.replay_updater.update_if_necessary(self.t) 338 339 return self.last_action

    ~\AppData\Local\Continuum\anaconda3\envs\chainer\lib\site-packages\chainerrl\replay_buffer.py in update_if_necessary(self, iteration) 543 else: 544 transitions = self.replay_buffer.sample(self.batchsize) --> 545 self.update_func(transitions)

    ~\AppData\Local\Continuum\anaconda3\envs\chainer\lib\site-packages\chainerrl\agents\ddpg.py in update(self, experiences, errors_out) 263 264 batch = batch_experiences(experiences, self.xp, self.phi, self.gamma) --> 265 self.critic_optimizer.update(lambda: self.compute_critic_loss(batch)) 266 self.actor_optimizer.update(lambda: self.compute_actor_loss(batch)) 267

    ~\AppData\Local\Continuum\anaconda3\envs\chainer\lib\site-packages\chainer\optimizer.py in update(self, lossfun, *args, **kwds) 862 if lossfun is not None: 863 use_cleargrads = getattr(self, '_use_cleargrads', True) --> 864 loss = lossfun(*args, **kwds) 865 if use_cleargrads: 866 self.target.cleargrads()

    ~\AppData\Local\Continuum\anaconda3\envs\chainer\lib\site-packages\chainerrl\agents\ddpg.py in () 263 264 batch = batch_experiences(experiences, self.xp, self.phi, self.gamma) --> 265 self.critic_optimizer.update(lambda: self.compute_critic_loss(batch)) 266 self.actor_optimizer.update(lambda: self.compute_actor_loss(batch)) 267

    ~\AppData\Local\Continuum\anaconda3\envs\chainer\lib\site-packages\chainerrl\agents\ddpg.py in compute_critic_loss(self, batch) 208 # Estimated Q-function observes s_t and a_t 209 predict_q = F.reshape( --> 210 self.q_function(batch_state, batch_actions), 211 (batchsize,)) 212

    ~\AppData\Local\Continuum\anaconda3\envs\chainer\lib\site-packages\chainerrl\q_functions\state_action_q_functions.py in call(self, x, a) 105 h = F.concat((x, a), axis=1) 106 h = self.nonlinearity(self.fc(h)) --> 107 h = self.lstm(h) 108 return self.out(h) 109

    ~\AppData\Local\Continuum\anaconda3\envs\chainer\lib\site-packages\chainer\link.py in call(self, *args, **kwargs) 292 # forward is implemented in the child classes 293 forward = self.forward # type: ignore --> 294 out = forward(*args, **kwargs) 295 296 # Call forward_postprocess hook

    ~\AppData\Local\Continuum\anaconda3\envs\chainer\lib\site-packages\chainer\links\connection\lstm.py in forward(self, x) 296 msg = ('The batch size of x must be equal to or less than' 297 'the size of the previous state h.') --> 298 raise TypeError(msg) 299 elif h_size > batch: 300 h_update, h_rest = split_axis.split_axis(

    TypeError: The batch size of x must be equal to or less thanthe size of the previous state h.

  • Prioritized Double IQN

    Prioritized Double IQN

    We should first merge Double IQN.

    Here is a comparison against Double IQN

    | Game | DoubleIQN | Prioritized Double IQN | | ------------- |:-------------:|:-------------:| | Asterix | 507353.8| 738166.66| | Bowling | 80.33| 72.72| | Hero | 28564.58| 35293.26| | MontezumaRevenge| 5.55| 3.79| | Qbert | 29531.1| 25763.95| | Seaquest | 30870.0| 31905.0| | Venture | 719.51|1369.84 | | VideoPinball| 731942.25|717376.0|

    Prioritized IQN wins on 5/7 domains and loses on 2/7!

  • Replicate Prioritized Experience Replay's reported performance improvements

    Replicate Prioritized Experience Replay's reported performance improvements

    Missing details

    • "all weights w_i were scaled so that max_i w_i = 1". Is max_i w_i computed over a minibatch or the whole buffer?
    • What is the value of epsilon that is added to absolute TD errors?
  • show error message

    show error message

    When we construct QFunction, and model parameter is not initialized (it happens when some Link is instantiated with in_size=None), copy_param will fail because the target_link's param is None.

    This PR is to show user-friendly error message to let the user know what is the cause of this error.

    I'd like to get comment that what kind of message is better.

    I'm not sure the performance degrade by checking this type error.

  • A2C

    A2C

    Add A2C proposed by following thesis. https://arxiv.org/abs/1708.05144 https://blog.openai.com/baselines-acktr-a2c/ A2C is a synchronous, deterministic variant of Asynchronous Advantage Actor Critic (A3C).

  • Create a copy of agent in evaluation for  chainerrl/experiements/train_agent_async.py

    Create a copy of agent in evaluation for chainerrl/experiements/train_agent_async.py

    I am a user of channerl, and my code break if I use the same agent to evaluate (note that in train&evaluation, env could be different), so I request to change to copy an agent

  • Regarding the output of DQN

    Regarding the output of DQN

    I would like to use DQN to control the field degree of freedom robot arm. However, the DQN in this library has only one output if the action space is discrete. In the case of multiple degrees of freedom, do we have to use a neural network for each joint?

  • Can I get the distortion data in MujoCo?

    Can I get the distortion data in MujoCo?

    I am doing research on reinforcement learning using MujoCo. I am doing reinforcement learning on my own robot arm, and I want the data on the distortion of the link of the robot arm. Does anyone know how to take strain data?

  • Question about quantile huber loss function in IQN

    Question about quantile huber loss function in IQN

    Hello, I have one question. In the paper of IQN, quantile huber loss function is delta_{ij} < 0.

    Screen Shot 2020-01-28 at 18 34 45

    But chainerrl iqn code is delta_{ij} > 0. I think this inequlity sign is not correct.

    I’m sorry for poor English.

  • Segmentation fault in Docker after importing chainerrl

    Segmentation fault in Docker after importing chainerrl

    I've encountered segmentation fault error when using chainerrl with GPU in Docker. The error occurs if I import chainerrl first, then perform a cuda.get_device(args).use(). The quick fix my colleague and I found is to do cuda.get_device(args).use()first, then import chainerrl. Both scenarios are shown below.

    [email protected]:/home# python3
    Python 3.7.6 (default, Dec 19 2019, 23:50:13) 
    [GCC 7.4.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from chainer import cuda
    >>> import chainerrl
    >>> cuda.get_device(1).use()
    Segmentation fault (core dumped)
    
    [email protected]:/home# python3
    Python 3.7.6 (default, Dec 19 2019, 23:50:13) 
    [GCC 7.4.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from chainer import cuda
    >>> cuda.get_device(1).use()
    >>> import chainerrl
    >>> 
    

    Dockerfile

    FROM nvidia/cuda:10.1-cudnn7-devel-ubuntu18.04
    RUN apt-get update
    
    RUN apt-get install -y wget git build-essential cmake libxerces-c-dev libfox-1.6-dev libgdal-dev libproj-dev libgl2ps-dev swig && rm -rf /var/lib/apt/lists/*
    
    RUN apt update \
    	&& apt install software-properties-common -y \
    	&& add-apt-repository ppa:deadsnakes/ppa -y \
    	&& apt-get update \
    	&& apt install python3.7 -y \
    	&& update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1 \
    	&& update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2
    
    RUN apt-get install python3.7-dev python3-pip python3-wheel python3-setuptools -y
    
    RUN git clone https://github.com/chainer/chainerrl.git \
    	&& cd chainerrl \
    	&& python3 setup.py install
    
    RUN pip3 install cupy-cuda101
    

    My current computer configurations:

    [email protected]:/home# nvidia-smi
    Thu Jan 16 21:07:09 2020       
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 440.33.01    Driver Version: 440.33.01    CUDA Version: 10.2     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===============================+======================+======================|
    |   0  TITAN RTX           On   | 00000000:3B:00.0 Off |                  N/A |
    | 63%   81C    P2   246W / 280W |   5777MiB / 24220MiB |     99%      Default |
    +-------------------------------+----------------------+----------------------+
    |   1  TITAN RTX           On   | 00000000:AF:00.0  On |                  N/A |
    | 41%   59C    P8    30W / 280W |   1422MiB / 24217MiB |      9%      Default |
    +-------------------------------+----------------------+----------------------+
                                                                                   
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    +-----------------------------------------------------------------------------+
    [email protected]:/home# nvcc -V
    nvcc: NVIDIA (R) Cuda compiler driver
    Copyright (c) 2005-2019 NVIDIA Corporation
    Built on Sun_Jul_28_19:07:16_PDT_2019
    Cuda compilation tools, release 10.1, V10.1.243
    [email protected]:/home/DRL_Traffic_Corridor#
    
    [email protected]:/home# lscpu
    Architecture:        x86_64
    CPU op-mode(s):      32-bit, 64-bit
    Byte Order:          Little Endian
    CPU(s):              32
    On-line CPU(s) list: 0-31
    Thread(s) per core:  2
    Core(s) per socket:  8
    Socket(s):           2
    NUMA node(s):        2
    Vendor ID:           GenuineIntel
    CPU family:          6
    Model:               85
    Model name:          Intel(R) Xeon(R) Silver 4110 CPU @ 2.10GHz
    Stepping:            4
    CPU MHz:             800.012
    CPU max MHz:         3000.0000
    CPU min MHz:         800.0000
    BogoMIPS:            4200.00
    Virtualization:      VT-x
    L1d cache:           32K
    L1i cache:           32K
    L2 cache:            1024K
    L3 cache:            11264K
    NUMA node0 CPU(s):   0-7,16-23
    NUMA node1 CPU(s):   8-15,24-31
    Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti ssbd mba ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts pku ospke md_clear flush_l1d
    
    [email protected]:/home# uname -a
    Linux 9d606b33d95a 5.0.0-37-generic #40~18.04.1-Ubuntu SMP Thu Nov 14 12:06:39 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
    

    This is the furthest we could debug this issue. This was initially quite an issue until we found out about the import fix. We are just curious why does importing chainerrl throws a segmentation fault.

Reinforcement Learning Coach by Intel AI Lab enables easy experimentation with state of the art Reinforcement Learning algorithms
Reinforcement Learning Coach by Intel AI Lab enables easy experimentation with state of the art Reinforcement Learning algorithms

Coach Coach is a python reinforcement learning framework containing implementation of many state-of-the-art algorithms. It exposes a set of easy-to-us

Sep 20, 2022
Deep Reinforcement Learning for Keras.
Deep Reinforcement Learning for Keras.

Deep Reinforcement Learning for Keras What is it? keras-rl implements some state-of-the art deep reinforcement learning algorithms in Python and seaml

Sep 26, 2022
TF-Agents: A reliable, scalable and easy to use TensorFlow library for Contextual Bandits and Reinforcement Learning.

TF-Agents: A reliable, scalable and easy to use TensorFlow library for Contextual Bandits and Reinforcement Learning. TF-Agents makes implementing, de

Sep 21, 2022
Tensorforce: a TensorFlow library for applied reinforcement learning

Tensorforce: a TensorFlow library for applied reinforcement learning Introduction Tensorforce is an open-source deep reinforcement learning framework,

Sep 23, 2022
A toolkit for developing and comparing reinforcement learning algorithms.

Status: Maintenance (expect bug fixes and minor updates) OpenAI Gym OpenAI Gym is a toolkit for developing and comparing reinforcement learning algori

Sep 26, 2022
Doom-based AI Research Platform for Reinforcement Learning from Raw Visual Information. :godmode:

ViZDoom ViZDoom allows developing AI bots that play Doom using only the visual information (the screen buffer). It is primarily intended for research

Sep 24, 2022
A toolkit for reproducible reinforcement learning research.
A toolkit for reproducible reinforcement learning research.

garage garage is a toolkit for developing and evaluating reinforcement learning algorithms, and an accompanying library of state-of-the-art implementa

Sep 20, 2022
An open source robotics benchmark for meta- and multi-task reinforcement learning

Meta-World Meta-World is an open-source simulated benchmark for meta-reinforcement learning and multi-task learning consisting of 50 distinct robotic

Sep 20, 2022
OpenAI Baselines: high-quality implementations of reinforcement learning algorithms
OpenAI Baselines: high-quality implementations of reinforcement learning algorithms

Status: Maintenance (expect bug fixes and minor updates) Baselines OpenAI Baselines is a set of high-quality implementations of reinforcement learning

Sep 20, 2022
A fork of OpenAI Baselines, implementations of reinforcement learning algorithms

Stable Baselines Stable Baselines is a set of improved implementations of reinforcement learning algorithms based on OpenAI Baselines. You can read a

Sep 23, 2022
A platform for Reasoning systems (Reinforcement Learning, Contextual Bandits, etc.)
A platform for Reasoning systems (Reinforcement Learning, Contextual Bandits, etc.)

Applied Reinforcement Learning @ Facebook Overview ReAgent is an open source end-to-end platform for applied reinforcement learning (RL) developed and

Sep 27, 2022
TensorFlow Reinforcement Learning

TRFL TRFL (pronounced "truffle") is a library built on top of TensorFlow that exposes several useful building blocks for implementing Reinforcement Le

Sep 23, 2022
Dopamine is a research framework for fast prototyping of reinforcement learning algorithms.

Dopamine Dopamine is a research framework for fast prototyping of reinforcement learning algorithms. It aims to fill the need for a small, easily grok

Sep 19, 2022
Open world survival environment for reinforcement learning
Open world survival environment for reinforcement learning

Crafter Open world survival environment for reinforcement learning. Highlights Crafter is a procedurally generated 2D world, where the agent finds foo

Sep 13, 2022
Rethinking the Importance of Implementation Tricks in Multi-Agent Reinforcement Learning
Rethinking the Importance of Implementation Tricks in Multi-Agent Reinforcement Learning

MARL Tricks Our codes for RIIT: Rethinking the Importance of Implementation Tricks in Multi-AgentReinforcement Learning. We implemented and standardiz

Sep 21, 2022
Paddle-RLBooks is a reinforcement learning code study guide based on pure PaddlePaddle.
Paddle-RLBooks is a reinforcement learning code study guide based on pure PaddlePaddle.

Paddle-RLBooks Welcome to Paddle-RLBooks which is a reinforcement learning code study guide based on pure PaddlePaddle. 欢迎来到Paddle-RLBooks,该仓库主要是针对强化学

Sep 10, 2022
Deep reinforcement learning library built on top of Neural Network Libraries

Deep Reinforcement Learning Library built on top of Neural Network Libraries NNablaRL is a deep reinforcement learning library built on top of Neural

Sep 5, 2022
Modular Deep Reinforcement Learning framework in PyTorch. Companion library of the book "Foundations of Deep Reinforcement Learning".
Modular Deep Reinforcement Learning framework in PyTorch. Companion library of the book

SLM Lab Modular Deep Reinforcement Learning framework in PyTorch. Documentation: https://slm-lab.gitbook.io/slm-lab/ BeamRider Breakout KungFuMaster M

Sep 24, 2022
tensorboard for pytorch (and chainer, mxnet, numpy, ...)
tensorboard for pytorch (and chainer, mxnet, numpy, ...)

tensorboardX Write TensorBoard events with simple function call. The current release (v2.1) is tested on anaconda3, with PyTorch 1.5.1 / torchvision 0

Sep 21, 2022