{"action":"created","comment":{"url":"https://api.github.com/repos/chainer/chainer/pulls/comments/261106282","pull_request_review_id":208961760,"id":261106282,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2MTEwNjI4Mg==","diff_hunk":"@@ -36,118 +39,175 @@ def _batch_normalization(expander, gamma, beta, x, mean, var, eps, test):\n         {'input_shape': (5, 4, 3), 'axis': (0, 1)},\n     ]\n )))\n-class BatchNormalizationTest(unittest.TestCase):\n+\n+\n+class BatchNormalizationTestBase(object):\n+\n+    param_names = ['gamma', 'beta']\n \n     def setUp(self):\n-        if not hasattr(self, 'axis'):\n-            aggr_axes = (0,) + tuple(six.moves.range(2, self.ndim + 2))\n-            shape = (5, 3) + (2,) * self.ndim\n-            param_shape = shape[1]\n-            self.expander = (None, Ellipsis) + (None,) * self.ndim\n-        else:\n+        if hasattr(self, 'axis') and hasattr(self, 'input_shape'):\n             aggr_axes = self.axis\n-            if isinstance(self.axis, int):\n-                aggr_axes = self.axis,\n+            if isinstance(aggr_axes, int):\n+                aggr_axes = aggr_axes,\n             shape = self.input_shape\n             param_shape = tuple(\n-                s\n-                for i, s in enumerate(shape)\n-                if i not in aggr_axes\n-            )\n-            self.expander = tuple(\n+                s for i, s in enumerate(shape) if i not in aggr_axes)\n+            expander = tuple(\n                 None if i in aggr_axes else slice(None)\n-                for i in range(len(shape))\n-            )\n-\n-        options = {}\n-        if hasattr(self, 'axis'):\n-            options['axis'] = self.axis\n-        self.link = links.BatchNormalization(\n-            param_shape, dtype=self.dtype, **options)\n-        gamma = self.link.gamma.data\n-        gamma[...] = numpy.random.uniform(.5, 1, gamma.shape)\n-        beta = self.link.beta.data\n-        beta[...] = numpy.random.uniform(-1, 1, beta.shape)\n-        self.link.cleargrads()\n-\n-        self.gamma = gamma.copy()[self.expander]  # fixed on CPU\n-        self.beta = beta.copy()[self.expander]   # fixed on CPU\n-\n-        self.x = numpy.random.uniform(-1, 1, shape).astype(self.dtype)\n-        self.gy = numpy.random.uniform(-1, 1, shape).astype(self.dtype)\n-\n-        if self.test:\n-            self.mean = numpy.random.uniform(\n-                -1, 1, param_shape).astype(self.dtype)\n-            self.var = numpy.random.uniform(\n-                0.5, 1, param_shape).astype(self.dtype)\n-            self.link.avg_mean[...] = self.mean\n-            self.link.avg_var[...] = self.var\n+                for i in range(len(shape)))\n+        elif hasattr(self, 'ndim'):\n+            aggr_axes = (0,) + tuple(six.moves.range(2, self.ndim + 2))\n+            shape = (5, 3) + (2,) * self.ndim\n+            param_shape = shape[1]\n+            expander = (None, Ellipsis) + (None,) * self.ndim\n         else:\n-            self.mean = self.x.mean(axis=aggr_axes)\n-            self.var = self.x.var(axis=aggr_axes)\n-        self.check_forward_optionss = {'atol': 1e-4, 'rtol': 1e-3}\n-        self.check_backward_optionss = {'atol': 1e-4, 'rtol': 1e-3}\n+            assert False\n+\n+        self.aggr_axes = aggr_axes\n+        self.shape = shape\n+        self.param_shape = param_shape\n+        self.expander = expander\n+        self.finetune = False\n+        self.mean = None\n+        self.var = None\n+        self.eps = 2e-5\n+\n+        self.check_forward_options = {'atol': 1e-4, 'rtol': 1e-3}\n+        self.check_backward_options = {'atol': 1e-4, 'rtol': 1e-3}\n         if self.dtype == numpy.float16:\n-            self.check_forward_optionss = {'atol': 1e-3, 'rtol': 1e-2}\n-            self.check_backward_optionss = {'atol': 5e-1, 'rtol': 1e-1}\n+            self.check_forward_options = {'atol': 1e-2, 'rtol': 1e-1}\n+            self.check_backward_options = {'atol': 5e-1, 'rtol': 1e-1}\n+\n+    def before_test(self, test_name):\n+        if not self.test:\n+            return\n+\n+        self.mean = numpy.random.uniform(\n+            -1, 1, self.param_shape).astype(self.dtype)\n+        self.var = numpy.random.uniform(\n+            0.5, 1, self.param_shape).astype(self.dtype)\n+\n+    def generate_forward_backward_initializers(self):\n+        initial_gamma = numpy.random.uniform(\n+            -1, 1, self.param_shape).astype(self.dtype)\n+        initial_beta = numpy.random.uniform(\n+            -1, 1, self.param_shape).astype(self.dtype)\n+        return initial_gamma, initial_beta\n+\n+    def generate_initializers(self):\n+        initial_gamma = [\n+            initializers.Constant(2), 2, testing.link.InitializerPair(None, 1)]\n+        initial_beta = [\n+            initializers.Constant(2), 2, testing.link.InitializerPair(None, 0)]\n+        return initial_gamma, initial_beta\n+\n+    def create_link(self, initializers):\n+        initial_gamma, initial_beta = initializers\n+\n+        size = self.param_shape if self.size == 'explicit' else None\n+        initial_avg_mean = None if self.mean is None else self.mean.copy()\n+        initial_avg_var = None if self.var is None else self.var.copy()\n+\n+        link = links.BatchNormalization(\n+            size=size,\n+            axis=self.aggr_axes,\n+            eps=self.eps,\n+            dtype=self.dtype,\n+            initial_gamma=initial_gamma,\n+            initial_beta=initial_beta,\n+            initial_avg_mean=initial_avg_mean,\n+            initial_avg_var=initial_avg_var)\n+        return link\n+\n+    def generate_inputs(self):\n+        x = numpy.random.uniform(-1, 1, self.shape).astype(self.dtype)\n+        return x,\n+\n+    def forward(self, link, inputs, device):\n+        x, = inputs\n+\n+        # The inputs might be of different dtype than what the link was\n+        # initialized with. In that case, persistent values must be manually\n+        # cast. This is needed when forward is called in order to compute\n+        # numerical gradients.\n+        if link.avg_mean is not None and x.dtype != link.avg_mean.dtype:\n+            link.avg_mean = link.avg_mean.astype(x.dtype)\n+            link.avg_var = link.avg_var.astype(x.dtype)\n \n-    def check_forward(self, x_data):\n         with chainer.using_config('train', not self.test):\n-            x = chainer.Variable(x_data)\n-            y = self.link(x)\n-            self.assertEqual(y.data.dtype, self.dtype)\n-\n-        y_expect = _batch_normalization(\n-            self.expander, self.gamma, self.beta, self.x, self.mean,\n-            self.var, self.link.eps, self.test)\n+            y = link(x, finetune=self.finetune)\n+        return y,\n \n-        testing.assert_allclose(\n-            y_expect, y.data, **self.check_forward_optionss)\n-\n-    @condition.retry(3)\n-    def test_forward_cpu(self):\n-        self.check_forward(self.x)\n+    def forward_expected(self, inputs, params):\n+        x, = inputs\n+        gamma, beta = params\n \n-    @attr.gpu\n-    @condition.retry(3)\n-    def test_forward_gpu(self):\n-        self.link.to_gpu()\n-        self.check_forward(cuda.to_gpu(self.x))\n-\n-    @attr.cudnn\n-    def test_forward_gpu_without_cudnn(self):\n-        with chainer.using_config('use_cudnn', 'never'):\n-            self.test_forward_gpu()\n-\n-    @attr.multi_gpu(2)\n-    @condition.retry(3)\n-    def test_forward_multi_gpu(self):\n-        with cuda.get_device_from_id(1):\n-            self.link.to_gpu()\n-            x = cuda.to_gpu(self.x)\n-        with cuda.get_device_from_id(0):\n-            self.check_forward(x)\n-\n-    def check_backward(self, x_data, y_grad):\n-        gradient_check.check_backward(\n-            self.link, x_data, y_grad, (self.link.gamma, self.link.beta),\n-            eps=1e-2, **self.check_backward_optionss)\n-\n-    @condition.retry(3)\n-    def test_backward_cpu(self):\n-        self.check_backward(self.x, self.gy)\n-\n-    @attr.gpu\n-    @condition.retry(3)\n-    def test_backward_gpu(self):\n-        self.link.to_gpu()\n-        self.check_backward(cuda.to_gpu(self.x), cuda.to_gpu(self.gy))\n-\n-    @attr.cudnn\n-    def test_backward_gpu_without_cudnn(self):\n-        with chainer.using_config('use_cudnn', 'never'):\n-            self.test_backward_gpu()\n+        if self.test:\n+            mean = self.mean[self.expander]\n+            var = self.var[self.expander]\n+            std = numpy.sqrt(var)\n+        else:\n+            mean = x.mean(axis=self.aggr_axes, keepdims=True)\n+            var = x.var(axis=self.aggr_axes, keepdims=True)\n+            std = numpy.sqrt(var + self.eps)\n+        y = gamma[self.expander] * (x - mean) / std + beta[self.expander]\n+        return y,\n+\n+\n+@testing.inject_backend_tests(\n+    None,\n+    # CPU tests\n+    [\n+        {},\n+        {'use_ideep': 'always'},\n+    ]\n+    # GPU tests\n+    + testing.product({\n+        'use_cuda': [True],\n+        'use_cudnn': ['never', 'always'],\n+        'cuda_device': [0, 1],\n+    })\n+    # ChainerX tests\n+    + [\n+        {'use_chainerx': True, 'chainerx_device': 'native:0'},\n+        {'use_chainerx': True, 'chainerx_device': 'cuda:1'},\n+        {'use_chainerx': True, 'chainerx_device': 'cuda:1'},\n+    ])\n+@_parameterize\n+class BatchNormalizationTest(BatchNormalizationTestBase, testing.LinkTestCase):\n+\n+    contiguous = 'C'\n+\n+\n+@attr.multi_gpu(2)\n+@testing.inject_backend_tests(\n+    None,\n+    testing.product({\n+        'use_cuda': [True],\n+        'use_cudnn': ['never', 'always'],\n+        'cuda_device': [0],\n+    }))\n+@_parameterize\n+class BatchNormalizationMultiGpuTest(\n+        BatchNormalizationTestBase, testing.LinkTestCase):\n+\n+    skip_backward_test = True\n+    skip_initializers_test = True\n+    contiguous = 'C'","path":"tests/chainer_tests/links_tests/normalization_tests/test_batch_normalization.py","position":283,"original_position":283,"commit_id":"6010a006f3041267849259028aef32ad33d13769","original_commit_id":"e42eb2b5ddab4e6e374eed091d4c7031033dcd41","user":{"login":"hvy","id":5983694,"node_id":"MDQ6VXNlcjU5ODM2OTQ=","avatar_url":"https://avatars2.githubusercontent.com/u/5983694?v=4","gravatar_id":"","url":"https://api.github.com/users/hvy","html_url":"https://github.com/hvy","followers_url":"https://api.github.com/users/hvy/followers","following_url":"https://api.github.com/users/hvy/following{/other_user}","gists_url":"https://api.github.com/users/hvy/gists{/gist_id}","starred_url":"https://api.github.com/users/hvy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hvy/subscriptions","organizations_url":"https://api.github.com/users/hvy/orgs","repos_url":"https://api.github.com/users/hvy/repos","events_url":"https://api.github.com/users/hvy/events{/privacy}","received_events_url":"https://api.github.com/users/hvy/received_events","type":"User","site_admin":false},"body":"It is, because of this bug https://github.com/cupy/cupy/issues/2061. I'll add a TODO comment.","created_at":"2019-02-28T09:21:15Z","updated_at":"2019-02-28T09:21:15Z","html_url":"https://github.com/chainer/chainer/pull/6187#discussion_r261106282","pull_request_url":"https://api.github.com/repos/chainer/chainer/pulls/6187","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/chainer/chainer/pulls/comments/261106282"},"html":{"href":"https://github.com/chainer/chainer/pull/6187#discussion_r261106282"},"pull_request":{"href":"https://api.github.com/repos/chainer/chainer/pulls/6187"}},"in_reply_to_id":261063781},"pull_request":{"url":"https://api.github.com/repos/chainer/chainer/pulls/6187","id":250672308,"node_id":"MDExOlB1bGxSZXF1ZXN0MjUwNjcyMzA4","html_url":"https://github.com/chainer/chainer/pull/6187","diff_url":"https://github.com/chainer/chainer/pull/6187.diff","patch_url":"https://github.com/chainer/chainer/pull/6187.patch","issue_url":"https://api.github.com/repos/chainer/chainer/issues/6187","number":6187,"state":"open","locked":false,"title":"Introduce LinkTestCase to simplify Link tests","user":{"login":"hvy","id":5983694,"node_id":"MDQ6VXNlcjU5ODM2OTQ=","avatar_url":"https://avatars2.githubusercontent.com/u/5983694?v=4","gravatar_id":"","url":"https://api.github.com/users/hvy","html_url":"https://github.com/hvy","followers_url":"https://api.github.com/users/hvy/followers","following_url":"https://api.github.com/users/hvy/following{/other_user}","gists_url":"https://api.github.com/users/hvy/gists{/gist_id}","starred_url":"https://api.github.com/users/hvy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hvy/subscriptions","organizations_url":"https://api.github.com/users/hvy/orgs","repos_url":"https://api.github.com/users/hvy/repos","events_url":"https://api.github.com/users/hvy/events{/privacy}","received_events_url":"https://api.github.com/users/hvy/received_events","type":"User","site_admin":false},"body":"Fixes #6178.\r\n\r\nIntroduces \r\n- A base class for `chainer.Link` implementation tests, `chainer.testing.LinkTestCase`.\r\n- `chainer.testing.test` to store common functions for `chainer.testing.{Function,Link}TestCase`.\r\n- A \"check_backward\" function that allows passing parameters as ndarrays (instead of previous `chainer.Parameter`). This is needed since `chainer.Parameter` with ChainerX ndarrays cannot be updated in-place (`.array`).","created_at":"2019-02-06T08:47:30Z","updated_at":"2019-02-28T09:21:15Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7373f35c4fb916def7a58ca0017f6d4676d33a3e","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":222603817,"node_id":"MDU6TGFiZWwyMjI2MDM4MTc=","url":"https://api.github.com/repos/chainer/chainer/labels/cat:feature","name":"cat:feature","color":"fbca04","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/chainer/chainer/pulls/6187/commits","review_comments_url":"https://api.github.com/repos/chainer/chainer/pulls/6187/comments","review_comment_url":"https://api.github.com/repos/chainer/chainer/pulls/comments{/number}","comments_url":"https://api.github.com/repos/chainer/chainer/issues/6187/comments","statuses_url":"https://api.github.com/repos/chainer/chainer/statuses/6010a006f3041267849259028aef32ad33d13769","head":{"label":"hvy:link-test-case","ref":"link-test-case","sha":"6010a006f3041267849259028aef32ad33d13769","user":{"login":"hvy","id":5983694,"node_id":"MDQ6VXNlcjU5ODM2OTQ=","avatar_url":"https://avatars2.githubusercontent.com/u/5983694?v=4","gravatar_id":"","url":"https://api.github.com/users/hvy","html_url":"https://github.com/hvy","followers_url":"https://api.github.com/users/hvy/followers","following_url":"https://api.github.com/users/hvy/following{/other_user}","gists_url":"https://api.github.com/users/hvy/gists{/gist_id}","starred_url":"https://api.github.com/users/hvy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hvy/subscriptions","organizations_url":"https://api.github.com/users/hvy/orgs","repos_url":"https://api.github.com/users/hvy/repos","events_url":"https://api.github.com/users/hvy/events{/privacy}","received_events_url":"https://api.github.com/users/hvy/received_events","type":"User","site_admin":false},"repo":{"id":53650069,"node_id":"MDEwOlJlcG9zaXRvcnk1MzY1MDA2OQ==","name":"chainer","full_name":"hvy/chainer","private":false,"owner":{"login":"hvy","id":5983694,"node_id":"MDQ6VXNlcjU5ODM2OTQ=","avatar_url":"https://avatars2.githubusercontent.com/u/5983694?v=4","gravatar_id":"","url":"https://api.github.com/users/hvy","html_url":"https://github.com/hvy","followers_url":"https://api.github.com/users/hvy/followers","following_url":"https://api.github.com/users/hvy/following{/other_user}","gists_url":"https://api.github.com/users/hvy/gists{/gist_id}","starred_url":"https://api.github.com/users/hvy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hvy/subscriptions","organizations_url":"https://api.github.com/users/hvy/orgs","repos_url":"https://api.github.com/users/hvy/repos","events_url":"https://api.github.com/users/hvy/events{/privacy}","received_events_url":"https://api.github.com/users/hvy/received_events","type":"User","site_admin":false},"html_url":"https://github.com/hvy/chainer","description":"A flexible framework of neural networks for deep learning","fork":true,"url":"https://api.github.com/repos/hvy/chainer","forks_url":"https://api.github.com/repos/hvy/chainer/forks","keys_url":"https://api.github.com/repos/hvy/chainer/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hvy/chainer/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hvy/chainer/teams","hooks_url":"https://api.github.com/repos/hvy/chainer/hooks","issue_events_url":"https://api.github.com/repos/hvy/chainer/issues/events{/number}","events_url":"https://api.github.com/repos/hvy/chainer/events","assignees_url":"https://api.github.com/repos/hvy/chainer/assignees{/user}","branches_url":"https://api.github.com/repos/hvy/chainer/branches{/branch}","tags_url":"https://api.github.com/repos/hvy/chainer/tags","blobs_url":"https://api.github.com/repos/hvy/chainer/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hvy/chainer/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hvy/chainer/git/refs{/sha}","trees_url":"https://api.github.com/repos/hvy/chainer/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hvy/chainer/statuses/{sha}","languages_url":"https://api.github.com/repos/hvy/chainer/languages","stargazers_url":"https://api.github.com/repos/hvy/chainer/stargazers","contributors_url":"https://api.github.com/repos/hvy/chainer/contributors","subscribers_url":"https://api.github.com/repos/hvy/chainer/subscribers","subscription_url":"https://api.github.com/repos/hvy/chainer/subscription","commits_url":"https://api.github.com/repos/hvy/chainer/commits{/sha}","git_commits_url":"https://api.github.com/repos/hvy/chainer/git/commits{/sha}","comments_url":"https://api.github.com/repos/hvy/chainer/comments{/number}","issue_comment_url":"https://api.github.com/repos/hvy/chainer/issues/comments{/number}","contents_url":"https://api.github.com/repos/hvy/chainer/contents/{+path}","compare_url":"https://api.github.com/repos/hvy/chainer/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hvy/chainer/merges","archive_url":"https://api.github.com/repos/hvy/chainer/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hvy/chainer/downloads","issues_url":"https://api.github.com/repos/hvy/chainer/issues{/number}","pulls_url":"https://api.github.com/repos/hvy/chainer/pulls{/number}","milestones_url":"https://api.github.com/repos/hvy/chainer/milestones{/number}","notifications_url":"https://api.github.com/repos/hvy/chainer/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hvy/chainer/labels{/name}","releases_url":"https://api.github.com/repos/hvy/chainer/releases{/id}","deployments_url":"https://api.github.com/repos/hvy/chainer/deployments","created_at":"2016-03-11T08:02:21Z","updated_at":"2019-01-17T01:12:39Z","pushed_at":"2019-02-28T09:14:23Z","git_url":"git://github.com/hvy/chainer.git","ssh_url":"git@github.com:hvy/chainer.git","clone_url":"https://github.com/hvy/chainer.git","svn_url":"https://github.com/hvy/chainer","homepage":"http://chainer.org","size":46418,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"chainer:master","ref":"master","sha":"9e44f9ffad52fc71682923d0c11121b9d6bb2896","user":{"login":"chainer","id":23183003,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIzMTgzMDAz","avatar_url":"https://avatars3.githubusercontent.com/u/23183003?v=4","gravatar_id":"","url":"https://api.github.com/users/chainer","html_url":"https://github.com/chainer","followers_url":"https://api.github.com/users/chainer/followers","following_url":"https://api.github.com/users/chainer/following{/other_user}","gists_url":"https://api.github.com/users/chainer/gists{/gist_id}","starred_url":"https://api.github.com/users/chainer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chainer/subscriptions","organizations_url":"https://api.github.com/users/chainer/orgs","repos_url":"https://api.github.com/users/chainer/repos","events_url":"https://api.github.com/users/chainer/events{/privacy}","received_events_url":"https://api.github.com/users/chainer/received_events","type":"Organization","site_admin":false},"repo":{"id":36914478,"node_id":"MDEwOlJlcG9zaXRvcnkzNjkxNDQ3OA==","name":"chainer","full_name":"chainer/chainer","private":false,"owner":{"login":"chainer","id":23183003,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIzMTgzMDAz","avatar_url":"https://avatars3.githubusercontent.com/u/23183003?v=4","gravatar_id":"","url":"https://api.github.com/users/chainer","html_url":"https://github.com/chainer","followers_url":"https://api.github.com/users/chainer/followers","following_url":"https://api.github.com/users/chainer/following{/other_user}","gists_url":"https://api.github.com/users/chainer/gists{/gist_id}","starred_url":"https://api.github.com/users/chainer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chainer/subscriptions","organizations_url":"https://api.github.com/users/chainer/orgs","repos_url":"https://api.github.com/users/chainer/repos","events_url":"https://api.github.com/users/chainer/events{/privacy}","received_events_url":"https://api.github.com/users/chainer/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/chainer/chainer","description":"A flexible framework of neural networks for deep learning","fork":false,"url":"https://api.github.com/repos/chainer/chainer","forks_url":"https://api.github.com/repos/chainer/chainer/forks","keys_url":"https://api.github.com/repos/chainer/chainer/keys{/key_id}","collaborators_url":"https://api.github.com/repos/chainer/chainer/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/chainer/chainer/teams","hooks_url":"https://api.github.com/repos/chainer/chainer/hooks","issue_events_url":"https://api.github.com/repos/chainer/chainer/issues/events{/number}","events_url":"https://api.github.com/repos/chainer/chainer/events","assignees_url":"https://api.github.com/repos/chainer/chainer/assignees{/user}","branches_url":"https://api.github.com/repos/chainer/chainer/branches{/branch}","tags_url":"https://api.github.com/repos/chainer/chainer/tags","blobs_url":"https://api.github.com/repos/chainer/chainer/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/chainer/chainer/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/chainer/chainer/git/refs{/sha}","trees_url":"https://api.github.com/repos/chainer/chainer/git/trees{/sha}","statuses_url":"https://api.github.com/repos/chainer/chainer/statuses/{sha}","languages_url":"https://api.github.com/repos/chainer/chainer/languages","stargazers_url":"https://api.github.com/repos/chainer/chainer/stargazers","contributors_url":"https://api.github.com/repos/chainer/chainer/contributors","subscribers_url":"https://api.github.com/repos/chainer/chainer/subscribers","subscription_url":"https://api.github.com/repos/chainer/chainer/subscription","commits_url":"https://api.github.com/repos/chainer/chainer/commits{/sha}","git_commits_url":"https://api.github.com/repos/chainer/chainer/git/commits{/sha}","comments_url":"https://api.github.com/repos/chainer/chainer/comments{/number}","issue_comment_url":"https://api.github.com/repos/chainer/chainer/issues/comments{/number}","contents_url":"https://api.github.com/repos/chainer/chainer/contents/{+path}","compare_url":"https://api.github.com/repos/chainer/chainer/compare/{base}...{head}","merges_url":"https://api.github.com/repos/chainer/chainer/merges","archive_url":"https://api.github.com/repos/chainer/chainer/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/chainer/chainer/downloads","issues_url":"https://api.github.com/repos/chainer/chainer/issues{/number}","pulls_url":"https://api.github.com/repos/chainer/chainer/pulls{/number}","milestones_url":"https://api.github.com/repos/chainer/chainer/milestones{/number}","notifications_url":"https://api.github.com/repos/chainer/chainer/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/chainer/chainer/labels{/name}","releases_url":"https://api.github.com/repos/chainer/chainer/releases{/id}","deployments_url":"https://api.github.com/repos/chainer/chainer/deployments","created_at":"2015-06-05T05:50:37Z","updated_at":"2019-02-28T08:50:54Z","pushed_at":"2019-02-28T09:15:32Z","git_url":"git://github.com/chainer/chainer.git","ssh_url":"git@github.com:chainer/chainer.git","clone_url":"https://github.com/chainer/chainer.git","svn_url":"https://github.com/chainer/chainer","homepage":"https://chainer.org","size":42430,"stargazers_count":4607,"watchers_count":4607,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1223,"mirror_url":null,"archived":false,"open_issues_count":293,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":1223,"open_issues":293,"watchers":4607,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/chainer/chainer/pulls/6187"},"html":{"href":"https://github.com/chainer/chainer/pull/6187"},"issue":{"href":"https://api.github.com/repos/chainer/chainer/issues/6187"},"comments":{"href":"https://api.github.com/repos/chainer/chainer/issues/6187/comments"},"review_comments":{"href":"https://api.github.com/repos/chainer/chainer/pulls/6187/comments"},"review_comment":{"href":"https://api.github.com/repos/chainer/chainer/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/chainer/chainer/pulls/6187/commits"},"statuses":{"href":"https://api.github.com/repos/chainer/chainer/statuses/6010a006f3041267849259028aef32ad33d13769"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"hvy"}}