{"action":"created","comment":{"url":"https://api.github.com/repos/onnx/onnx/pulls/comments/148975851","pull_request_review_id":74298935,"id":148975851,"diff_hunk":"@@ -5,124 +5,311 @@\n \n using AttrType = onnx::OpSchema::AttrType;\n \n-// CuDNN parameters not included yet:\n-// - dropout (as we primarily target inference)\n-// Description below is borrowed from CuDNN and TensorRT docs\n+OPERATOR_SCHEMA(SimpleRNN)\n+    .NumInputs(3, 6)\n+    .NumOutputs(1, 2)\n+    .SetDoc(R\"DOC(\n+Computes an one-layer simple RNN. This operator is usually supported\n+via some custom implementation such as CuDNN.\n+\n+Notations:\n+`X` - input tensor\n+`i` - input gate\n+`t` - time step (t-1 means previous time step)\n+`Wi` - W parameter weight matrix for input gate\n+`Ri` - R recurrence weight matrix for input gate\n+`Wbi` - W parameter bias vector for input gate\n+`Rbi` - R parameter bias vector for input gate\n+`ReLU(X)` - max(X, 0)\n+`tanh(X)` - hyperbolic tangent of X\n+`H` - Hidden state\n+\n+Equations:\n+  - Ht = Activation(Wi*Xt + Ri*Ht-1 + Wbi + Rbi)\n+)DOC\")\n+    .Attr(\"activation\", \"The activation function for input gate. Typical \"\n+\t  \"activation functions are tanh and ReLU. Default `tanh`.\",\n+          AttrType::STRING)\n+    .Attr(\"hidden_size\", \"Number of neurons in the hidden layer\", AttrType::INT)\n+    .Attr(\"reverse\", \"Process the sequences in reverse order, default 0.\",\n+          AttrType::INT)\n+    .Attr(\"clip\", \"Cell clip threshold. Clipping bounds the elements of a tensor \"\n+          \"in the range of [-threshold, +threshold] and is applied to the input \"\n+          \"of activations. No clip if not specified.\",\n+          AttrType::FLOAT)\n+    .Input(0, \"input\",\n+           \"The input sequences packed (and potentially padded) into one 3-D \"\n+           \"tensor with the shape of `[seq_length, batch_size, input_size]`.\")\n+    .Input(1, \"W\", \n+\t   \"The weight tensor for input gate. The tensor has shape \"\n+\t   \"`[hidden_size, input_size]`.\")\n+    .Input(2, \"R\",\n+\t   \"The recurrence weight tensor. The tensor has shape \"\n+\t   \"`[hidden_size, hidden_size}`.\")\n+    .Input(3, \"B\",\n+\t   \"The bias tensor for input gate. The tensor is a concatenation of\"\n+\t   \"`Wbi` and `Rbi`, and has shape `[2*hidden_size]`, Optional: If not \"\n+\t   \"specified - assumed to be 0.\",\n+\t   true /*optional*/)\n+    .Input(4, \"initial_h\",\n+\t   \"Optional initial value of the hidden. If not specified - assumed \"\n+\t   \"to be 0. It has shape `[batch_size, hidden_size]`.\",\n+\t   true /*optional*/)\t   \n+    .Input(5, \"seq_lens\",\n+           \"Optional tensor specifying lengths of the sequences in a batch. \"\n+           \"If not specified - assumed all sequences in the batch to have \"\n+\t   \"length `seq_length`. It has shape `[batch_size]`.\",\n+\t   true /*optional*/)\t   \n+    .Output(0, \"output\",\n+\t    \"A tensor that concats all the intermediate output values of the \"\n+\t    \"hidden. It has shape `[seq_length, batch_size, hidden_size]`.\")\n+    .Output(1, \"output_h\",\n+            \"The last output value of the hidden. It has shape \"\n+\t    \"`[batch_size, hidden_size]`.\");\n \n-OPERATOR_SCHEMA(OptimizedRNN)\n-    .NumInputs(2, 4)\n-    .NumOutputs(1, 3)\n+\n+OPERATOR_SCHEMA(GRU)\n+    .NumInputs(3, 6)\n+    .NumOutputs(1, 2)\n     .SetDoc(R\"DOC(\n-Computes a stack of several RNNs in optimized fashion. This operator is usually\n-implemented via CuDNN and thus most of the attributes and weights layout matches\n-directly.\n+Computes an one-layer GRU. This operator is usually supported via some custom\n+implementation such as CuDNN.\n+\n+Notations:\n+`X` - input tensor\n+`z` - update gate\n+`r` - reset gate\n+`h` - hidden gate\n+`t` - time step (t-1 means previous time step)\n+`W[zrh]` - W parameter weight matrix for update, reset, and hidden gates\n+`R[zrh]` - R recurrence weight matrix for update, reset, and hidden gates\n+`Wb[zrh]` - W bias vectors for update, reset, and hidden gates\n+`Rb[zrh]` - R bias vectors for update, reset, and hidden gates\n+`tanh(X)` - hyperbolic tangent of X\n+`sigmoid(X)` - 1 / (1 + e^-X)\n+`H` - Hidden state\n+\n+Equations (GRU with default activations):\n+  - zt = sigmoid(Wz*Xt + Rz*Ht-1 + Wbz + Rbz)\n+  - rt = sigmoid(Wr*Xt + Rr*Ht-1 + Wbr + Rbr)\n+  - ht = tanh(Wh*Xt + rt*(Rh*Ht-1 + Rbh) + Wbh)\n+  - H = (1 - zt) (.) ht + it (.) Ht-1\n )DOC\")\n-    .Attr(\"cell_type\", R\"DOC(\n-Types of the cell: `relu`, `tanh`, `gru`, `lstm`\n+    .Attr(\"activations\", \"A list of 3 activation functions for update, reset, and \"\n+\t  \"hidden gates. Typical activation functions are sigmoid and tanh. See the \"\n+\t  \"equations for default if not specified.\",\n+          AttrType::STRINGS)\n+    .Attr(\"hidden_size\", \"Number of neurons in the hidden layer\", AttrType::INT)\n+    .Attr(\"reverse\", \"Process the sequences in reverse order if 1, default 0.\",\n+          AttrType::INT)\n+    .Attr(\"clip\", \"Cell clip threshold. Clipping bounds the elements of a tensor \"\n+          \"in the range of [-threshold, +threshold] and is applied to the input \"\n+          \"of activations. No clip if not specified.\",\n+          AttrType::FLOAT)\n+    .Input(0, \"input\",\n+           \"The input sequences packed (and potentially padded) into one 3-D \"\n+           \"tensor with the shape of `[seq_length, batch_size, input_size]`.\")\n+    .Input(1, \"W\",\n+\t   \"The weight tensor for the gates. The weights W[zrh] are \"\n+\t   \"concatenated along dimension 0. This tensor has shape \"\n+\t   \"`[3 * hidden_size, input_size]`.\")\n+    .Input(2, \"R\",\n+\t   \"The recurrence weight tensor. The recurrence weights R[zrh] are \"\n+\t   \"concatenated along dimension 0. This tensor has shape \"\n+\t   \"`[3 * hidden_size, hidden_size}`.\")\n+    .Input(3, \"B\",\n+\t   \"The bias tensor for the gates. The biases Wb[zrh] and Rb[zrh] are \"\n+\t   \"concatenated along dimension 0. This tensor has shape \"\n+\t   \"`[6 * hidden_size]`. Optional: If not specified - assumed to be 0\",\n+\t   true /*optional*/)\n+    .Input(4, \"initial_h\",\n+\t   \"Optional initial value of the hidden. If not specified - assumed \"\n+\t   \"to be 0. It has shape `[batch_size, hidden_size]`.\",\n+\t   true /*optional*/)\n+    .Input(5, \"seq_lens\",\n+           \"Optional tensor specifying lengths of the sequences in a batch. \"\n+           \"If not specified - assumed all sequences in the batch to have \"\n+\t   \"length `seq_length`. It has shape `[batch_size]`.\",\n+\t   true /*optional*/)\n+    .Output(0, \"output\",\n+\t    \"A tensor that concats all the intermediate output values of the \"\n+\t    \"hidden. It has shape `[seq_length, batch_size, hidden_size]`.\")\t    \n+    .Output(1, \"output_h\",\n+            \"The last output value of the hidden. It has shape \"\n+\t    \"`[batch_size, hidden_size]`.\");\n+\n \n-Equation definitions:\n+OPERATOR_SCHEMA(LSTM)\n+    .NumInputs(3, 8)\n+    .NumOutputs(1, 2)\n+    .SetDoc(R\"DOC(\n+Computes an one-layer LSTM. This operator is usually supported via some\n+custom implementation such as CuDNN.\n+\n+Notations:\n+`X` - input tensor\n `i` - input gate\n `o` - output gate\n `f` - forget gate\n-`z` - update gate\n-`r` - reset gate\n `c` - cell gate\n-`h` - hidden gate\n `t` - time step (t-1 means previous time step)\n-`Xi` - input tensor\n-`W[izrfcoh]` - W parameter weight matrices for the corresponding gates\n-`R[izrfcoh]` - R parameter weight matrices for the corresponding gates\n-`Wb[izrfcoh]` - W parameter bias vectors for the corresponding gates\n-`Rb[izrfcoh]` - R parameter bias vectors for the corresponding gates\n-`ReLU(X)` - max(X, 0)\n-`tanh` - hyperbolic tangent of X\n+`W[iofc]` - W parameter weight matrix for input, output, forget, and cell gates\n+`R[iofc]` - R recurrence weight matrix for input, output, forget, and cell gates\n+`Wb[iofc]` - W bias vectors for input, output, forget, and cell gates\n+`Rb[iofc]` - R bias vectors for input, output, forget, and cell gates\n+`P[iof]`  - P peephole weight matrix for input, output, and forget gates\n+`tanh(X)` - hyperbolic tangent of X\n `sigmoid(X)` - 1 / (1 + e^-X)\n-`[C|H]` - Cell/Hidden state\n-\n-- Equations:\n-  `relu`\n-  - Ht = ReLU(Wi*Xt + Ri*Ht-1 + Wbi + Rbi)\n-  `tanh`\n-  - Ht = tanh(Wi*Xt + Ri*Ht-1 + Wbi + Rbi)\n-  `lstm`\n+`H` - Hidden state\n+\n+Equations (LSTM with default activations):\n   - it = sigmoid(Wi*Xt + Ri*Ht-1 + Wbi + Rbi)\n   - ft = sigmoid(Wf*Xt + Rf*Ht-1 + Wbf + Rbf)\n   - ot = sigmoid(Wo*Xt + Ro*Ht-1 + Wbo + Rbo)\n   - ct = tanh(Wc*Xt + Rc*Ht-1 + Wbc + Rbc)\n-  - C = ft * Ct-1 + it * ct\n-  - H = ot * tanh(C)\n-  `gru`\n-  - zt = sigmoid(Wz*Xt + Rz*Ht-1 + Wbz + Rbz)\n-  - rt = sigmoid(Wr*Xt + Rr*Ht-1 + Wbr + Rbr)\n-  - ht = tanh(Wh*Xt + rt *(Rh*Ht-1 + Rbh) + Wbh)\n-  - H = (1 - zt) * ht + it * Ht-1\n-\n-Note, that for LSTM and 2 out of 3 gates for GRU, there are duplicate biases for\n-the gates (model is overparametrized). It follows CuDNN/TensorRT convention and\n-allows to make spec more uniform.\n-)DOC\", AttrType::STRING, true)\n-    .Attr(\"directions\",\n-          \"Number of directions: 1 for unidirectional (default) and 2 for \"\n-          \"bidirectional\",\n-          AttrType::INT)\n-    .Attr(\"skip_input_transform\",\n-          \"If set, skips linear transformation on the input of the first layer\",\n-          AttrType::INT)\n-    .Attr(\"num_layers\", \"Numbers of RNN layers in the stack, default 1\",\n-          AttrType::INT)\n+  - Ct = ft (.) Ct-1 + it (.) ct\n+  - H = ot (.) tanh(Ct)\n+)DOC\")\n+    .Attr(\"activations\", \"A list of 4 activation functions for input, output, \"\n+\t  \"forget, and cell gates. Typical activation functions are sigmoid \"\n+\t  \"and tanh. See the equations for default if not specified\",\n+          AttrType::STRINGS)\n     .Attr(\"hidden_size\", \"Number of neurons in the hidden layer\", AttrType::INT)\n-    .Input(0, \"weights\", R\"DOC(\n-All parameters of the stack packed together in the opaque tensor. The size must\n-be compatible with input attributes passed to the op.\n-\n-The layout format is the one used by CuDNN and very similar to TensorRT:\n-\n-The weight structure holds weights and biases for each layer of the network.\n-Each parameter matrix is linearly appended after the previous parameter matrix\n-without padding.\n-\n-The order of matrixes `{K, L, D, R, N, C}` is defined as:\n- - K - type of the matrix: `weight` (first) or `bias` second\n- - L - The number of layers in the RNN - `num_layers`\n- - D - The direction of the layer: normal (first) or reverse (second).\n-                                   (in case of `directions=2`)\n- - R - The type of the connection: `input-hidden` (first) or\n-                                   `hidden-hidden` (second)\n- - N - The number of gates matrices in the RNN, dependent on the `cell_type`:\n- -- For `relu` or `tanh` there is one gate\n- -- For `gru` there are 3 gates ordered as `reset`, `update`, `hidden`\n- -- For `lstm` there are 4 gates ordered as `input`, `forget`, `cell`, `output`\n- - C - The size of each matrix, which varies.\n- -- If the linear layer on the input is skipped (`skip_input_transform=1`)\n-    and then for the first layer (`L=1`) the weight matrix (`K=weight`)\n-    on the input connection (`R=input-hidden`) is skipped,\n-    i.e. has 0 parameters in the list\n- -- For the first layer (`L=1`) weight matrix (`K=weight`) on input connection\n-    (`R=input-hidden`), dimensions are `{hidden_size, input_size}`\n- -- For other layers (`L>1`) weight matrix (`K=weight`) on input connection\n-    (`R=input-hidden`), dimensions are `{hidden_size, directions * hidden_size}`\n- -- For weight matrix (`K=weight`) on recurrent connection (`R=hidden-hidden`),\n-    dimensions are `{hidden_size, hidden_size}`\n- -- For all biases (`K=bias`), dimensions are `{hidden_size}`\n+    .Attr(\"reverse\", \"Process the sequences in reverse order if 1, default 0.\",\n+          AttrType::INT)\n+    .Attr(\"input_forget\", \"Couple the input and forget gates if 1, default 0.\",\n+          AttrType::INT)\t  \n+    .Attr(\"clip\", \"Cell clip threshold. Clipping bounds the elements of a tensor \"","path":"onnx/defs/rnn/defs.cc","position":null,"original_position":262,"commit_id":"583b014b25518d4ec76e1683a58a3cccb0de1f05","original_commit_id":"d21ab5422332df180ab575a641556678a33a01cf","user":{"login":"yuanbyu","id":2342391,"avatar_url":"https://avatars1.githubusercontent.com/u/2342391?v=4","gravatar_id":"","url":"https://api.github.com/users/yuanbyu","html_url":"https://github.com/yuanbyu","followers_url":"https://api.github.com/users/yuanbyu/followers","following_url":"https://api.github.com/users/yuanbyu/following{/other_user}","gists_url":"https://api.github.com/users/yuanbyu/gists{/gist_id}","starred_url":"https://api.github.com/users/yuanbyu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yuanbyu/subscriptions","organizations_url":"https://api.github.com/users/yuanbyu/orgs","repos_url":"https://api.github.com/users/yuanbyu/repos","events_url":"https://api.github.com/users/yuanbyu/events{/privacy}","received_events_url":"https://api.github.com/users/yuanbyu/received_events","type":"User","site_admin":false},"body":"Good point. Done.","created_at":"2017-11-05T23:49:47Z","updated_at":"2017-11-05T23:49:47Z","html_url":"https://github.com/onnx/onnx/pull/149#discussion_r148975851","pull_request_url":"https://api.github.com/repos/onnx/onnx/pulls/149","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/onnx/onnx/pulls/comments/148975851"},"html":{"href":"https://github.com/onnx/onnx/pull/149#discussion_r148975851"},"pull_request":{"href":"https://api.github.com/repos/onnx/onnx/pulls/149"}},"in_reply_to_id":148911020},"pull_request":{"url":"https://api.github.com/repos/onnx/onnx/pulls/149","id":149042927,"html_url":"https://github.com/onnx/onnx/pull/149","diff_url":"https://github.com/onnx/onnx/pull/149.diff","patch_url":"https://github.com/onnx/onnx/pull/149.patch","issue_url":"https://api.github.com/repos/onnx/onnx/issues/149","number":149,"state":"open","locked":false,"title":"Added more functionalities to OptimizedRNN operator","user":{"login":"yuanbyu","id":2342391,"avatar_url":"https://avatars1.githubusercontent.com/u/2342391?v=4","gravatar_id":"","url":"https://api.github.com/users/yuanbyu","html_url":"https://github.com/yuanbyu","followers_url":"https://api.github.com/users/yuanbyu/followers","following_url":"https://api.github.com/users/yuanbyu/following{/other_user}","gists_url":"https://api.github.com/users/yuanbyu/gists{/gist_id}","starred_url":"https://api.github.com/users/yuanbyu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yuanbyu/subscriptions","organizations_url":"https://api.github.com/users/yuanbyu/orgs","repos_url":"https://api.github.com/users/yuanbyu/repos","events_url":"https://api.github.com/users/yuanbyu/events{/privacy}","received_events_url":"https://api.github.com/users/yuanbyu/received_events","type":"User","site_admin":false},"body":"Added two new cell types: \r\n - lstm-peepholes: Do peephole in LSTM. Peephole weight is an additional input.\r\n - lstm-input-forget: Couple the input and forget gates.\r\n\r\nAdded the following attributes:\r\n - activations: A list of activation functions for the gates, so we could customize the activations.\r\n - use_bias: Determine whether to use the bias tensor. Default to true.\r\n - reverse: Reverse the inputs.  Default is false.\r\n - clip: Cell clip threshold. Default to no clip.\r\n\r\nThe weight packing in input 0 seems to be under-specified. For example, in the lstm case, it is unclear how Wi, Wf, Wo, and Wc are packed in the weight tensor. I can try to improve it if I know the layout.","created_at":"2017-10-26T20:53:46Z","updated_at":"2017-11-05T23:49:47Z","closed_at":null,"merged_at":null,"merge_commit_sha":"444e1898aa551054e013f19f3b93211ef270dc98","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/onnx/onnx/pulls/149/commits","review_comments_url":"https://api.github.com/repos/onnx/onnx/pulls/149/comments","review_comment_url":"https://api.github.com/repos/onnx/onnx/pulls/comments{/number}","comments_url":"https://api.github.com/repos/onnx/onnx/issues/149/comments","statuses_url":"https://api.github.com/repos/onnx/onnx/statuses/583b014b25518d4ec76e1683a58a3cccb0de1f05","head":{"label":"onnx:rnn","ref":"rnn","sha":"583b014b25518d4ec76e1683a58a3cccb0de1f05","user":{"login":"onnx","id":31675368,"avatar_url":"https://avatars3.githubusercontent.com/u/31675368?v=4","gravatar_id":"","url":"https://api.github.com/users/onnx","html_url":"https://github.com/onnx","followers_url":"https://api.github.com/users/onnx/followers","following_url":"https://api.github.com/users/onnx/following{/other_user}","gists_url":"https://api.github.com/users/onnx/gists{/gist_id}","starred_url":"https://api.github.com/users/onnx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/onnx/subscriptions","organizations_url":"https://api.github.com/users/onnx/orgs","repos_url":"https://api.github.com/users/onnx/repos","events_url":"https://api.github.com/users/onnx/events{/privacy}","received_events_url":"https://api.github.com/users/onnx/received_events","type":"Organization","site_admin":false},"repo":{"id":102692863,"name":"onnx","full_name":"onnx/onnx","owner":{"login":"onnx","id":31675368,"avatar_url":"https://avatars3.githubusercontent.com/u/31675368?v=4","gravatar_id":"","url":"https://api.github.com/users/onnx","html_url":"https://github.com/onnx","followers_url":"https://api.github.com/users/onnx/followers","following_url":"https://api.github.com/users/onnx/following{/other_user}","gists_url":"https://api.github.com/users/onnx/gists{/gist_id}","starred_url":"https://api.github.com/users/onnx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/onnx/subscriptions","organizations_url":"https://api.github.com/users/onnx/orgs","repos_url":"https://api.github.com/users/onnx/repos","events_url":"https://api.github.com/users/onnx/events{/privacy}","received_events_url":"https://api.github.com/users/onnx/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/onnx/onnx","description":"Open Neural Network Exchange","fork":false,"url":"https://api.github.com/repos/onnx/onnx","forks_url":"https://api.github.com/repos/onnx/onnx/forks","keys_url":"https://api.github.com/repos/onnx/onnx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/onnx/onnx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/onnx/onnx/teams","hooks_url":"https://api.github.com/repos/onnx/onnx/hooks","issue_events_url":"https://api.github.com/repos/onnx/onnx/issues/events{/number}","events_url":"https://api.github.com/repos/onnx/onnx/events","assignees_url":"https://api.github.com/repos/onnx/onnx/assignees{/user}","branches_url":"https://api.github.com/repos/onnx/onnx/branches{/branch}","tags_url":"https://api.github.com/repos/onnx/onnx/tags","blobs_url":"https://api.github.com/repos/onnx/onnx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/onnx/onnx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/onnx/onnx/git/refs{/sha}","trees_url":"https://api.github.com/repos/onnx/onnx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/onnx/onnx/statuses/{sha}","languages_url":"https://api.github.com/repos/onnx/onnx/languages","stargazers_url":"https://api.github.com/repos/onnx/onnx/stargazers","contributors_url":"https://api.github.com/repos/onnx/onnx/contributors","subscribers_url":"https://api.github.com/repos/onnx/onnx/subscribers","subscription_url":"https://api.github.com/repos/onnx/onnx/subscription","commits_url":"https://api.github.com/repos/onnx/onnx/commits{/sha}","git_commits_url":"https://api.github.com/repos/onnx/onnx/git/commits{/sha}","comments_url":"https://api.github.com/repos/onnx/onnx/comments{/number}","issue_comment_url":"https://api.github.com/repos/onnx/onnx/issues/comments{/number}","contents_url":"https://api.github.com/repos/onnx/onnx/contents/{+path}","compare_url":"https://api.github.com/repos/onnx/onnx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/onnx/onnx/merges","archive_url":"https://api.github.com/repos/onnx/onnx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/onnx/onnx/downloads","issues_url":"https://api.github.com/repos/onnx/onnx/issues{/number}","pulls_url":"https://api.github.com/repos/onnx/onnx/pulls{/number}","milestones_url":"https://api.github.com/repos/onnx/onnx/milestones{/number}","notifications_url":"https://api.github.com/repos/onnx/onnx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/onnx/onnx/labels{/name}","releases_url":"https://api.github.com/repos/onnx/onnx/releases{/id}","deployments_url":"https://api.github.com/repos/onnx/onnx/deployments","created_at":"2017-09-07T04:53:45Z","updated_at":"2017-11-05T21:53:05Z","pushed_at":"2017-11-05T23:48:56Z","git_url":"git://github.com/onnx/onnx.git","ssh_url":"git@github.com:onnx/onnx.git","clone_url":"https://github.com/onnx/onnx.git","svn_url":"https://github.com/onnx/onnx","homepage":"https://onnx.ai/","size":578,"stargazers_count":1501,"watchers_count":1501,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":126,"mirror_url":null,"archived":false,"open_issues_count":54,"forks":126,"open_issues":54,"watchers":1501,"default_branch":"master"}},"base":{"label":"onnx:master","ref":"master","sha":"b984c90f6f9166c33d96bcb8cab2c55fc3f06087","user":{"login":"onnx","id":31675368,"avatar_url":"https://avatars3.githubusercontent.com/u/31675368?v=4","gravatar_id":"","url":"https://api.github.com/users/onnx","html_url":"https://github.com/onnx","followers_url":"https://api.github.com/users/onnx/followers","following_url":"https://api.github.com/users/onnx/following{/other_user}","gists_url":"https://api.github.com/users/onnx/gists{/gist_id}","starred_url":"https://api.github.com/users/onnx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/onnx/subscriptions","organizations_url":"https://api.github.com/users/onnx/orgs","repos_url":"https://api.github.com/users/onnx/repos","events_url":"https://api.github.com/users/onnx/events{/privacy}","received_events_url":"https://api.github.com/users/onnx/received_events","type":"Organization","site_admin":false},"repo":{"id":102692863,"name":"onnx","full_name":"onnx/onnx","owner":{"login":"onnx","id":31675368,"avatar_url":"https://avatars3.githubusercontent.com/u/31675368?v=4","gravatar_id":"","url":"https://api.github.com/users/onnx","html_url":"https://github.com/onnx","followers_url":"https://api.github.com/users/onnx/followers","following_url":"https://api.github.com/users/onnx/following{/other_user}","gists_url":"https://api.github.com/users/onnx/gists{/gist_id}","starred_url":"https://api.github.com/users/onnx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/onnx/subscriptions","organizations_url":"https://api.github.com/users/onnx/orgs","repos_url":"https://api.github.com/users/onnx/repos","events_url":"https://api.github.com/users/onnx/events{/privacy}","received_events_url":"https://api.github.com/users/onnx/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/onnx/onnx","description":"Open Neural Network Exchange","fork":false,"url":"https://api.github.com/repos/onnx/onnx","forks_url":"https://api.github.com/repos/onnx/onnx/forks","keys_url":"https://api.github.com/repos/onnx/onnx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/onnx/onnx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/onnx/onnx/teams","hooks_url":"https://api.github.com/repos/onnx/onnx/hooks","issue_events_url":"https://api.github.com/repos/onnx/onnx/issues/events{/number}","events_url":"https://api.github.com/repos/onnx/onnx/events","assignees_url":"https://api.github.com/repos/onnx/onnx/assignees{/user}","branches_url":"https://api.github.com/repos/onnx/onnx/branches{/branch}","tags_url":"https://api.github.com/repos/onnx/onnx/tags","blobs_url":"https://api.github.com/repos/onnx/onnx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/onnx/onnx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/onnx/onnx/git/refs{/sha}","trees_url":"https://api.github.com/repos/onnx/onnx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/onnx/onnx/statuses/{sha}","languages_url":"https://api.github.com/repos/onnx/onnx/languages","stargazers_url":"https://api.github.com/repos/onnx/onnx/stargazers","contributors_url":"https://api.github.com/repos/onnx/onnx/contributors","subscribers_url":"https://api.github.com/repos/onnx/onnx/subscribers","subscription_url":"https://api.github.com/repos/onnx/onnx/subscription","commits_url":"https://api.github.com/repos/onnx/onnx/commits{/sha}","git_commits_url":"https://api.github.com/repos/onnx/onnx/git/commits{/sha}","comments_url":"https://api.github.com/repos/onnx/onnx/comments{/number}","issue_comment_url":"https://api.github.com/repos/onnx/onnx/issues/comments{/number}","contents_url":"https://api.github.com/repos/onnx/onnx/contents/{+path}","compare_url":"https://api.github.com/repos/onnx/onnx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/onnx/onnx/merges","archive_url":"https://api.github.com/repos/onnx/onnx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/onnx/onnx/downloads","issues_url":"https://api.github.com/repos/onnx/onnx/issues{/number}","pulls_url":"https://api.github.com/repos/onnx/onnx/pulls{/number}","milestones_url":"https://api.github.com/repos/onnx/onnx/milestones{/number}","notifications_url":"https://api.github.com/repos/onnx/onnx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/onnx/onnx/labels{/name}","releases_url":"https://api.github.com/repos/onnx/onnx/releases{/id}","deployments_url":"https://api.github.com/repos/onnx/onnx/deployments","created_at":"2017-09-07T04:53:45Z","updated_at":"2017-11-05T21:53:05Z","pushed_at":"2017-11-05T23:48:56Z","git_url":"git://github.com/onnx/onnx.git","ssh_url":"git@github.com:onnx/onnx.git","clone_url":"https://github.com/onnx/onnx.git","svn_url":"https://github.com/onnx/onnx","homepage":"https://onnx.ai/","size":578,"stargazers_count":1501,"watchers_count":1501,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":126,"mirror_url":null,"archived":false,"open_issues_count":54,"forks":126,"open_issues":54,"watchers":1501,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/onnx/onnx/pulls/149"},"html":{"href":"https://github.com/onnx/onnx/pull/149"},"issue":{"href":"https://api.github.com/repos/onnx/onnx/issues/149"},"comments":{"href":"https://api.github.com/repos/onnx/onnx/issues/149/comments"},"review_comments":{"href":"https://api.github.com/repos/onnx/onnx/pulls/149/comments"},"review_comment":{"href":"https://api.github.com/repos/onnx/onnx/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/onnx/onnx/pulls/149/commits"},"statuses":{"href":"https://api.github.com/repos/onnx/onnx/statuses/583b014b25518d4ec76e1683a58a3cccb0de1f05"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"yuanbyu"}}