{"action":"created","comment":{"url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/pulls/comments/100592072","pull_request_review_id":21308250,"id":100592072,"diff_hunk":"@@ -0,0 +1,156 @@\n+package org.deeplearning4j.nn.modelimport.keras;\n+\n+import lombok.extern.slf4j.Slf4j;\n+import org.deeplearning4j.eval.ROCMultiClass;\n+import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;\n+import org.junit.Test;\n+import org.nd4j.linalg.api.ndarray.INDArray;\n+import org.nd4j.linalg.io.ClassPathResource;\n+\n+import java.io.File;\n+import java.nio.file.Files;\n+import java.nio.file.StandardCopyOption;\n+import java.util.*;\n+\n+import static org.junit.Assert.*;\n+\n+/**\n+ * Unit tests for end-to-end Keras model import.\n+ *\n+ * TODO: find a more elegant fix for the per-layer activation comparisons\n+ * since some layers (e.g., ActivationLayer) overwrite previous\n+ * layer's activations when run in train=false mode.\n+ *\n+ * TODO: ndarray.equalsWithEps(ndarray) appears to be broken\n+ *\n+ * @author dave@skymind.io\n+ */\n+@Slf4j\n+public class KerasModelEndToEndTest {\n+    public static final String GROUP_ATTR_INPUTS = \"inputs\";\n+    public static final String GROUP_ATTR_OUTPUTS = \"outputs\";\n+    public static final String GROUP_PREDICTIONS = \"predictions\";\n+    public static final String GROUP_ACTIVATIONS = \"activations\";\n+    public static final String TEMP_OUTPUTS_FILENAME = \"tempOutputs\";\n+    public static final String TEMP_MODEL_FILENAME = \"tempModel\";\n+    public static final String H5_EXTENSION = \".h5\";\n+\n+    public static final double EPS = 1E-6;\n+\n+    @Test\n+    public void importMnistMlpTensorFlowEndToEndModelTest() throws Exception {\n+        ClassPathResource modelResource = new ClassPathResource(\"modelimport/keras/examples/mnist_mlp/mnist_mlp_tf_model.h5\",\n+                KerasModelEndToEndTest.class.getClassLoader());\n+        File modelFile = File.createTempFile(TEMP_MODEL_FILENAME, H5_EXTENSION);\n+        Files.copy(modelResource.getInputStream(), modelFile.toPath(),  StandardCopyOption.REPLACE_EXISTING);\n+        MultiLayerNetwork model = new KerasModel.ModelBuilder()\n+                .modelHdf5Filename(modelFile.getAbsolutePath())\n+                .enforceTrainingConfig(false)\n+                .buildSequential()\n+                .getMultiLayerNetwork();\n+\n+        ClassPathResource outputsResource = new ClassPathResource(\"modelimport/keras/examples/mnist_mlp/mnist_mlp_tf_inputs_and_outputs.h5\",\n+                KerasModelEndToEndTest.class.getClassLoader());\n+        File outputsFile = File.createTempFile(TEMP_OUTPUTS_FILENAME, H5_EXTENSION);\n+        Files.copy(outputsResource.getInputStream(), outputsFile.toPath(),  StandardCopyOption.REPLACE_EXISTING);\n+        Hdf5Archive outputsArchive = new Hdf5Archive(outputsFile.getAbsolutePath());\n+\n+        INDArray input = getInputs(outputsArchive, true)[0];\n+        Map<String, INDArray> activationsKeras = getActivations(outputsArchive, true);\n+        for (int i = 0; i < model.getLayers().length; i++) {\n+            String layerName = model.getLayerNames().get(i);\n+            if (activationsKeras.containsKey(layerName)) {\n+                INDArray activationsDl4j = model.feedForwardToLayer(i, input, false).get(i+1);\n+                compareINDArrays(layerName, activationsKeras.get(layerName), activationsDl4j, EPS);\n+            }\n+        }\n+\n+        INDArray predictionsKeras = getPredictions(outputsArchive, true)[0];\n+        INDArray predictionsDl4j = model.output(input, false);\n+        compareINDArrays(\"predictions\", predictionsKeras, predictionsDl4j, EPS);\n+\n+        INDArray outputs = getOutputs(outputsArchive, true)[0];\n+        compareMulticlassAUC(\"predictions\", outputs, predictionsKeras, predictionsDl4j, 10, EPS);\n+    }\n+\n+    static public INDArray[] getInputs(Hdf5Archive archive, boolean tensorFlowImageDimOrdering) throws Exception {\n+        List<String> inputNames = (List<String>)KerasModel.parseJsonString(archive.readAttributeAsJson(GROUP_ATTR_INPUTS)).get(GROUP_ATTR_INPUTS);\n+        INDArray[] inputs = new INDArray[inputNames.size()];\n+        for (int i = 0; i < inputNames.size(); i++) {\n+            inputs[i] = archive.readDataSet(inputNames.get(i), GROUP_ATTR_INPUTS);\n+            if (inputs[i].shape().length == 4 && tensorFlowImageDimOrdering)\n+                inputs[i] = inputs[i].permute(0, 3, 1, 2);\n+        }\n+        return inputs;\n+    }\n+\n+    static public Map<String, INDArray> getActivations(Hdf5Archive archive, boolean tensorFlowImageDimOrdering) throws Exception {\n+        Map<String, INDArray> activations = new HashMap<String, INDArray>();\n+        for (String layerName : archive.getDataSets(GROUP_ACTIVATIONS)) {\n+            INDArray activation = archive.readDataSet(layerName, GROUP_ACTIVATIONS);\n+            if (activation.shape().length == 4 && tensorFlowImageDimOrdering)\n+                activation = activation.permute(0, 3, 1, 2);\n+            activations.put(layerName, activation);\n+        }\n+        return activations;\n+    }\n+\n+    static public INDArray[] getOutputs(Hdf5Archive archive, boolean tensorFlowImageDimOrdering) throws Exception {\n+        List<String> outputNames = (List<String>)KerasModel.parseJsonString(archive.readAttributeAsJson(GROUP_ATTR_OUTPUTS)).get(GROUP_ATTR_OUTPUTS);\n+        INDArray[] outputs = new INDArray[outputNames.size()];\n+        for (int i = 0; i < outputNames.size(); i++) {\n+            outputs[i] = archive.readDataSet(outputNames.get(i), GROUP_ATTR_OUTPUTS);\n+            if (outputs[i].shape().length == 4 && tensorFlowImageDimOrdering)\n+                outputs[i] = outputs[i].permute(0, 3, 1, 2);\n+        }\n+        return outputs;\n+    }\n+\n+    static public INDArray[] getPredictions(Hdf5Archive archive, boolean tensorFlowImageDimOrdering) throws Exception {\n+        List<String> outputNames = (List<String>)KerasModel.parseJsonString(archive.readAttributeAsJson(GROUP_ATTR_OUTPUTS)).get(GROUP_ATTR_OUTPUTS);\n+        INDArray[] predictions = new INDArray[outputNames.size()];\n+        for (int i = 0; i < outputNames.size(); i++) {\n+            predictions[i] = archive.readDataSet(outputNames.get(i), GROUP_PREDICTIONS);\n+            if (predictions[i].shape().length == 4 && tensorFlowImageDimOrdering)\n+                predictions[i] = predictions[i].permute(0, 3, 1, 2);\n+        }\n+        return predictions;\n+    }\n+\n+    static public void compareINDArrays(String label, INDArray a, INDArray b, double eps) {\n+        INDArray diff = a.sub(b);\n+        double min = diff.minNumber().doubleValue();\n+        double max = diff.maxNumber().doubleValue();\n+        boolean eq = a.equalsWithEps(b, eps);\n+//        log.info(label + \": \" + a.equalsWithEps(b, eps) + \", \" + min + \", \" + max);","path":"deeplearning4j-modelimport/src/test/java/org/deeplearning4j/nn/modelimport/keras/KerasModelEndToEndTest.java","position":125,"original_position":125,"commit_id":"e1b55bae93d6528be9912ce0992e8a98b0712fe3","original_commit_id":"e1b55bae93d6528be9912ce0992e8a98b0712fe3","user":{"login":"turambar","id":209542,"avatar_url":"https://avatars.githubusercontent.com/u/209542?v=3","gravatar_id":"","url":"https://api.github.com/users/turambar","html_url":"https://github.com/turambar","followers_url":"https://api.github.com/users/turambar/followers","following_url":"https://api.github.com/users/turambar/following{/other_user}","gists_url":"https://api.github.com/users/turambar/gists{/gist_id}","starred_url":"https://api.github.com/users/turambar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/turambar/subscriptions","organizations_url":"https://api.github.com/users/turambar/orgs","repos_url":"https://api.github.com/users/turambar/repos","events_url":"https://api.github.com/users/turambar/events{/privacy}","received_events_url":"https://api.github.com/users/turambar/received_events","type":"User","site_admin":false},"body":"yeah probably, these unit tests are WIP. ;)","created_at":"2017-02-10T18:16:22Z","updated_at":"2017-02-10T18:16:22Z","html_url":"https://github.com/deeplearning4j/deeplearning4j/pull/2781#discussion_r100592072","pull_request_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/pulls/2781","_links":{"self":{"href":"https://api.github.com/repos/deeplearning4j/deeplearning4j/pulls/comments/100592072"},"html":{"href":"https://github.com/deeplearning4j/deeplearning4j/pull/2781#discussion_r100592072"},"pull_request":{"href":"https://api.github.com/repos/deeplearning4j/deeplearning4j/pulls/2781"}}},"pull_request":{"url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/pulls/2781","id":103856302,"html_url":"https://github.com/deeplearning4j/deeplearning4j/pull/2781","diff_url":"https://github.com/deeplearning4j/deeplearning4j/pull/2781.diff","patch_url":"https://github.com/deeplearning4j/deeplearning4j/pull/2781.patch","issue_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/issues/2781","number":2781,"state":"open","locked":false,"title":"Keras model import update: embedding layer, end-to-end unit tests","user":{"login":"turambar","id":209542,"avatar_url":"https://avatars.githubusercontent.com/u/209542?v=3","gravatar_id":"","url":"https://api.github.com/users/turambar","html_url":"https://github.com/turambar","followers_url":"https://api.github.com/users/turambar/followers","following_url":"https://api.github.com/users/turambar/following{/other_user}","gists_url":"https://api.github.com/users/turambar/gists{/gist_id}","starred_url":"https://api.github.com/users/turambar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/turambar/subscriptions","organizations_url":"https://api.github.com/users/turambar/orgs","repos_url":"https://api.github.com/users/turambar/repos","events_url":"https://api.github.com/users/turambar/events{/privacy}","received_events_url":"https://api.github.com/users/turambar/received_events","type":"User","site_admin":false},"body":"* Embedding layer\r\n* end-to-end unit tests","created_at":"2017-01-31T01:26:47Z","updated_at":"2017-02-10T18:16:22Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1b3afad8bbfa563daa2f52cfd5fdf7436ac5082f","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/pulls/2781/commits","review_comments_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/pulls/2781/comments","review_comment_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/pulls/comments{/number}","comments_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/issues/2781/comments","statuses_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/statuses/e1b55bae93d6528be9912ce0992e8a98b0712fe3","head":{"label":"deeplearning4j:kerasModelImport","ref":"kerasModelImport","sha":"e1b55bae93d6528be9912ce0992e8a98b0712fe3","user":{"login":"deeplearning4j","id":10988606,"avatar_url":"https://avatars.githubusercontent.com/u/10988606?v=3","gravatar_id":"","url":"https://api.github.com/users/deeplearning4j","html_url":"https://github.com/deeplearning4j","followers_url":"https://api.github.com/users/deeplearning4j/followers","following_url":"https://api.github.com/users/deeplearning4j/following{/other_user}","gists_url":"https://api.github.com/users/deeplearning4j/gists{/gist_id}","starred_url":"https://api.github.com/users/deeplearning4j/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deeplearning4j/subscriptions","organizations_url":"https://api.github.com/users/deeplearning4j/orgs","repos_url":"https://api.github.com/users/deeplearning4j/repos","events_url":"https://api.github.com/users/deeplearning4j/events{/privacy}","received_events_url":"https://api.github.com/users/deeplearning4j/received_events","type":"Organization","site_admin":false},"repo":{"id":14734876,"name":"deeplearning4j","full_name":"deeplearning4j/deeplearning4j","owner":{"login":"deeplearning4j","id":10988606,"avatar_url":"https://avatars.githubusercontent.com/u/10988606?v=3","gravatar_id":"","url":"https://api.github.com/users/deeplearning4j","html_url":"https://github.com/deeplearning4j","followers_url":"https://api.github.com/users/deeplearning4j/followers","following_url":"https://api.github.com/users/deeplearning4j/following{/other_user}","gists_url":"https://api.github.com/users/deeplearning4j/gists{/gist_id}","starred_url":"https://api.github.com/users/deeplearning4j/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deeplearning4j/subscriptions","organizations_url":"https://api.github.com/users/deeplearning4j/orgs","repos_url":"https://api.github.com/users/deeplearning4j/repos","events_url":"https://api.github.com/users/deeplearning4j/events{/privacy}","received_events_url":"https://api.github.com/users/deeplearning4j/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/deeplearning4j/deeplearning4j","description":"Deep Learning for Java, Scala & Clojure on Hadoop & Spark With GPUs - From Skymind","fork":false,"url":"https://api.github.com/repos/deeplearning4j/deeplearning4j","forks_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/forks","keys_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/keys{/key_id}","collaborators_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/teams","hooks_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/hooks","issue_events_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/issues/events{/number}","events_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/events","assignees_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/assignees{/user}","branches_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/branches{/branch}","tags_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/tags","blobs_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/git/refs{/sha}","trees_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/git/trees{/sha}","statuses_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/statuses/{sha}","languages_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/languages","stargazers_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/stargazers","contributors_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/contributors","subscribers_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/subscribers","subscription_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/subscription","commits_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/commits{/sha}","git_commits_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/git/commits{/sha}","comments_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/comments{/number}","issue_comment_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/issues/comments{/number}","contents_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/contents/{+path}","compare_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/compare/{base}...{head}","merges_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/merges","archive_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/downloads","issues_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/issues{/number}","pulls_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/pulls{/number}","milestones_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/milestones{/number}","notifications_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/labels{/name}","releases_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/releases{/id}","deployments_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/deployments","created_at":"2013-11-27T02:03:28Z","updated_at":"2017-02-10T16:46:47Z","pushed_at":"2017-02-10T16:35:07Z","git_url":"git://github.com/deeplearning4j/deeplearning4j.git","ssh_url":"git@github.com:deeplearning4j/deeplearning4j.git","clone_url":"https://github.com/deeplearning4j/deeplearning4j.git","svn_url":"https://github.com/deeplearning4j/deeplearning4j","homepage":"http://deeplearning4j.org","size":1376126,"stargazers_count":5421,"watchers_count":5421,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2290,"mirror_url":null,"open_issues_count":370,"forks":2290,"open_issues":370,"watchers":5421,"default_branch":"master"}},"base":{"label":"deeplearning4j:master","ref":"master","sha":"f1e8f69d4370d30cf97411c813bd6395a6f33c31","user":{"login":"deeplearning4j","id":10988606,"avatar_url":"https://avatars.githubusercontent.com/u/10988606?v=3","gravatar_id":"","url":"https://api.github.com/users/deeplearning4j","html_url":"https://github.com/deeplearning4j","followers_url":"https://api.github.com/users/deeplearning4j/followers","following_url":"https://api.github.com/users/deeplearning4j/following{/other_user}","gists_url":"https://api.github.com/users/deeplearning4j/gists{/gist_id}","starred_url":"https://api.github.com/users/deeplearning4j/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deeplearning4j/subscriptions","organizations_url":"https://api.github.com/users/deeplearning4j/orgs","repos_url":"https://api.github.com/users/deeplearning4j/repos","events_url":"https://api.github.com/users/deeplearning4j/events{/privacy}","received_events_url":"https://api.github.com/users/deeplearning4j/received_events","type":"Organization","site_admin":false},"repo":{"id":14734876,"name":"deeplearning4j","full_name":"deeplearning4j/deeplearning4j","owner":{"login":"deeplearning4j","id":10988606,"avatar_url":"https://avatars.githubusercontent.com/u/10988606?v=3","gravatar_id":"","url":"https://api.github.com/users/deeplearning4j","html_url":"https://github.com/deeplearning4j","followers_url":"https://api.github.com/users/deeplearning4j/followers","following_url":"https://api.github.com/users/deeplearning4j/following{/other_user}","gists_url":"https://api.github.com/users/deeplearning4j/gists{/gist_id}","starred_url":"https://api.github.com/users/deeplearning4j/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deeplearning4j/subscriptions","organizations_url":"https://api.github.com/users/deeplearning4j/orgs","repos_url":"https://api.github.com/users/deeplearning4j/repos","events_url":"https://api.github.com/users/deeplearning4j/events{/privacy}","received_events_url":"https://api.github.com/users/deeplearning4j/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/deeplearning4j/deeplearning4j","description":"Deep Learning for Java, Scala & Clojure on Hadoop & Spark With GPUs - From Skymind","fork":false,"url":"https://api.github.com/repos/deeplearning4j/deeplearning4j","forks_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/forks","keys_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/keys{/key_id}","collaborators_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/teams","hooks_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/hooks","issue_events_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/issues/events{/number}","events_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/events","assignees_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/assignees{/user}","branches_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/branches{/branch}","tags_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/tags","blobs_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/git/refs{/sha}","trees_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/git/trees{/sha}","statuses_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/statuses/{sha}","languages_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/languages","stargazers_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/stargazers","contributors_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/contributors","subscribers_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/subscribers","subscription_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/subscription","commits_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/commits{/sha}","git_commits_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/git/commits{/sha}","comments_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/comments{/number}","issue_comment_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/issues/comments{/number}","contents_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/contents/{+path}","compare_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/compare/{base}...{head}","merges_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/merges","archive_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/downloads","issues_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/issues{/number}","pulls_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/pulls{/number}","milestones_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/milestones{/number}","notifications_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/labels{/name}","releases_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/releases{/id}","deployments_url":"https://api.github.com/repos/deeplearning4j/deeplearning4j/deployments","created_at":"2013-11-27T02:03:28Z","updated_at":"2017-02-10T16:46:47Z","pushed_at":"2017-02-10T16:35:07Z","git_url":"git://github.com/deeplearning4j/deeplearning4j.git","ssh_url":"git@github.com:deeplearning4j/deeplearning4j.git","clone_url":"https://github.com/deeplearning4j/deeplearning4j.git","svn_url":"https://github.com/deeplearning4j/deeplearning4j","homepage":"http://deeplearning4j.org","size":1376126,"stargazers_count":5421,"watchers_count":5421,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2290,"mirror_url":null,"open_issues_count":370,"forks":2290,"open_issues":370,"watchers":5421,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/deeplearning4j/deeplearning4j/pulls/2781"},"html":{"href":"https://github.com/deeplearning4j/deeplearning4j/pull/2781"},"issue":{"href":"https://api.github.com/repos/deeplearning4j/deeplearning4j/issues/2781"},"comments":{"href":"https://api.github.com/repos/deeplearning4j/deeplearning4j/issues/2781/comments"},"review_comments":{"href":"https://api.github.com/repos/deeplearning4j/deeplearning4j/pulls/2781/comments"},"review_comment":{"href":"https://api.github.com/repos/deeplearning4j/deeplearning4j/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/deeplearning4j/deeplearning4j/pulls/2781/commits"},"statuses":{"href":"https://api.github.com/repos/deeplearning4j/deeplearning4j/statuses/e1b55bae93d6528be9912ce0992e8a98b0712fe3"}}}}
{"actor":{"display_login":"turambar"}}