{"action":"created","comment":{"url":"https://api.github.com/repos/pfnet/chainer/pulls/comments/69863546","id":69863546,"diff_hunk":"@@ -0,0 +1,366 @@\n+import six\n+\n+from chainer.dataset import convert\n+from chainer.dataset import iterator as iterator_module\n+from chainer import optimizer as optimizer_module\n+from chainer import variable\n+\n+\n+class Updater(object):\n+\n+    \"\"\"Interface of updater objects for trainers.\n+\n+    TODO(beam2d): document it.\n+\n+    \"\"\"\n+    def connect_trainer(self, trainer):\n+        \"\"\"Connects the updater to the trainer that will call it.\n+\n+        The typical usage of this method is to register additional links to the\n+        reporter of the trainer. This method is called at the end of the\n+        initialization of :class:`~chainer.training.Trainer`. The default\n+        implementation does nothing.\n+\n+        Args:\n+            trainer (~chainer.training.Trainer): Trainer object to which the\n+                updater is registered.\n+\n+        \"\"\"\n+        pass\n+\n+    def finalize(self):\n+        \"\"\"Finalizes the updater object.\n+\n+        This method is called at the end of training loops. It should finalize\n+        each dataset iterator used in this updater.\n+\n+        \"\"\"\n+        raise NotImplementedError\n+\n+    def get_optimizer(self, name):\n+        \"\"\"Gets the optimizer of given name.\n+\n+        Updater holds one or more optimizers with names. They can be retrieved\n+        by this method.\n+\n+        Args:\n+            name (str): Name of the optimizer.\n+\n+        Returns:\n+            ~chainer.Optimizer: Optimizer of the name.\n+\n+        \"\"\"\n+        raise NotImplementedError\n+\n+    def get_all_optimizers(self):\n+        \"\"\"Gets a dictionary of all optimizers for this updater.\n+\n+        Returns:\n+            dict: Dictionary that maps names to optimizers.\n+\n+        \"\"\"\n+        raise NotImplementedError\n+\n+    def update(self):\n+        \"\"\"Updates the parameters of the target model.\n+\n+        This method implements an update formula for the training task,\n+        including data loading, forward/backward computations, and actual\n+        updates of parameters.\n+\n+        This method is called once at each iteration of the training loop.\n+\n+        \"\"\"\n+        raise NotImplementedError\n+\n+    def serialize(self, serializer):\n+        \"\"\"Serializes the current state of the updater object.\"\"\"\n+        raise NotImplementedError\n+\n+\n+class StandardUpdater(Updater):\n+\n+    \"\"\"Standard implementation of Updater.\n+\n+    This is the standard implementation of :class:`Updater`. It accepts one or\n+    more training datasets and one or more optimizers. The default update\n+    routine assumes that there is only one training dataset and one optimizer,\n+    while users can specify their own update routines. Each batch is converted\n+    to input arrays by :func:`~chainer.datasets.concat_examples` by default,\n+    which can also be manually set.\n+\n+    There are two ways to modify the update behavior besides setting a custom\n+    loss function. One is by setting a custom update function via the\n+    ``update_func`` argument. The other one is by inheriting this class and\n+    overriding the :meth:`update` method. In latter case, do not forget to\n+    update the iteration counter at each call of this method, because this\n+    value is watched by the trainer for deciding when to invoke extensions and\n+    when to exit the training loop.\n+\n+    Args:\n+        iterator: Dataset iterator for the training dataset. It can also be a\n+            dictionary of iterators. If this is just an iterator, then the\n+            iterator is registered by the name ``'main'``.\n+        optimizer: Optimizer to update parameters. It can also be a dictionary\n+            of optimizers. If this is just an optimizer, then the optimizer is\n+            registered by the name ``'main'``.\n+        update_func: Update routine. This is a function that takes the updater\n+            object as the argument. The default routine uses ``converter`` and\n+            ``loss_func`` if specified.\n+        converter: Converter function to build input arrays. Each batch\n+            extracted by the main iterator and the ``device`` option are passed\n+            to this function. If it is omitted,\n+            :func:`~chainer.dataset.concat_examples` is used. If\n+            ``update_func`` is specified, this argument is ignored and not\n+            used.\n+        device: Device to which the training data is sent. Negative value\n+            indicates the host memory (CPU). If ``update_func`` is specified,\n+            this argument is ignored and not used.\n+        loss_func: Loss function. The target link of the main optimizer is used\n+            by default. If ``update_func`` is specified, this argument is\n+            ignored and not used.\n+\n+    Attributes:\n+        iteration: Current number of completed updates.\n+\n+    \"\"\"\n+    def __init__(self, iterator, optimizer, update_func=None, converter=None,\n+                 device=None, loss_func=None):\n+        if isinstance(iterator, iterator_module.Iterator):\n+            iterator = {'main': iterator}\n+        self._iterators = iterator\n+\n+        if isinstance(optimizer, optimizer_module.Optimizer):\n+            optimizer = {'main': optimizer}\n+        self._optimizers = optimizer\n+\n+        self._update_func = update_func or _default_update(\n+            self, converter, device, loss_func)\n+\n+        self.iteration = 0\n+\n+    @property\n+    def epoch(self):\n+        return self._iterators['main'].epoch\n+\n+    @property\n+    def epoch_detail(self):\n+        return self._iterators['main'].epoch_detail\n+\n+    @property\n+    def is_new_epoch(self):\n+        return self._iterators['main'].is_new_epoch\n+\n+    def finalize(self):\n+        for iterator in six.itervalues(self._iterators):\n+            iterator.finalize()\n+\n+    def get_optimizer(self, name):\n+        return self._optimizers[name]\n+\n+    def get_all_optimizers(self):\n+        return dict(self._optimizers)\n+\n+    def get_iterator(self, name):\n+        \"\"\"Gets the dataset iterator of given name.\n+\n+        Args:\n+            name (str): Name of the dataset iterator.\n+\n+        Returns:\n+            ~chainer.dataset.Iterator: Corresponding dataset iterator.\n+\n+        \"\"\"\n+        return self._iterators[name]\n+\n+    def update(self):\n+        self._update_func(self)\n+        self.iteration += 1\n+\n+    def serialize(self, serializer):\n+        for name, iterator in six.iteritems(self._iterators):\n+            iterator.serialize(serializer['iterator:' + name])\n+\n+        for name, optimizer in six.iteritems(self._optimizers):\n+            optimizer.serialize(serializer['optimizer:' + name])\n+            optimizer.target.serialize(serializer['model:' + name])\n+\n+        self.iteration = serializer('iteration', self.iteration)\n+\n+\n+def _default_update(updater, converter, device, loss_func):\n+    if not converter:\n+        converter = convert.concat_examples\n+\n+    iterator = updater.get_iterator('main')\n+    optimizer = updater.get_optimizer('main')\n+    loss_func = loss_func or optimizer.target\n+\n+    def update(_):\n+        batch = iterator.next()\n+        in_arrays = converter(batch, device)\n+\n+        if isinstance(in_arrays, tuple):\n+            in_vars = tuple(variable.Variable(x) for x in in_arrays)\n+            optimizer.update(loss_func, *in_vars)\n+        elif isinstance(in_arrays, dict):\n+            in_vars = {key: variable.Variable(x)\n+                       for key, x in six.iteritems(in_arrays)}\n+            optimizer.update(loss_func, **in_vars)\n+        else:\n+            in_var = variable.Variable(in_arrays)\n+            optimizer.update(loss_func, in_var)\n+\n+    return update\n+\n+\n+class ParallelUpdater(StandardUpdater):\n+\n+    \"\"\"Implementation of a parallel GPU Updater.\n+\n+    This is an implementation of :class:`Updater` that uses multiple GPUs.\n+    It accepts one or more training datasets and one or more optimizers. The\n+    default update routine assumes that there is only one training dataset and\n+    one optimizer, while users can specify their own update routines. Each\n+    batch is converted to input arrays by\n+    :func:`~chainer.datasets.concat_examples` by default, which can also be\n+    manually set.\n+\n+    There are two ways to modify the update behavior besides setting a custom\n+    loss function. One is by setting a custom update function via the\n+    ``update_func`` argument. The other one is by inheriting this class and\n+    overriding the :meth:`update` method. In latter case, do not forget to\n+    update the iteration counter at each call of this method, because this\n+    value is watched by the trainer for deciding when to invoke extensions and\n+    when to exit the training loop.\n+\n+    Args:\n+        iterator: Dataset iterator for the training dataset. It can also be a\n+            dictionary of iterators. If this is just an iterator, then the\n+            iterator is registered by the name ``'main'``.\n+        optimizer: Optimizer to update parameters. It can also be a dictionary\n+            of optimizers. If this is just an optimizer, then the optimizer is\n+            registered by the name ``'main'``.\n+        update_func: Update routine. This is a function that takes the updater\n+            object as the argument. The default routine uses ``converter``if\n+            specified.\n+        converter: Converter function to build input arrays. Each batch\n+            extracted by the main iterator is split equaly between the\n+            devices and then passed with corresponding ``device`` option to\n+            this function. If it is omitted,\n+            :func:`~chainer.dataset.concat_examples` is used.\n+        models: Dictionary of models. The main model should be the same model\n+            attached to the ``'main'`` optimizer.\n+        devices: Dictionary of devices to which the training data is sent. The\n+            devices should be arranged in a dictionary with the same structure\n+            as ``models``.\n+","path":"chainer/training/updater.py","position":257,"original_position":257,"commit_id":"e5bcbf7b8f785502050a20818e84bb07a334e5cd","original_commit_id":"e5bcbf7b8f785502050a20818e84bb07a334e5cd","user":{"login":"delta2323","id":407052,"avatar_url":"https://avatars.githubusercontent.com/u/407052?v=3","gravatar_id":"","url":"https://api.github.com/users/delta2323","html_url":"https://github.com/delta2323","followers_url":"https://api.github.com/users/delta2323/followers","following_url":"https://api.github.com/users/delta2323/following{/other_user}","gists_url":"https://api.github.com/users/delta2323/gists{/gist_id}","starred_url":"https://api.github.com/users/delta2323/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/delta2323/subscriptions","organizations_url":"https://api.github.com/users/delta2323/orgs","repos_url":"https://api.github.com/users/delta2323/repos","events_url":"https://api.github.com/users/delta2323/events{/privacy}","received_events_url":"https://api.github.com/users/delta2323/received_events","type":"User","site_admin":false},"body":"We should note in somewhere that it is \"data parallel\" scheme that default update routine that `_parallel_update` creates.","created_at":"2016-07-07T07:43:52Z","updated_at":"2016-07-07T07:43:52Z","html_url":"https://github.com/pfnet/chainer/pull/1285#discussion_r69863546","pull_request_url":"https://api.github.com/repos/pfnet/chainer/pulls/1285","_links":{"self":{"href":"https://api.github.com/repos/pfnet/chainer/pulls/comments/69863546"},"html":{"href":"https://github.com/pfnet/chainer/pull/1285#discussion_r69863546"},"pull_request":{"href":"https://api.github.com/repos/pfnet/chainer/pulls/1285"}}},"pull_request":{"url":"https://api.github.com/repos/pfnet/chainer/pulls/1285","id":74042786,"html_url":"https://github.com/pfnet/chainer/pull/1285","diff_url":"https://github.com/pfnet/chainer/pull/1285.diff","patch_url":"https://github.com/pfnet/chainer/pull/1285.patch","issue_url":"https://api.github.com/repos/pfnet/chainer/issues/1285","number":1285,"state":"open","locked":false,"title":"Trainer2","user":{"login":"beam2d","id":392019,"avatar_url":"https://avatars.githubusercontent.com/u/392019?v=3","gravatar_id":"","url":"https://api.github.com/users/beam2d","html_url":"https://github.com/beam2d","followers_url":"https://api.github.com/users/beam2d/followers","following_url":"https://api.github.com/users/beam2d/following{/other_user}","gists_url":"https://api.github.com/users/beam2d/gists{/gist_id}","starred_url":"https://api.github.com/users/beam2d/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/beam2d/subscriptions","organizations_url":"https://api.github.com/users/beam2d/orgs","repos_url":"https://api.github.com/users/beam2d/repos","events_url":"https://api.github.com/users/beam2d/events{/privacy}","received_events_url":"https://api.github.com/users/beam2d/received_events","type":"User","site_admin":false},"body":"fix #914. I wrote an updated version of the training loop abstraction. This includes many improvements based on the feedback to the old version (#958). For example,\r\n\r\n- Design around the dataset abstraction is improved. Most considerable applications are supported with some efforts of customization.\r\n- New Trainer supports using multiple datasets and multiple optimizers.\r\n- Evaluation report is abstracted into Reporter object. This makes it easy to collect many observable values like loss/accuracy, activation statistics, etc.\r\n\r\nI have not updated the tutorial document yet, which should be done before merging it.","created_at":"2016-06-16T08:45:48Z","updated_at":"2016-07-07T07:43:52Z","closed_at":null,"merged_at":null,"merge_commit_sha":"676b32ea5a931de658790b748b49790beeda12ce","assignee":{"login":"delta2323","id":407052,"avatar_url":"https://avatars.githubusercontent.com/u/407052?v=3","gravatar_id":"","url":"https://api.github.com/users/delta2323","html_url":"https://github.com/delta2323","followers_url":"https://api.github.com/users/delta2323/followers","following_url":"https://api.github.com/users/delta2323/following{/other_user}","gists_url":"https://api.github.com/users/delta2323/gists{/gist_id}","starred_url":"https://api.github.com/users/delta2323/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/delta2323/subscriptions","organizations_url":"https://api.github.com/users/delta2323/orgs","repos_url":"https://api.github.com/users/delta2323/repos","events_url":"https://api.github.com/users/delta2323/events{/privacy}","received_events_url":"https://api.github.com/users/delta2323/received_events","type":"User","site_admin":false},"assignees":[{"login":"delta2323","id":407052,"avatar_url":"https://avatars.githubusercontent.com/u/407052?v=3","gravatar_id":"","url":"https://api.github.com/users/delta2323","html_url":"https://github.com/delta2323","followers_url":"https://api.github.com/users/delta2323/followers","following_url":"https://api.github.com/users/delta2323/following{/other_user}","gists_url":"https://api.github.com/users/delta2323/gists{/gist_id}","starred_url":"https://api.github.com/users/delta2323/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/delta2323/subscriptions","organizations_url":"https://api.github.com/users/delta2323/orgs","repos_url":"https://api.github.com/users/delta2323/repos","events_url":"https://api.github.com/users/delta2323/events{/privacy}","received_events_url":"https://api.github.com/users/delta2323/received_events","type":"User","site_admin":false},{"login":"unnonouno","id":740680,"avatar_url":"https://avatars.githubusercontent.com/u/740680?v=3","gravatar_id":"","url":"https://api.github.com/users/unnonouno","html_url":"https://github.com/unnonouno","followers_url":"https://api.github.com/users/unnonouno/followers","following_url":"https://api.github.com/users/unnonouno/following{/other_user}","gists_url":"https://api.github.com/users/unnonouno/gists{/gist_id}","starred_url":"https://api.github.com/users/unnonouno/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/unnonouno/subscriptions","organizations_url":"https://api.github.com/users/unnonouno/orgs","repos_url":"https://api.github.com/users/unnonouno/repos","events_url":"https://api.github.com/users/unnonouno/events{/privacy}","received_events_url":"https://api.github.com/users/unnonouno/received_events","type":"User","site_admin":false},{"login":"bkvogel","id":12666050,"avatar_url":"https://avatars.githubusercontent.com/u/12666050?v=3","gravatar_id":"","url":"https://api.github.com/users/bkvogel","html_url":"https://github.com/bkvogel","followers_url":"https://api.github.com/users/bkvogel/followers","following_url":"https://api.github.com/users/bkvogel/following{/other_user}","gists_url":"https://api.github.com/users/bkvogel/gists{/gist_id}","starred_url":"https://api.github.com/users/bkvogel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bkvogel/subscriptions","organizations_url":"https://api.github.com/users/bkvogel/orgs","repos_url":"https://api.github.com/users/bkvogel/repos","events_url":"https://api.github.com/users/bkvogel/events{/privacy}","received_events_url":"https://api.github.com/users/bkvogel/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/pfnet/chainer/pulls/1285/commits","review_comments_url":"https://api.github.com/repos/pfnet/chainer/pulls/1285/comments","review_comment_url":"https://api.github.com/repos/pfnet/chainer/pulls/comments{/number}","comments_url":"https://api.github.com/repos/pfnet/chainer/issues/1285/comments","statuses_url":"https://api.github.com/repos/pfnet/chainer/statuses/e5bcbf7b8f785502050a20818e84bb07a334e5cd","head":{"label":"pfnet:trainer2","ref":"trainer2","sha":"e5bcbf7b8f785502050a20818e84bb07a334e5cd","user":{"login":"pfnet","id":9739572,"avatar_url":"https://avatars.githubusercontent.com/u/9739572?v=3","gravatar_id":"","url":"https://api.github.com/users/pfnet","html_url":"https://github.com/pfnet","followers_url":"https://api.github.com/users/pfnet/followers","following_url":"https://api.github.com/users/pfnet/following{/other_user}","gists_url":"https://api.github.com/users/pfnet/gists{/gist_id}","starred_url":"https://api.github.com/users/pfnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pfnet/subscriptions","organizations_url":"https://api.github.com/users/pfnet/orgs","repos_url":"https://api.github.com/users/pfnet/repos","events_url":"https://api.github.com/users/pfnet/events{/privacy}","received_events_url":"https://api.github.com/users/pfnet/received_events","type":"Organization","site_admin":false},"repo":{"id":36914478,"name":"chainer","full_name":"pfnet/chainer","owner":{"login":"pfnet","id":9739572,"avatar_url":"https://avatars.githubusercontent.com/u/9739572?v=3","gravatar_id":"","url":"https://api.github.com/users/pfnet","html_url":"https://github.com/pfnet","followers_url":"https://api.github.com/users/pfnet/followers","following_url":"https://api.github.com/users/pfnet/following{/other_user}","gists_url":"https://api.github.com/users/pfnet/gists{/gist_id}","starred_url":"https://api.github.com/users/pfnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pfnet/subscriptions","organizations_url":"https://api.github.com/users/pfnet/orgs","repos_url":"https://api.github.com/users/pfnet/repos","events_url":"https://api.github.com/users/pfnet/events{/privacy}","received_events_url":"https://api.github.com/users/pfnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/pfnet/chainer","description":"A flexible framework of neural networks for deep learning","fork":false,"url":"https://api.github.com/repos/pfnet/chainer","forks_url":"https://api.github.com/repos/pfnet/chainer/forks","keys_url":"https://api.github.com/repos/pfnet/chainer/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pfnet/chainer/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pfnet/chainer/teams","hooks_url":"https://api.github.com/repos/pfnet/chainer/hooks","issue_events_url":"https://api.github.com/repos/pfnet/chainer/issues/events{/number}","events_url":"https://api.github.com/repos/pfnet/chainer/events","assignees_url":"https://api.github.com/repos/pfnet/chainer/assignees{/user}","branches_url":"https://api.github.com/repos/pfnet/chainer/branches{/branch}","tags_url":"https://api.github.com/repos/pfnet/chainer/tags","blobs_url":"https://api.github.com/repos/pfnet/chainer/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pfnet/chainer/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pfnet/chainer/git/refs{/sha}","trees_url":"https://api.github.com/repos/pfnet/chainer/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pfnet/chainer/statuses/{sha}","languages_url":"https://api.github.com/repos/pfnet/chainer/languages","stargazers_url":"https://api.github.com/repos/pfnet/chainer/stargazers","contributors_url":"https://api.github.com/repos/pfnet/chainer/contributors","subscribers_url":"https://api.github.com/repos/pfnet/chainer/subscribers","subscription_url":"https://api.github.com/repos/pfnet/chainer/subscription","commits_url":"https://api.github.com/repos/pfnet/chainer/commits{/sha}","git_commits_url":"https://api.github.com/repos/pfnet/chainer/git/commits{/sha}","comments_url":"https://api.github.com/repos/pfnet/chainer/comments{/number}","issue_comment_url":"https://api.github.com/repos/pfnet/chainer/issues/comments{/number}","contents_url":"https://api.github.com/repos/pfnet/chainer/contents/{+path}","compare_url":"https://api.github.com/repos/pfnet/chainer/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pfnet/chainer/merges","archive_url":"https://api.github.com/repos/pfnet/chainer/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pfnet/chainer/downloads","issues_url":"https://api.github.com/repos/pfnet/chainer/issues{/number}","pulls_url":"https://api.github.com/repos/pfnet/chainer/pulls{/number}","milestones_url":"https://api.github.com/repos/pfnet/chainer/milestones{/number}","notifications_url":"https://api.github.com/repos/pfnet/chainer/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pfnet/chainer/labels{/name}","releases_url":"https://api.github.com/repos/pfnet/chainer/releases{/id}","deployments_url":"https://api.github.com/repos/pfnet/chainer/deployments","created_at":"2015-06-05T05:50:37Z","updated_at":"2016-07-07T06:07:53Z","pushed_at":"2016-07-07T06:38:26Z","git_url":"git://github.com/pfnet/chainer.git","ssh_url":"git@github.com:pfnet/chainer.git","clone_url":"https://github.com/pfnet/chainer.git","svn_url":"https://github.com/pfnet/chainer","homepage":"http://chainer.org","size":23665,"stargazers_count":1486,"watchers_count":1486,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":346,"mirror_url":null,"open_issues_count":180,"forks":346,"open_issues":180,"watchers":1486,"default_branch":"master"}},"base":{"label":"pfnet:master","ref":"master","sha":"6a63b31b78fccf34c6357a0b9788a824aadc7a0a","user":{"login":"pfnet","id":9739572,"avatar_url":"https://avatars.githubusercontent.com/u/9739572?v=3","gravatar_id":"","url":"https://api.github.com/users/pfnet","html_url":"https://github.com/pfnet","followers_url":"https://api.github.com/users/pfnet/followers","following_url":"https://api.github.com/users/pfnet/following{/other_user}","gists_url":"https://api.github.com/users/pfnet/gists{/gist_id}","starred_url":"https://api.github.com/users/pfnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pfnet/subscriptions","organizations_url":"https://api.github.com/users/pfnet/orgs","repos_url":"https://api.github.com/users/pfnet/repos","events_url":"https://api.github.com/users/pfnet/events{/privacy}","received_events_url":"https://api.github.com/users/pfnet/received_events","type":"Organization","site_admin":false},"repo":{"id":36914478,"name":"chainer","full_name":"pfnet/chainer","owner":{"login":"pfnet","id":9739572,"avatar_url":"https://avatars.githubusercontent.com/u/9739572?v=3","gravatar_id":"","url":"https://api.github.com/users/pfnet","html_url":"https://github.com/pfnet","followers_url":"https://api.github.com/users/pfnet/followers","following_url":"https://api.github.com/users/pfnet/following{/other_user}","gists_url":"https://api.github.com/users/pfnet/gists{/gist_id}","starred_url":"https://api.github.com/users/pfnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pfnet/subscriptions","organizations_url":"https://api.github.com/users/pfnet/orgs","repos_url":"https://api.github.com/users/pfnet/repos","events_url":"https://api.github.com/users/pfnet/events{/privacy}","received_events_url":"https://api.github.com/users/pfnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/pfnet/chainer","description":"A flexible framework of neural networks for deep learning","fork":false,"url":"https://api.github.com/repos/pfnet/chainer","forks_url":"https://api.github.com/repos/pfnet/chainer/forks","keys_url":"https://api.github.com/repos/pfnet/chainer/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pfnet/chainer/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pfnet/chainer/teams","hooks_url":"https://api.github.com/repos/pfnet/chainer/hooks","issue_events_url":"https://api.github.com/repos/pfnet/chainer/issues/events{/number}","events_url":"https://api.github.com/repos/pfnet/chainer/events","assignees_url":"https://api.github.com/repos/pfnet/chainer/assignees{/user}","branches_url":"https://api.github.com/repos/pfnet/chainer/branches{/branch}","tags_url":"https://api.github.com/repos/pfnet/chainer/tags","blobs_url":"https://api.github.com/repos/pfnet/chainer/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pfnet/chainer/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pfnet/chainer/git/refs{/sha}","trees_url":"https://api.github.com/repos/pfnet/chainer/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pfnet/chainer/statuses/{sha}","languages_url":"https://api.github.com/repos/pfnet/chainer/languages","stargazers_url":"https://api.github.com/repos/pfnet/chainer/stargazers","contributors_url":"https://api.github.com/repos/pfnet/chainer/contributors","subscribers_url":"https://api.github.com/repos/pfnet/chainer/subscribers","subscription_url":"https://api.github.com/repos/pfnet/chainer/subscription","commits_url":"https://api.github.com/repos/pfnet/chainer/commits{/sha}","git_commits_url":"https://api.github.com/repos/pfnet/chainer/git/commits{/sha}","comments_url":"https://api.github.com/repos/pfnet/chainer/comments{/number}","issue_comment_url":"https://api.github.com/repos/pfnet/chainer/issues/comments{/number}","contents_url":"https://api.github.com/repos/pfnet/chainer/contents/{+path}","compare_url":"https://api.github.com/repos/pfnet/chainer/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pfnet/chainer/merges","archive_url":"https://api.github.com/repos/pfnet/chainer/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pfnet/chainer/downloads","issues_url":"https://api.github.com/repos/pfnet/chainer/issues{/number}","pulls_url":"https://api.github.com/repos/pfnet/chainer/pulls{/number}","milestones_url":"https://api.github.com/repos/pfnet/chainer/milestones{/number}","notifications_url":"https://api.github.com/repos/pfnet/chainer/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pfnet/chainer/labels{/name}","releases_url":"https://api.github.com/repos/pfnet/chainer/releases{/id}","deployments_url":"https://api.github.com/repos/pfnet/chainer/deployments","created_at":"2015-06-05T05:50:37Z","updated_at":"2016-07-07T06:07:53Z","pushed_at":"2016-07-07T06:38:26Z","git_url":"git://github.com/pfnet/chainer.git","ssh_url":"git@github.com:pfnet/chainer.git","clone_url":"https://github.com/pfnet/chainer.git","svn_url":"https://github.com/pfnet/chainer","homepage":"http://chainer.org","size":23665,"stargazers_count":1486,"watchers_count":1486,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":346,"mirror_url":null,"open_issues_count":180,"forks":346,"open_issues":180,"watchers":1486,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/pfnet/chainer/pulls/1285"},"html":{"href":"https://github.com/pfnet/chainer/pull/1285"},"issue":{"href":"https://api.github.com/repos/pfnet/chainer/issues/1285"},"comments":{"href":"https://api.github.com/repos/pfnet/chainer/issues/1285/comments"},"review_comments":{"href":"https://api.github.com/repos/pfnet/chainer/pulls/1285/comments"},"review_comment":{"href":"https://api.github.com/repos/pfnet/chainer/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/pfnet/chainer/pulls/1285/commits"},"statuses":{"href":"https://api.github.com/repos/pfnet/chainer/statuses/e5bcbf7b8f785502050a20818e84bb07a334e5cd"}}}}
{"actor":{"display_login":"delta2323"}}