{"action":"created","comment":{"url":"https://api.github.com/repos/civisanalytics/muffnn/pulls/comments/87857903","pull_request_review_id":8452064,"id":87857903,"diff_hunk":"@@ -0,0 +1,686 @@\n+\"\"\"\n+Autoencoder in scikit-learn style with TensorFlow\n+\"\"\"\n+import logging\n+import re\n+import warnings\n+\n+import numpy as np\n+import tensorflow as tf\n+import scipy.sparse as sp\n+\n+from sklearn.base import TransformerMixin, BaseEstimator\n+from sklearn.utils import check_array, check_random_state\n+from sklearn.utils.validation import NotFittedError\n+\n+from muffnn.core import TFPicklingBase, affine\n+\n+\n+_LOGGER = logging.getLogger(__name__)\n+\n+\n+class Autoencoder(TFPicklingBase, TransformerMixin, BaseEstimator):\n+    \"\"\"\n+    An autoencoder using TensorFlow.\n+\n+    Parameters\n+    ----------\n+    hidden_units : tuple or list, optional\n+        A list of integers indicating the number of hidden layers and their\n+        sizes. The list is reflected about the last element to form the\n+        autoencoder. For example, if hidden_units is (256, 32, 16) then\n+        the autoencoder has layers\n+        [input_layer_size, 256, 32, 16, 32, 256, input_layer_size].\n+    batch_size : int, optional\n+        The batch size for learning and prediction. If there are fewer\n+        examples than the batch size during fitting, then the the number of\n+        examples will be used instead.\n+    n_epochs : int, optional\n+        The number of epochs (iterations through the training data) when\n+        fitting.\n+    dropout : float or None, optional\n+        The dropout probability. If None, then dropout will not be used.\n+        Note that dropout is not applied to the input layer.\n+    hidden_activation : tensorflow graph operation, optional\n+        The activation function for the hidden layers and encoding layer.\n+        See `tensorflow.nn` for various options.\n+    output_activation : tensorflow graph operation, optional\n+        The activation function for the output layer.\n+        See `tensorflow.nn` for various options.\n+        If `metric` is set to 'cross-entropy', then only\n+        `tensorflow.nn.sigmoid` or `tensorflow.nn.softmax` are valid\n+        options.\n+    random_state: int, RandomState instance or None, optional\n+        If int, the random number generator seed. If RandomState instance,\n+        the random number generator itself. If None, then `np.random` will be\n+        used.\n+    learning_rate : float, optional\n+        Learning rate for Adam.\n+    metric : string, optional\n+        Default metric for the autoencoder. Options are\n+            'mse' - mean square error\n+            'cross-entropy' - cross-entropy\n+        Note that this will be overridden for columns specified by\n+        `binary_indices` or `categorical_indices`\n+    binary_indices : array-like, shape (n_binary,), optional\n+        Array of indices for which `tf.nn.sigmoid` will be used for the\n+        output layer activation and cross-entropy will be used in the loss\n+        function.\n+    categorical_indices : array-like, shape (n_categorical, 2), optional\n+        An array where each row specifies a range of indices for a categorical\n+        variable that has been expanded to multiple indices (e.g.,\n+        one-hot encoded).\n+        The first column contains start indices. The second column contains\n+        lengths. For each range of indices, the output layer will use\n+        `tensorflow.nn.softmax` activation and the loss function will use\n+        cross-entropy.\n+\n+    Attributes\n+    ----------\n+    graph_ : tensorflow.python.framework.ops.Graph\n+        The TensorFlow graph for the model.\n+    input_layer_size_ : int\n+        The dimensionality of the input (i.e., number of features).\n+\n+    Methods\n+    -------\n+    fit : Fit the autoencoder.\n+    partial_fit : Update the fit of the autoencoder on a mini-batch.\n+    transform : Encoded input data.\n+    inverse_transform : Decode input data.\n+    score : Return the mean score for input data.\n+    score_samples : Return the score for each element in input data.\n+\n+    Notes\n+    -----\n+    `Adam\n+    <https://www.tensorflow.org/versions/r0.8/api_docs/python/train.html#AdamOptimizer>`\n+    is used for optimization.\n+    Xavier initialization (\n+    `<https://www.tensorflow.org/versions/r0.8/api_docs/python/contrib.layers.html#xavier_initializer>`\n+    ) is used for the weights.\n+    \"\"\"\n+\n+    def __init__(self, hidden_units=(16,), batch_size=128, n_epochs=5,\n+                 dropout=None, hidden_activation=tf.nn.sigmoid,\n+                 output_activation=tf.nn.sigmoid, random_state=None,\n+                 learning_rate=1e-3, metric='mse', binary_indices=None,\n+                 categorical_indices=None):\n+        self.hidden_units = hidden_units\n+        self.batch_size = batch_size\n+        self.n_epochs = n_epochs\n+        self.dropout = dropout\n+        self.hidden_activation = hidden_activation\n+        self.output_activation = output_activation\n+        self.random_state = random_state\n+        self.learning_rate = learning_rate\n+        self.metric = metric\n+        self.binary_indices = binary_indices\n+        self.categorical_indices = categorical_indices\n+\n+    def _set_up_graph(self):\n+        \"\"\"Initialize TF objects (needed before fitting or restoring).\"\"\"\n+\n+        # A placeholder to control dropout for training vs. prediction.\n+        self._dropout = tf.placeholder(dtype=tf.float32,\n+                                       shape=(),\n+                                       name=\"dropout\")\n+\n+        # Input values.\n+        self._input_values = tf.placeholder(tf.float32,\n+                                            [None, self.input_layer_size_],\n+                                            \"input_values\")\n+        t = self._input_values\n+\n+        self._default_msk = tf.placeholder(tf.float32,\n+                                           [None, self.input_layer_size_],\n+                                           \"default_msk\")\n+\n+        self._binary_msk = tf.placeholder(tf.float32,\n+                                          [None, self.input_layer_size_],\n+                                          \"binary_msk\")\n+\n+        self._categorical_msks = tf.placeholder(\n+            tf.float32,\n+            [None, None, self.input_layer_size_],\n+            \"categorical_msks\")\n+\n+        # Fan in layers.\n+        for i, layer_sz in enumerate(self.hidden_units):\n+            # Don't dropout inputs.\n+            if i > 0:","path":"muffnn/autoencoder/autoencoder.py","position":151,"original_position":151,"commit_id":"7dc836c0c15b5bd023f655d738a2212b6cf0c435","original_commit_id":"7dc836c0c15b5bd023f655d738a2212b6cf0c435","user":{"login":"beckermr","id":5296416,"avatar_url":"https://avatars.githubusercontent.com/u/5296416?v=3","gravatar_id":"","url":"https://api.github.com/users/beckermr","html_url":"https://github.com/beckermr","followers_url":"https://api.github.com/users/beckermr/followers","following_url":"https://api.github.com/users/beckermr/following{/other_user}","gists_url":"https://api.github.com/users/beckermr/gists{/gist_id}","starred_url":"https://api.github.com/users/beckermr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/beckermr/subscriptions","organizations_url":"https://api.github.com/users/beckermr/orgs","repos_url":"https://api.github.com/users/beckermr/repos","events_url":"https://api.github.com/users/beckermr/events{/privacy}","received_events_url":"https://api.github.com/users/beckermr/received_events","type":"User","site_admin":false},"body":"On second thought, I don't see the issue with only using dropout on the decoding part. The point here is to avoid overfitting and the idea of rescaling inputs (like one-hot encoded stuff), doesn't make sense to me. Using dropout only in the decoding part seems just fine to me. ","created_at":"2016-11-14T18:09:06Z","updated_at":"2016-11-14T18:09:06Z","html_url":"https://github.com/civisanalytics/muffnn/pull/9#discussion_r87857903","pull_request_url":"https://api.github.com/repos/civisanalytics/muffnn/pulls/9","_links":{"self":{"href":"https://api.github.com/repos/civisanalytics/muffnn/pulls/comments/87857903"},"html":{"href":"https://github.com/civisanalytics/muffnn/pull/9#discussion_r87857903"},"pull_request":{"href":"https://api.github.com/repos/civisanalytics/muffnn/pulls/9"}}},"pull_request":{"url":"https://api.github.com/repos/civisanalytics/muffnn/pulls/9","id":91712207,"html_url":"https://github.com/civisanalytics/muffnn/pull/9","diff_url":"https://github.com/civisanalytics/muffnn/pull/9.diff","patch_url":"https://github.com/civisanalytics/muffnn/pull/9.patch","issue_url":"https://api.github.com/repos/civisanalytics/muffnn/issues/9","number":9,"state":"open","locked":false,"title":"WIP autoencoder","user":{"login":"beckermr","id":5296416,"avatar_url":"https://avatars.githubusercontent.com/u/5296416?v=3","gravatar_id":"","url":"https://api.github.com/users/beckermr","html_url":"https://github.com/beckermr","followers_url":"https://api.github.com/users/beckermr/followers","following_url":"https://api.github.com/users/beckermr/following{/other_user}","gists_url":"https://api.github.com/users/beckermr/gists{/gist_id}","starred_url":"https://api.github.com/users/beckermr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/beckermr/subscriptions","organizations_url":"https://api.github.com/users/beckermr/orgs","repos_url":"https://api.github.com/users/beckermr/repos","events_url":"https://api.github.com/users/beckermr/events{/privacy}","received_events_url":"https://api.github.com/users/beckermr/received_events","type":"User","site_admin":false},"body":"Thus PR adds an autoencoder to muffnn. The autoencoder supports a variety of metrics and is compatible with the scikit-learn transform interface. \r\n\r\nI additionally \r\n\r\n1. refactored the MLP classes into their own subpackage.\r\n2. pinned conda to 4.0.5 to avoid conda bugs\r\n3. upgraded TensorFlow to 0.11.0rc2\r\n\r\nCloses #8 ","created_at":"2016-10-31T23:50:07Z","updated_at":"2016-11-14T18:09:06Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5c48ca23ccc3decc09ae95c0650bab6828970c74","assignee":{"login":"beckermr","id":5296416,"avatar_url":"https://avatars.githubusercontent.com/u/5296416?v=3","gravatar_id":"","url":"https://api.github.com/users/beckermr","html_url":"https://github.com/beckermr","followers_url":"https://api.github.com/users/beckermr/followers","following_url":"https://api.github.com/users/beckermr/following{/other_user}","gists_url":"https://api.github.com/users/beckermr/gists{/gist_id}","starred_url":"https://api.github.com/users/beckermr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/beckermr/subscriptions","organizations_url":"https://api.github.com/users/beckermr/orgs","repos_url":"https://api.github.com/users/beckermr/repos","events_url":"https://api.github.com/users/beckermr/events{/privacy}","received_events_url":"https://api.github.com/users/beckermr/received_events","type":"User","site_admin":false},"assignees":[{"login":"beckermr","id":5296416,"avatar_url":"https://avatars.githubusercontent.com/u/5296416?v=3","gravatar_id":"","url":"https://api.github.com/users/beckermr","html_url":"https://github.com/beckermr","followers_url":"https://api.github.com/users/beckermr/followers","following_url":"https://api.github.com/users/beckermr/following{/other_user}","gists_url":"https://api.github.com/users/beckermr/gists{/gist_id}","starred_url":"https://api.github.com/users/beckermr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/beckermr/subscriptions","organizations_url":"https://api.github.com/users/beckermr/orgs","repos_url":"https://api.github.com/users/beckermr/repos","events_url":"https://api.github.com/users/beckermr/events{/privacy}","received_events_url":"https://api.github.com/users/beckermr/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/civisanalytics/muffnn/pulls/9/commits","review_comments_url":"https://api.github.com/repos/civisanalytics/muffnn/pulls/9/comments","review_comment_url":"https://api.github.com/repos/civisanalytics/muffnn/pulls/comments{/number}","comments_url":"https://api.github.com/repos/civisanalytics/muffnn/issues/9/comments","statuses_url":"https://api.github.com/repos/civisanalytics/muffnn/statuses/7dc836c0c15b5bd023f655d738a2212b6cf0c435","head":{"label":"beckermr:add-ae","ref":"add-ae","sha":"7dc836c0c15b5bd023f655d738a2212b6cf0c435","user":{"login":"beckermr","id":5296416,"avatar_url":"https://avatars.githubusercontent.com/u/5296416?v=3","gravatar_id":"","url":"https://api.github.com/users/beckermr","html_url":"https://github.com/beckermr","followers_url":"https://api.github.com/users/beckermr/followers","following_url":"https://api.github.com/users/beckermr/following{/other_user}","gists_url":"https://api.github.com/users/beckermr/gists{/gist_id}","starred_url":"https://api.github.com/users/beckermr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/beckermr/subscriptions","organizations_url":"https://api.github.com/users/beckermr/orgs","repos_url":"https://api.github.com/users/beckermr/repos","events_url":"https://api.github.com/users/beckermr/events{/privacy}","received_events_url":"https://api.github.com/users/beckermr/received_events","type":"User","site_admin":false},"repo":{"id":71474200,"name":"muffnn","full_name":"beckermr/muffnn","owner":{"login":"beckermr","id":5296416,"avatar_url":"https://avatars.githubusercontent.com/u/5296416?v=3","gravatar_id":"","url":"https://api.github.com/users/beckermr","html_url":"https://github.com/beckermr","followers_url":"https://api.github.com/users/beckermr/followers","following_url":"https://api.github.com/users/beckermr/following{/other_user}","gists_url":"https://api.github.com/users/beckermr/gists{/gist_id}","starred_url":"https://api.github.com/users/beckermr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/beckermr/subscriptions","organizations_url":"https://api.github.com/users/beckermr/orgs","repos_url":"https://api.github.com/users/beckermr/repos","events_url":"https://api.github.com/users/beckermr/events{/privacy}","received_events_url":"https://api.github.com/users/beckermr/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/beckermr/muffnn","description":"Multilayer Feed-Forward Neural Network predictive model implementations with TensorFlow and scikit-learn","fork":true,"url":"https://api.github.com/repos/beckermr/muffnn","forks_url":"https://api.github.com/repos/beckermr/muffnn/forks","keys_url":"https://api.github.com/repos/beckermr/muffnn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/beckermr/muffnn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/beckermr/muffnn/teams","hooks_url":"https://api.github.com/repos/beckermr/muffnn/hooks","issue_events_url":"https://api.github.com/repos/beckermr/muffnn/issues/events{/number}","events_url":"https://api.github.com/repos/beckermr/muffnn/events","assignees_url":"https://api.github.com/repos/beckermr/muffnn/assignees{/user}","branches_url":"https://api.github.com/repos/beckermr/muffnn/branches{/branch}","tags_url":"https://api.github.com/repos/beckermr/muffnn/tags","blobs_url":"https://api.github.com/repos/beckermr/muffnn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/beckermr/muffnn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/beckermr/muffnn/git/refs{/sha}","trees_url":"https://api.github.com/repos/beckermr/muffnn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/beckermr/muffnn/statuses/{sha}","languages_url":"https://api.github.com/repos/beckermr/muffnn/languages","stargazers_url":"https://api.github.com/repos/beckermr/muffnn/stargazers","contributors_url":"https://api.github.com/repos/beckermr/muffnn/contributors","subscribers_url":"https://api.github.com/repos/beckermr/muffnn/subscribers","subscription_url":"https://api.github.com/repos/beckermr/muffnn/subscription","commits_url":"https://api.github.com/repos/beckermr/muffnn/commits{/sha}","git_commits_url":"https://api.github.com/repos/beckermr/muffnn/git/commits{/sha}","comments_url":"https://api.github.com/repos/beckermr/muffnn/comments{/number}","issue_comment_url":"https://api.github.com/repos/beckermr/muffnn/issues/comments{/number}","contents_url":"https://api.github.com/repos/beckermr/muffnn/contents/{+path}","compare_url":"https://api.github.com/repos/beckermr/muffnn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/beckermr/muffnn/merges","archive_url":"https://api.github.com/repos/beckermr/muffnn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/beckermr/muffnn/downloads","issues_url":"https://api.github.com/repos/beckermr/muffnn/issues{/number}","pulls_url":"https://api.github.com/repos/beckermr/muffnn/pulls{/number}","milestones_url":"https://api.github.com/repos/beckermr/muffnn/milestones{/number}","notifications_url":"https://api.github.com/repos/beckermr/muffnn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/beckermr/muffnn/labels{/name}","releases_url":"https://api.github.com/repos/beckermr/muffnn/releases{/id}","deployments_url":"https://api.github.com/repos/beckermr/muffnn/deployments","created_at":"2016-10-20T14:58:49Z","updated_at":"2016-10-20T14:58:50Z","pushed_at":"2016-11-11T15:05:26Z","git_url":"git://github.com/beckermr/muffnn.git","ssh_url":"git@github.com:beckermr/muffnn.git","clone_url":"https://github.com/beckermr/muffnn.git","svn_url":"https://github.com/beckermr/muffnn","homepage":"","size":75,"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":"civisanalytics:master","ref":"master","sha":"902f3f84971b103d4280fded2e12ca3fbee06624","user":{"login":"civisanalytics","id":3299743,"avatar_url":"https://avatars.githubusercontent.com/u/3299743?v=3","gravatar_id":"","url":"https://api.github.com/users/civisanalytics","html_url":"https://github.com/civisanalytics","followers_url":"https://api.github.com/users/civisanalytics/followers","following_url":"https://api.github.com/users/civisanalytics/following{/other_user}","gists_url":"https://api.github.com/users/civisanalytics/gists{/gist_id}","starred_url":"https://api.github.com/users/civisanalytics/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/civisanalytics/subscriptions","organizations_url":"https://api.github.com/users/civisanalytics/orgs","repos_url":"https://api.github.com/users/civisanalytics/repos","events_url":"https://api.github.com/users/civisanalytics/events{/privacy}","received_events_url":"https://api.github.com/users/civisanalytics/received_events","type":"Organization","site_admin":false},"repo":{"id":66285642,"name":"muffnn","full_name":"civisanalytics/muffnn","owner":{"login":"civisanalytics","id":3299743,"avatar_url":"https://avatars.githubusercontent.com/u/3299743?v=3","gravatar_id":"","url":"https://api.github.com/users/civisanalytics","html_url":"https://github.com/civisanalytics","followers_url":"https://api.github.com/users/civisanalytics/followers","following_url":"https://api.github.com/users/civisanalytics/following{/other_user}","gists_url":"https://api.github.com/users/civisanalytics/gists{/gist_id}","starred_url":"https://api.github.com/users/civisanalytics/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/civisanalytics/subscriptions","organizations_url":"https://api.github.com/users/civisanalytics/orgs","repos_url":"https://api.github.com/users/civisanalytics/repos","events_url":"https://api.github.com/users/civisanalytics/events{/privacy}","received_events_url":"https://api.github.com/users/civisanalytics/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/civisanalytics/muffnn","description":"Multilayer Feed-Forward Neural Network predictive model implementations with TensorFlow and scikit-learn","fork":false,"url":"https://api.github.com/repos/civisanalytics/muffnn","forks_url":"https://api.github.com/repos/civisanalytics/muffnn/forks","keys_url":"https://api.github.com/repos/civisanalytics/muffnn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/civisanalytics/muffnn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/civisanalytics/muffnn/teams","hooks_url":"https://api.github.com/repos/civisanalytics/muffnn/hooks","issue_events_url":"https://api.github.com/repos/civisanalytics/muffnn/issues/events{/number}","events_url":"https://api.github.com/repos/civisanalytics/muffnn/events","assignees_url":"https://api.github.com/repos/civisanalytics/muffnn/assignees{/user}","branches_url":"https://api.github.com/repos/civisanalytics/muffnn/branches{/branch}","tags_url":"https://api.github.com/repos/civisanalytics/muffnn/tags","blobs_url":"https://api.github.com/repos/civisanalytics/muffnn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/civisanalytics/muffnn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/civisanalytics/muffnn/git/refs{/sha}","trees_url":"https://api.github.com/repos/civisanalytics/muffnn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/civisanalytics/muffnn/statuses/{sha}","languages_url":"https://api.github.com/repos/civisanalytics/muffnn/languages","stargazers_url":"https://api.github.com/repos/civisanalytics/muffnn/stargazers","contributors_url":"https://api.github.com/repos/civisanalytics/muffnn/contributors","subscribers_url":"https://api.github.com/repos/civisanalytics/muffnn/subscribers","subscription_url":"https://api.github.com/repos/civisanalytics/muffnn/subscription","commits_url":"https://api.github.com/repos/civisanalytics/muffnn/commits{/sha}","git_commits_url":"https://api.github.com/repos/civisanalytics/muffnn/git/commits{/sha}","comments_url":"https://api.github.com/repos/civisanalytics/muffnn/comments{/number}","issue_comment_url":"https://api.github.com/repos/civisanalytics/muffnn/issues/comments{/number}","contents_url":"https://api.github.com/repos/civisanalytics/muffnn/contents/{+path}","compare_url":"https://api.github.com/repos/civisanalytics/muffnn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/civisanalytics/muffnn/merges","archive_url":"https://api.github.com/repos/civisanalytics/muffnn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/civisanalytics/muffnn/downloads","issues_url":"https://api.github.com/repos/civisanalytics/muffnn/issues{/number}","pulls_url":"https://api.github.com/repos/civisanalytics/muffnn/pulls{/number}","milestones_url":"https://api.github.com/repos/civisanalytics/muffnn/milestones{/number}","notifications_url":"https://api.github.com/repos/civisanalytics/muffnn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/civisanalytics/muffnn/labels{/name}","releases_url":"https://api.github.com/repos/civisanalytics/muffnn/releases{/id}","deployments_url":"https://api.github.com/repos/civisanalytics/muffnn/deployments","created_at":"2016-08-22T15:44:49Z","updated_at":"2016-11-07T10:05:19Z","pushed_at":"2016-11-11T15:05:26Z","git_url":"git://github.com/civisanalytics/muffnn.git","ssh_url":"git@github.com:civisanalytics/muffnn.git","clone_url":"https://github.com/civisanalytics/muffnn.git","svn_url":"https://github.com/civisanalytics/muffnn","homepage":"","size":69,"stargazers_count":19,"watchers_count":19,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":5,"mirror_url":null,"open_issues_count":3,"forks":5,"open_issues":3,"watchers":19,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/civisanalytics/muffnn/pulls/9"},"html":{"href":"https://github.com/civisanalytics/muffnn/pull/9"},"issue":{"href":"https://api.github.com/repos/civisanalytics/muffnn/issues/9"},"comments":{"href":"https://api.github.com/repos/civisanalytics/muffnn/issues/9/comments"},"review_comments":{"href":"https://api.github.com/repos/civisanalytics/muffnn/pulls/9/comments"},"review_comment":{"href":"https://api.github.com/repos/civisanalytics/muffnn/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/civisanalytics/muffnn/pulls/9/commits"},"statuses":{"href":"https://api.github.com/repos/civisanalytics/muffnn/statuses/7dc836c0c15b5bd023f655d738a2212b6cf0c435"}}}}
{"actor":{"display_login":"beckermr"}}