{"action":"created","comment":{"url":"https://api.github.com/repos/Theano/Theano/pulls/comments/66953803","id":66953803,"diff_hunk":"@@ -2270,6 +2270,375 @@ def method(self):\n         \"\"\"\n \n \n+class GpuDnnBatchNormBase(DnnBase):\n+    \"\"\"\n+    Base Op for cuDNN Batch Normalization.\n+\n+    Parameters\n+    ----------\n+    mode : {'per-activation', 'spatial'}\n+        Whether to normalize per activation (in this mode, bias and scale\n+        tensor dimensions are 1xCxHxW) or share normalization factors across\n+        spatial dimensions (in this mode, bias and scale tensor dimensions\n+        are 1xCx1x1).\n+    epsilon\n+        Epsilon value used in the batch normalization formula. Minimum allowed\n+        value is 1e-5 (imposed by cuDNN).\n+    \"\"\"\n+\n+    __props__ = ('mode', 'epsilon')\n+    tensor_4d_descs = []\n+\n+    def __init__(self, mode='per-activation', epsilon=1e-4):\n+        DnnBase.__init__(self)\n+\n+        if version() < (5000, 5000):\n+            raise RuntimeError(\"cuDNN Batch Normalization requires cuDNN v5\")\n+\n+        assert (mode in ('per-activation', 'spatial'))\n+        self.mode = mode\n+\n+        assert (epsilon >= 1e-5)\n+        self.epsilon = epsilon\n+\n+    def c_support_code_struct(self, node, name):\n+        result = ''\n+        for id in self.tensor_4d_descs:\n+            result += c_define_tensor_desc('%s_%s' % (id, name))\n+        return result\n+\n+    def c_init_code_struct(self, node, name, sub):\n+        result = \"\"\"\n+cudnnStatus_t err%(name)s;\n+\"\"\" % dict(name=name)\n+\n+        for id in self.tensor_4d_descs:\n+            result += c_init_tensor_desc('%s_%s' % (id, name), 'err' + name, sub['fail'])\n+        return result\n+\n+    def c_cleanup_code_struct(self, node, name):\n+        result = ''\n+        for id in self.tensor_4d_descs:\n+            result += c_clean_tensor_desc('%s_%s' % (id, name))\n+        return result\n+\n+    def c_code(self, node, name, inputs, outputs, sub):\n+        if self.mode == \"spatial\":\n+            mode = \"CUDNN_BATCHNORM_SPATIAL\"\n+        else:\n+            mode = \"CUDNN_BATCHNORM_PER_ACTIVATION\"\n+\n+        # Setup configuration variables.\n+        result = \"\"\"\n+cudnnStatus_t err%(name)s;\n+cudnnBatchNormMode_t mode%(name)s = %(mode)s;\n+double exponentialAverageFactor%(name)s = %(exp_avg_factor)f;\n+double epsilon%(name)s = %(epsilon)e;\n+\"\"\" % dict(name=name,\n+           mode=mode,\n+           exp_avg_factor=0,  # deliberately unused\n+           epsilon=self.epsilon)\n+\n+        return result\n+\n+    def c_code_cache_version(self):\n+        return (2, version())\n+\n+\n+class GpuDnnBatchNormInference(GpuDnnBatchNormBase):\n+    \"\"\"\n+    Op for the cuDNN BatchNormalizationForwardInference function.\n+    See GpuDnnBatchNormBase for parameters.\n+\n+    On application, takes input, scale, bias, mean and variance and produces:\n+    output = (input - mean) / sqrt(variance + epsilon) * scale + bias\n+\n+    where mean and variance are usually some running averages over multiple\n+    batches computed during training.\n+\n+    Note: scale, bias, mean and variance must follow the same tensor layout!\n+    \"\"\"\n+\n+    tensor_4d_descs = ['bn_input', 'bn_output', 'bn_params']\n+\n+    def infer_shape(self, node, shape):\n+        # output shape equals shape of x\n+        return [shape[0]]\n+\n+    def make_node(self, x, scale, bias, estimated_mean, estimated_variance):\n+        x = as_cuda_ndarray_variable(x)\n+        scale = as_cuda_ndarray_variable(scale)\n+        bias = as_cuda_ndarray_variable(bias)\n+        estimated_mean = as_cuda_ndarray_variable(estimated_mean)\n+        estimated_variance = as_cuda_ndarray_variable(estimated_variance)\n+        assert x.ndim == 4\n+        assert scale.ndim == 4\n+        assert bias.ndim == 4\n+        assert estimated_mean.ndim == 4\n+        assert estimated_variance.ndim == 4\n+        return Apply(self, [x, scale, bias, estimated_mean, estimated_variance],\n+                     [x.type()])\n+\n+    def c_code(self, node, name, inputs, outputs, sub):\n+        # super call to prepare common configuration\n+        result = super(GpuDnnBatchNormInference, self).c_code(node, name, inputs, outputs, sub)\n+\n+        # give sensible names to inputs and outputs\n+        inp, scale, bias, est_mean, est_var = inputs\n+        outp, = outputs\n+\n+        # set input tensor descriptors from input tensors\n+        result += c_set_tensor4d(inp, 'bn_input_' + name, 'err' + name, sub['fail'])\n+        result += c_set_tensor4d(scale, 'bn_params_' + name, 'err' + name, sub['fail'])\n+\n+        # build and prepare the output variable\n+        result += \"\"\"\n+if (CudaNdarray_prep_output(&%(outp)s, 4, CudaNdarray_HOST_DIMS(%(inp)s)) != 0)\n+{\n+    %(fail)s\n+}\n+\"\"\" % dict(outp=outp, inp=inp, fail=sub['fail'])\n+\n+        # set output tensor descriptor from output tensor\n+        result += c_set_tensor4d(outp, 'bn_output_' + name, 'err' + name, sub['fail'])\n+\n+        # call cuDNN function\n+        result += \"\"\"\n+{\n+const float alpha = 1.;\n+const float beta = 0.;\n+err%(name)s = cudnnBatchNormalizationForwardInference(\n+  _handle,\n+  mode%(name)s,\n+  (void*) &alpha,\n+  (void*) &beta,\n+  bn_input_%(name)s,\n+  CudaNdarray_DEV_DATA(%(inp)s),\n+  bn_output_%(name)s,\n+  CudaNdarray_DEV_DATA(%(outp)s),\n+  bn_params_%(name)s,\n+  CudaNdarray_DEV_DATA(%(scale)s),\n+  CudaNdarray_DEV_DATA(%(bias)s),\n+  CudaNdarray_DEV_DATA(%(est_mean)s),\n+  CudaNdarray_DEV_DATA(%(est_var)s),\n+  epsilon%(name)s\n+);\n+}\n+\"\"\" % dict(name=name, inp=inp, scale=scale, bias=bias, est_mean=est_mean,\n+           est_var=est_var, outp=outp)\n+\n+        return result\n+\n+    def grad(self, inputs, grads):\n+        x, scale, bias, est_mean, est_var = inputs\n+        dy = grads[0]\n+\n+        # add necessary broadcasts\n+        if self.mode == 'per-activation':\n+            axes = (0,)\n+        elif self.mode == 'spatial':\n+            axes = (0, 2, 3)\n+        scale, bias, est_mean, est_var = (theano.tensor.addbroadcast(t, *axes)\n+                                          for t in (scale, bias, est_mean, est_var))\n+\n+        # define helper expressions\n+        est_var_eps = est_var + self.epsilon\n+        est_std = theano.tensor.sqrt(est_var_eps)\n+        two = theano.tensor.constant(2.)\n+\n+        # define and return gradients\n+        dx = dy * (scale / est_std)\n+        dscale = (dy * (x - est_mean)).sum(axes, keepdims=True) / est_std\n+        dbias = dy.sum(axes, keepdims=True)\n+        dmean = -dy.sum(axes, keepdims=True) * (scale / est_std)\n+        dvar = -(dy * (x - est_mean)).sum(axes, keepdims=True) * (scale / (two * est_var_eps * est_std))","path":"theano/sandbox/cuda/dnn.py","position":272,"original_position":185,"commit_id":"e3a75697fc6d4c8bdee8d4709b36c0243c4706e8","original_commit_id":"d63f5ee32aa10369eba3dbd4c266b7b833b70d26","user":{"login":"f0k","id":629706,"avatar_url":"https://avatars.githubusercontent.com/u/629706?v=3","gravatar_id":"","url":"https://api.github.com/users/f0k","html_url":"https://github.com/f0k","followers_url":"https://api.github.com/users/f0k/followers","following_url":"https://api.github.com/users/f0k/following{/other_user}","gists_url":"https://api.github.com/users/f0k/gists{/gist_id}","starred_url":"https://api.github.com/users/f0k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/f0k/subscriptions","organizations_url":"https://api.github.com/users/f0k/orgs","repos_url":"https://api.github.com/users/f0k/repos","events_url":"https://api.github.com/users/f0k/events{/privacy}","received_events_url":"https://api.github.com/users/f0k/received_events","type":"User","site_admin":false},"body":"Because GpuDnnBatchNormGrad assumes the mean and variance are x.mean() and x.var(). It cannot separate out the gradients wrt. x, mean, and variance.","created_at":"2016-06-14T11:43:08Z","updated_at":"2016-06-14T11:43:08Z","html_url":"https://github.com/Theano/Theano/pull/4582#discussion_r66953803","pull_request_url":"https://api.github.com/repos/Theano/Theano/pulls/4582","_links":{"self":{"href":"https://api.github.com/repos/Theano/Theano/pulls/comments/66953803"},"html":{"href":"https://github.com/Theano/Theano/pull/4582#discussion_r66953803"},"pull_request":{"href":"https://api.github.com/repos/Theano/Theano/pulls/4582"}}},"pull_request":{"url":"https://api.github.com/repos/Theano/Theano/pulls/4582","id":72540188,"html_url":"https://github.com/Theano/Theano/pull/4582","diff_url":"https://github.com/Theano/Theano/pull/4582.diff","patch_url":"https://github.com/Theano/Theano/pull/4582.patch","issue_url":"https://api.github.com/repos/Theano/Theano/issues/4582","number":4582,"state":"open","locked":false,"title":"cuDNN v5 Batch Normalization","user":{"login":"f0k","id":629706,"avatar_url":"https://avatars.githubusercontent.com/u/629706?v=3","gravatar_id":"","url":"https://api.github.com/users/f0k","html_url":"https://github.com/f0k","followers_url":"https://api.github.com/users/f0k/followers","following_url":"https://api.github.com/users/f0k/following{/other_user}","gists_url":"https://api.github.com/users/f0k/gists{/gist_id}","starred_url":"https://api.github.com/users/f0k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/f0k/subscriptions","organizations_url":"https://api.github.com/users/f0k/orgs","repos_url":"https://api.github.com/users/f0k/repos","events_url":"https://api.github.com/users/f0k/events{/privacy}","received_events_url":"https://api.github.com/users/f0k/received_events","type":"User","site_admin":false},"body":"Follow-up of #4237. Took the patch by @lachlants (https://github.com/Theano/Theano/pull/4237#issuecomment-223466380) and cleaned up / rewrote most of the code so I could understand what it was doing. I guess it was originally derived from the softmax Ops, using `if`s in the base class were inheritance would have made it much easier (so I changed it accordingly).\r\n\r\nAs per @lachlants idea, this does not cope with updating the running average statistics in the training forward pass, but just hands out the current mini-batch statistics so the user can do whatever she or he pleases. This makes it much easier for the initial version.\r\n\r\nStill misses tests, but I've written a small test script to verify that it does the correct thing for all three Ops (will still add tests, of course). Also misses a convenience function. I'd prefer to leave inplace optimizations for future PRs, as well as extending it to support 5d tensors.\r\n\r\nTODO:\r\n* [x] add tests\r\n* [x] add convenience function for inference and training (support 1d to 3d tensors as well)\r\n* [x] add grad() method to inference Op","created_at":"2016-06-03T17:17:11Z","updated_at":"2016-06-14T11:43:08Z","closed_at":null,"merged_at":null,"merge_commit_sha":"2238e57c834953a2a2360bd4cdcd0efeafe673fc","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/Theano/Theano/pulls/4582/commits","review_comments_url":"https://api.github.com/repos/Theano/Theano/pulls/4582/comments","review_comment_url":"https://api.github.com/repos/Theano/Theano/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Theano/Theano/issues/4582/comments","statuses_url":"https://api.github.com/repos/Theano/Theano/statuses/e3a75697fc6d4c8bdee8d4709b36c0243c4706e8","head":{"label":"f0k:dnnbatchnorm","ref":"dnnbatchnorm","sha":"e3a75697fc6d4c8bdee8d4709b36c0243c4706e8","user":{"login":"f0k","id":629706,"avatar_url":"https://avatars.githubusercontent.com/u/629706?v=3","gravatar_id":"","url":"https://api.github.com/users/f0k","html_url":"https://github.com/f0k","followers_url":"https://api.github.com/users/f0k/followers","following_url":"https://api.github.com/users/f0k/following{/other_user}","gists_url":"https://api.github.com/users/f0k/gists{/gist_id}","starred_url":"https://api.github.com/users/f0k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/f0k/subscriptions","organizations_url":"https://api.github.com/users/f0k/orgs","repos_url":"https://api.github.com/users/f0k/repos","events_url":"https://api.github.com/users/f0k/events{/privacy}","received_events_url":"https://api.github.com/users/f0k/received_events","type":"User","site_admin":false},"repo":{"id":9244648,"name":"Theano","full_name":"f0k/Theano","owner":{"login":"f0k","id":629706,"avatar_url":"https://avatars.githubusercontent.com/u/629706?v=3","gravatar_id":"","url":"https://api.github.com/users/f0k","html_url":"https://github.com/f0k","followers_url":"https://api.github.com/users/f0k/followers","following_url":"https://api.github.com/users/f0k/following{/other_user}","gists_url":"https://api.github.com/users/f0k/gists{/gist_id}","starred_url":"https://api.github.com/users/f0k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/f0k/subscriptions","organizations_url":"https://api.github.com/users/f0k/orgs","repos_url":"https://api.github.com/users/f0k/repos","events_url":"https://api.github.com/users/f0k/events{/privacy}","received_events_url":"https://api.github.com/users/f0k/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/f0k/Theano","description":"Optimizing GPU-meta-programming code generating array oriented optimizing math compiler in Python","fork":true,"url":"https://api.github.com/repos/f0k/Theano","forks_url":"https://api.github.com/repos/f0k/Theano/forks","keys_url":"https://api.github.com/repos/f0k/Theano/keys{/key_id}","collaborators_url":"https://api.github.com/repos/f0k/Theano/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/f0k/Theano/teams","hooks_url":"https://api.github.com/repos/f0k/Theano/hooks","issue_events_url":"https://api.github.com/repos/f0k/Theano/issues/events{/number}","events_url":"https://api.github.com/repos/f0k/Theano/events","assignees_url":"https://api.github.com/repos/f0k/Theano/assignees{/user}","branches_url":"https://api.github.com/repos/f0k/Theano/branches{/branch}","tags_url":"https://api.github.com/repos/f0k/Theano/tags","blobs_url":"https://api.github.com/repos/f0k/Theano/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/f0k/Theano/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/f0k/Theano/git/refs{/sha}","trees_url":"https://api.github.com/repos/f0k/Theano/git/trees{/sha}","statuses_url":"https://api.github.com/repos/f0k/Theano/statuses/{sha}","languages_url":"https://api.github.com/repos/f0k/Theano/languages","stargazers_url":"https://api.github.com/repos/f0k/Theano/stargazers","contributors_url":"https://api.github.com/repos/f0k/Theano/contributors","subscribers_url":"https://api.github.com/repos/f0k/Theano/subscribers","subscription_url":"https://api.github.com/repos/f0k/Theano/subscription","commits_url":"https://api.github.com/repos/f0k/Theano/commits{/sha}","git_commits_url":"https://api.github.com/repos/f0k/Theano/git/commits{/sha}","comments_url":"https://api.github.com/repos/f0k/Theano/comments{/number}","issue_comment_url":"https://api.github.com/repos/f0k/Theano/issues/comments{/number}","contents_url":"https://api.github.com/repos/f0k/Theano/contents/{+path}","compare_url":"https://api.github.com/repos/f0k/Theano/compare/{base}...{head}","merges_url":"https://api.github.com/repos/f0k/Theano/merges","archive_url":"https://api.github.com/repos/f0k/Theano/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/f0k/Theano/downloads","issues_url":"https://api.github.com/repos/f0k/Theano/issues{/number}","pulls_url":"https://api.github.com/repos/f0k/Theano/pulls{/number}","milestones_url":"https://api.github.com/repos/f0k/Theano/milestones{/number}","notifications_url":"https://api.github.com/repos/f0k/Theano/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/f0k/Theano/labels{/name}","releases_url":"https://api.github.com/repos/f0k/Theano/releases{/id}","deployments_url":"https://api.github.com/repos/f0k/Theano/deployments","created_at":"2013-04-05T15:52:31Z","updated_at":"2014-06-06T16:11:50Z","pushed_at":"2016-06-07T15:00:29Z","git_url":"git://github.com/f0k/Theano.git","ssh_url":"git@github.com:f0k/Theano.git","clone_url":"https://github.com/f0k/Theano.git","svn_url":"https://github.com/f0k/Theano","homepage":"http://www.deeplearning.net/software/theano","size":52870,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"Theano:master","ref":"master","sha":"7176a3d1dee4f290ce7e34b2fcdde53bfb7c131a","user":{"login":"Theano","id":970517,"avatar_url":"https://avatars.githubusercontent.com/u/970517?v=3","gravatar_id":"","url":"https://api.github.com/users/Theano","html_url":"https://github.com/Theano","followers_url":"https://api.github.com/users/Theano/followers","following_url":"https://api.github.com/users/Theano/following{/other_user}","gists_url":"https://api.github.com/users/Theano/gists{/gist_id}","starred_url":"https://api.github.com/users/Theano/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Theano/subscriptions","organizations_url":"https://api.github.com/users/Theano/orgs","repos_url":"https://api.github.com/users/Theano/repos","events_url":"https://api.github.com/users/Theano/events{/privacy}","received_events_url":"https://api.github.com/users/Theano/received_events","type":"Organization","site_admin":false},"repo":{"id":2183193,"name":"Theano","full_name":"Theano/Theano","owner":{"login":"Theano","id":970517,"avatar_url":"https://avatars.githubusercontent.com/u/970517?v=3","gravatar_id":"","url":"https://api.github.com/users/Theano","html_url":"https://github.com/Theano","followers_url":"https://api.github.com/users/Theano/followers","following_url":"https://api.github.com/users/Theano/following{/other_user}","gists_url":"https://api.github.com/users/Theano/gists{/gist_id}","starred_url":"https://api.github.com/users/Theano/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Theano/subscriptions","organizations_url":"https://api.github.com/users/Theano/orgs","repos_url":"https://api.github.com/users/Theano/repos","events_url":"https://api.github.com/users/Theano/events{/privacy}","received_events_url":"https://api.github.com/users/Theano/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Theano/Theano","description":"Theano is a Python library that allows you to define, optimize, and evaluate mathematical expressions involving multi-dimensional arrays efficiently. It can use GPUs and perform efficient symbolic differentiation.","fork":false,"url":"https://api.github.com/repos/Theano/Theano","forks_url":"https://api.github.com/repos/Theano/Theano/forks","keys_url":"https://api.github.com/repos/Theano/Theano/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Theano/Theano/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Theano/Theano/teams","hooks_url":"https://api.github.com/repos/Theano/Theano/hooks","issue_events_url":"https://api.github.com/repos/Theano/Theano/issues/events{/number}","events_url":"https://api.github.com/repos/Theano/Theano/events","assignees_url":"https://api.github.com/repos/Theano/Theano/assignees{/user}","branches_url":"https://api.github.com/repos/Theano/Theano/branches{/branch}","tags_url":"https://api.github.com/repos/Theano/Theano/tags","blobs_url":"https://api.github.com/repos/Theano/Theano/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Theano/Theano/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Theano/Theano/git/refs{/sha}","trees_url":"https://api.github.com/repos/Theano/Theano/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Theano/Theano/statuses/{sha}","languages_url":"https://api.github.com/repos/Theano/Theano/languages","stargazers_url":"https://api.github.com/repos/Theano/Theano/stargazers","contributors_url":"https://api.github.com/repos/Theano/Theano/contributors","subscribers_url":"https://api.github.com/repos/Theano/Theano/subscribers","subscription_url":"https://api.github.com/repos/Theano/Theano/subscription","commits_url":"https://api.github.com/repos/Theano/Theano/commits{/sha}","git_commits_url":"https://api.github.com/repos/Theano/Theano/git/commits{/sha}","comments_url":"https://api.github.com/repos/Theano/Theano/comments{/number}","issue_comment_url":"https://api.github.com/repos/Theano/Theano/issues/comments{/number}","contents_url":"https://api.github.com/repos/Theano/Theano/contents/{+path}","compare_url":"https://api.github.com/repos/Theano/Theano/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Theano/Theano/merges","archive_url":"https://api.github.com/repos/Theano/Theano/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Theano/Theano/downloads","issues_url":"https://api.github.com/repos/Theano/Theano/issues{/number}","pulls_url":"https://api.github.com/repos/Theano/Theano/pulls{/number}","milestones_url":"https://api.github.com/repos/Theano/Theano/milestones{/number}","notifications_url":"https://api.github.com/repos/Theano/Theano/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Theano/Theano/labels{/name}","releases_url":"https://api.github.com/repos/Theano/Theano/releases{/id}","deployments_url":"https://api.github.com/repos/Theano/Theano/deployments","created_at":"2011-08-10T03:48:06Z","updated_at":"2016-06-14T10:49:24Z","pushed_at":"2016-06-14T08:45:31Z","git_url":"git://github.com/Theano/Theano.git","ssh_url":"git@github.com:Theano/Theano.git","clone_url":"https://github.com/Theano/Theano.git","svn_url":"https://github.com/Theano/Theano","homepage":"http://www.deeplearning.net/software/theano","size":74483,"stargazers_count":3931,"watchers_count":3931,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1426,"mirror_url":null,"open_issues_count":680,"forks":1426,"open_issues":680,"watchers":3931,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Theano/Theano/pulls/4582"},"html":{"href":"https://github.com/Theano/Theano/pull/4582"},"issue":{"href":"https://api.github.com/repos/Theano/Theano/issues/4582"},"comments":{"href":"https://api.github.com/repos/Theano/Theano/issues/4582/comments"},"review_comments":{"href":"https://api.github.com/repos/Theano/Theano/pulls/4582/comments"},"review_comment":{"href":"https://api.github.com/repos/Theano/Theano/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Theano/Theano/pulls/4582/commits"},"statuses":{"href":"https://api.github.com/repos/Theano/Theano/statuses/e3a75697fc6d4c8bdee8d4709b36c0243c4706e8"}}}}
{"actor":{"display_login":"f0k"}}