Repository: deeplearning4j/deeplearning4j
Issue: MNIST downloader *still* doesn't reliably handle download errors

Even with multiple passes on it, MNIST downloader *still* manages to not automatically handle download issues :/

Here's output (test failure) from most recent run of MnistFetcherTest.testMnistDataFetcher - master versions of codebase all round:
```
java.io.EOFException: Unexpected end of ZLIB input stream

	at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:240)
	at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
	at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:117)
	at java.io.FilterInputStream.read(FilterInputStream.java:107)
	at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1792)
	at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1769)
	at org.nd4j.util.ArchiveUtils.unzipFileTo(ArchiveUtils.java:131)
	at org.deeplearning4j.base.MnistFetcher.downloadAndUntar(MnistFetcher.java:159)
	at org.deeplearning4j.base.MnistFetcherTest.testMnistDataFetcher(MnistFetcherTest.java:51)
```

Changed files:
deeplearning4j-nn/src/main/java/org/deeplearning4j/util/Dl4jReflection.java
deeplearning4j-nn/src/main/java/org/deeplearning4j/util/StringGrid.java
deeplearning4j-scaleout/deeplearning4j-aws/src/main/java/org/deeplearning4j/aws/s3/reader/S3Downloader.java
deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/layers/feedforward/autoencoder/recursive/Tree.java
deeplearning4j-core/src/main/java/org/deeplearning4j/datasets/fetchers/MnistDataFetcher.java
deeplearning4j-scaleout/deeplearning4j-aws/src/main/java/org/deeplearning4j/aws/ec2/provision/ClusterSetup.java
deeplearning4j-nearestneighbors-parent/nearestneighbor-core/src/main/java/org/deeplearning4j/clustering/util/MathUtils.java
deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/multilayer/MultiLayerNetwork.java
deeplearning4j-core/src/main/java/org/deeplearning4j/base/MnistFetcher.java
deeplearning4j-nlp-parent/deeplearning4j-nlp/src/main/java/org/deeplearning4j/text/movingwindow/WindowConverter.java
deeplearning4j-nn/src/main/java/org/deeplearning4j/datasets/iterator/impl/MovingWindowDataSetFetcher.java
deeplearning4j-nn/src/main/java/org/deeplearning4j/datasets/iterator/DataSetFetcher.java
deeplearning4j-nlp-parent/deeplearning4j-nlp/src/main/java/org/deeplearning4j/datasets/loader/ReutersNewsGroupsLoader.java

diff --git a/deeplearning4j-core/src/main/java/org/deeplearning4j/base/MnistFetcher.java b/deeplearning4j-core/src/main/java/org/deeplearning4j/base/MnistFetcher.java
index 30187ad22e..d2a502ea04 100755
--- a/deeplearning4j-core/src/main/java/org/deeplearning4j/base/MnistFetcher.java
+++ b/deeplearning4j-core/src/main/java/org/deeplearning4j/base/MnistFetcher.java
@@ -149,47 +149,50 @@ public class MnistFetcher {
         }
 
         log.info("Downloading {}...", getName());
-        // getFromOrigin training records
-        File tarFile = new File(baseDir, getTrainingFilesFilename());
-        File testFileLabels = new File(baseDir, getTestFilesFilename());
+        // get features
+        File trainFeatures = new File(baseDir, getTrainingFilesFilename());
+        File testFeatures = new File(baseDir, getTestFilesFilename());
 
-        tryDownloadingAFewTimes(new URL(getTrainingFilesURL()), tarFile, getTrainingFilesMD5());
-        tryDownloadingAFewTimes(new URL(getTestFilesURL()), testFileLabels, getTestFilesMD5());
+        downloadAndExtract(new URL(getTrainingFilesURL()), trainFeatures, baseDir, getTrainingFilesMD5());
+        downloadAndExtract(new URL(getTestFilesURL()), testFeatures, baseDir, getTestFilesMD5());
 
-        ArchiveUtils.unzipFileTo(tarFile.getAbsolutePath(), baseDir.getAbsolutePath());
-        ArchiveUtils.unzipFileTo(testFileLabels.getAbsolutePath(), baseDir.getAbsolutePath());
+        // get labels
+        File trainLabels = new File(baseDir, getTrainingFileLabelsFilename());
+        File testLabels = new File(baseDir, getTestFileLabelsFilename());
 
-        // getFromOrigin training records
-        File labels = new File(baseDir, getTrainingFileLabelsFilename());
-        File labelsTest = new File(baseDir, getTestFileLabelsFilename());
-
-        tryDownloadingAFewTimes(new URL(getTrainingFileLabelsURL()), labels, getTrainingFileLabelsMD5());
-        tryDownloadingAFewTimes(new URL(getTestFileLabelsURL()), labelsTest, getTestFileLabelsMD5());
-
-        ArchiveUtils.unzipFileTo(labels.getAbsolutePath(), baseDir.getAbsolutePath());
-        ArchiveUtils.unzipFileTo(labelsTest.getAbsolutePath(), baseDir.getAbsolutePath());
+        downloadAndExtract(new URL(getTrainingFileLabelsURL()), trainLabels, baseDir, getTrainingFileLabelsMD5());
+        downloadAndExtract(new URL(getTestFileLabelsURL()), testLabels, baseDir, getTestFileLabelsMD5());
 
         fileDir = baseDir;
         return fileDir;
     }
 
-    private void tryDownloadingAFewTimes(URL url, File f, String targetMD5) throws IOException {
-        tryDownloadingAFewTimes(0, url, f, targetMD5);
+    private void downloadAndExtract(URL url, File f, File extractToDir, String targetMD5) throws IOException {
+        downloadAndExtract(0, url, f, extractToDir, targetMD5);
     }
 
-    private void tryDownloadingAFewTimes(int attempt, URL url, File f, String targetMD5) throws IOException {
+    private void downloadAndExtract(int attempt, URL url, File f, File extractToDir, String targetMD5) throws IOException {
         int maxTries = 3;
-        boolean isCorrectFile = f.isFile();
-        if (attempt < maxTries && !isCorrectFile) {
-            FileUtils.copyURLToFile(url, f);
-            if (!checkMD5OfFile(targetMD5, f)) {
+        boolean isCorrectFile = f.exists() && f.isFile() && checkMD5OfFile(targetMD5, f);
+        if (attempt < maxTries) {
+            if(!isCorrectFile) {
+                FileUtils.copyURLToFile(url, f);
+                if (!checkMD5OfFile(targetMD5, f)) {
+                    f.delete();
+                    downloadAndExtract(attempt + 1, url, f, extractToDir, targetMD5);
+                }
+            }
+            // try extracting
+            try{
+                ArchiveUtils.unzipFileTo(f.getAbsolutePath(), extractToDir.getAbsolutePath());
+            } catch (Throwable t){
+                log.warn("Error extracting MNIST files from file {} - retrying...", f.getAbsolutePath(), t);
                 f.delete();
-                tryDownloadingAFewTimes(attempt + 1, url, f, targetMD5);
+                downloadAndExtract(attempt + 1, url, f, extractToDir, targetMD5);
             }
-        } else if (isCorrectFile) {
-            // do nothing, file downloaded
-        } else {
-            throw new IOException("Could not download " + url.getPath() + "\\n properly despite trying " + maxTries
+        } else if (!isCorrectFile) {
+            //Too many attempts
+            throw new IOException("Could not download and extract " + url.getPath() + "\\n properly despite trying " + maxTries
                             + " times, check your connection. File info:" + "\\nTarget MD5: " + targetMD5
                             + "\\nHash matches: " + checkMD5OfFile(targetMD5, f) + "\\nIs valid file: " + f.isFile());
         }
diff --git a/deeplearning4j-core/src/main/java/org/deeplearning4j/datasets/fetchers/MnistDataFetcher.java b/deeplearning4j-core/src/main/java/org/deeplearning4j/datasets/fetchers/MnistDataFetcher.java
index 93dbbb6b73..22a143fedc 100755
--- a/deeplearning4j-core/src/main/java/org/deeplearning4j/datasets/fetchers/MnistDataFetcher.java
+++ b/deeplearning4j-core/src/main/java/org/deeplearning4j/datasets/fetchers/MnistDataFetcher.java
@@ -163,7 +163,7 @@ public class MnistDataFetcher extends BaseDataFetcher {
     @Override
     public void fetch(int numExamples) {
         if (!hasMore()) {
-            throw new IllegalStateException("Unable to getFromOrigin more; there are no more images");
+            throw new IllegalStateException("Unable to get more; there are no more images");
         }
 
         float[][] featureData = new float[numExamples][0];
diff --git a/deeplearning4j-nearestneighbors-parent/nearestneighbor-core/src/main/java/org/deeplearning4j/clustering/util/MathUtils.java b/deeplearning4j-nearestneighbors-parent/nearestneighbor-core/src/main/java/org/deeplearning4j/clustering/util/MathUtils.java
index 3622d4dc20..0bd6c3d082 100755
--- a/deeplearning4j-nearestneighbors-parent/nearestneighbor-core/src/main/java/org/deeplearning4j/clustering/util/MathUtils.java
+++ b/deeplearning4j-nearestneighbors-parent/nearestneighbor-core/src/main/java/org/deeplearning4j/clustering/util/MathUtils.java
@@ -89,7 +89,7 @@ public class MathUtils {
 
     /**
      * See: http://stackoverflow.com/questions/466204/rounding-off-to-nearest-power-of-2
-     * @param v the number to getFromOrigin the next power of 2 for
+     * @param v the number to get the next power of 2 for
      * @return the next power of 2 for the passed in value
      */
     public static long nextPowOf2(long v) {
@@ -364,7 +364,7 @@ public class MathUtils {
      * This returns the minimized loss values for a given vector.
      * It is assumed that  the x, y pairs are at
      * vector[i], vector[i+1]
-     * @param vector the vector of numbers to getFromOrigin the weights for
+     * @param vector the vector of numbers to get the weights for
      * @return a double array with w_0 and w_1 are the associated indices.
      */
     public static double[] weightsFor(List<Double> vector) {
@@ -430,7 +430,7 @@ public class MathUtils {
      * This returns the minimized loss values for a given vector.
      * It is assumed that  the x, y pairs are at
      * vector[i], vector[i+1]
-     * @param vector the vector of numbers to getFromOrigin the weights for
+     * @param vector the vector of numbers to get the weights for
      * @return a double array with w_0 and w_1 are the associated indices.
      */
     public static double[] weightsFor(double[] vector) {
@@ -544,7 +544,7 @@ public class MathUtils {
 
     /**
      * This returns the given column over an n arrays
-     * @param column the column to getFromOrigin values for
+     * @param column the column to get values for
      * @param nums the arrays to extract values from
      * @return a double array containing all of the numbers in that column
      * for all of the arrays.
@@ -668,7 +668,7 @@ public class MathUtils {
     /**
      * This returns the x values of the given vector.
      * These are assumed to be the even values of the vector.
-     * @param vector the vector to getFromOrigin the values for
+     * @param vector the vector to get the values for
      * @return the x values of the given vector
      */
     public static double[] xVals(double[] vector) {
@@ -767,7 +767,7 @@ public class MathUtils {
 
     /**
      * This returns the entropy (information gain, or uncertainty of a random variable).
-     * @param vector the vector of values to getFromOrigin the entropy for
+     * @param vector the vector of values to get the entropy for
      * @return the entropy of the given vector
      */
     public static double entropy(double[] vector) {
@@ -875,7 +875,7 @@ public class MathUtils {
 
     /**
      * This returns the entropy for a given vector of probabilities.
-     * @param probabilities the probabilities to getFromOrigin the entropy for
+     * @param probabilities the probabilities to get the entropy for
      * @return the entropy of the given probabilities.
      */
     public static double information(double[] probabilities) {
@@ -912,7 +912,7 @@ public class MathUtils {
 
     /**
      * This will return the factorial of the given number n.
-     * @param n the number to getFromOrigin the factorial for
+     * @param n the number to get the factorial for
      * @return the factorial for this number
      */
     public static double factorial(double n) {
diff --git a/deeplearning4j-nlp-parent/deeplearning4j-nlp/src/main/java/org/deeplearning4j/datasets/loader/ReutersNewsGroupsLoader.java b/deeplearning4j-nlp-parent/deeplearning4j-nlp/src/main/java/org/deeplearning4j/datasets/loader/ReutersNewsGroupsLoader.java
deleted file mode 100755
index 2f2342e50e..0000000000
--- a/deeplearning4j-nlp-parent/deeplearning4j-nlp/src/main/java/org/deeplearning4j/datasets/loader/ReutersNewsGroupsLoader.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*-
- *
- *  * Copyright 2015 Skymind,Inc.
- *  *
- *  *    Licensed under the Apache License, Version 2.0 (the "License");
- *  *    you may not use this file except in compliance with the License.
- *  *    You may obtain a copy of the License at
- *  *
- *  *        http://www.apache.org/licenses/LICENSE-2.0
- *  *
- *  *    Unless required by applicable law or agreed to in writing, software
- *  *    distributed under the License is distributed on an "AS IS" BASIS,
- *  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  *    See the License for the specific language governing permissions and
- *  *    limitations under the License.
- *
- */
-
-package org.deeplearning4j.datasets.loader;
-
-/**
- * @author Adam Gibson
- */
-// public class ReutersNewsGroupsLoader extends BaseDataFetcher {
-
-//     private TextVectorizer textVectorizer;
-//     private boolean tfidf;
-//     public final static String NEWSGROUP_URL = "http://qwone.com/~jason/20Newsgroups/20news-18828.tar.gz";
-//     private File reutersRootDir;
-//     private static final Logger log = LoggerFactory.getLogger(ReutersNewsGroupsLoader.class);
-//     private DataSet load;
-
-
-//     public ReutersNewsGroupsLoader(boolean tfidf) throws Exception {
-//         getIfNotExists();
-//         LabelAwareSentenceIterator iter = new LabelAwareFileSentenceIterator(reutersRootDir);
-//         List<String> labels =new ArrayList<>();
-//         for(File f : reutersRootDir.listFiles()) {
-//             if(f.isDirectory())
-//                 labels.add(f.getName());
-//         }
-//         TokenizerFactory tokenizerFactory = new UimaTokenizerFactory();
-
-//         if(tfidf)
-//             this.textVectorizer = new TfidfVectorizer.Builder()
-//                     .iterate(iter).labels(labels).tokenize(tokenizerFactory).build();
-
-//         else
-//             this.textVectorizer = new BagOfWordsVectorizer.Builder()
-//                     .iterate(iter).labels(labels).tokenize(tokenizerFactory).build();
-
-//         load = this.textVectorizer.vectorize();
-//     }
-
-//     private void getIfNotExists() throws Exception {
-//         String home = System.getProperty("user.home");
-//         String rootDir = home + File.separator + "reuters";
-//         reutersRootDir = new File(rootDir);
-//         if(!reutersRootDir.exists())
-//             reutersRootDir.mkdir();
-//         else if(reutersRootDir.exists())
-//             return;
-
-
-//         File rootTarFile = new File(reutersRootDir,"20news-18828.tar.gz");
-//         if(rootTarFile.exists())
-//             rootTarFile.delete();
-//         rootTarFile.createNewFile();
-
-//         FileUtils.copyURLToFile(new URL(NEWSGROUP_URL), rootTarFile);
-//         ArchiveUtils.unzipFileTo(rootTarFile.getAbsolutePath(), reutersRootDir.getAbsolutePath());
-//         rootTarFile.delete();
-//         FileUtils.copyDirectory(new File(reutersRootDir,"20news-18828"),reutersRootDir);
-//         FileUtils.deleteDirectory(new File(reutersRootDir,"20news-18828"));
-//         if(reutersRootDir.listFiles() == null)
-//             throw new IllegalStateException("No files found!");
-
-//     }
-
-
-//     /**
-//      * Fetches the next dataset. You need to call this
-//      * to getFromOrigin a new dataset, otherwise {@link #next()}
-//      * just returns the last data applyTransformToDestination fetch
-//      *
-//      * @param numExamples the number of examples to fetch
-//      */
-//     @Override
-//     public void fetch(int numExamples) {
-//         List<DataSet> newData = new ArrayList<>();
-//         for(int grabbed = 0; grabbed < numExamples && cursor < load.numExamples(); cursor++,grabbed++) {
-//             newData.add(load.get(cursor));
-//         }
-
-//         this.curr = DataSet.merge(newData);
-
-//     }
-// }
diff --git a/deeplearning4j-nlp-parent/deeplearning4j-nlp/src/main/java/org/deeplearning4j/text/movingwindow/WindowConverter.java b/deeplearning4j-nlp-parent/deeplearning4j-nlp/src/main/java/org/deeplearning4j/text/movingwindow/WindowConverter.java
index bc64873266..b0c69be645 100755
--- a/deeplearning4j-nlp-parent/deeplearning4j-nlp/src/main/java/org/deeplearning4j/text/movingwindow/WindowConverter.java
+++ b/deeplearning4j-nlp-parent/deeplearning4j-nlp/src/main/java/org/deeplearning4j/text/movingwindow/WindowConverter.java
@@ -48,7 +48,7 @@ public class WindowConverter {
      * Keep in mind each window is a multi word context.
      *
      * From there, each word uses the passed in model
-     * as a lookup table to getFromOrigin what vectors are relevant
+     * as a lookup table to get what vectors are relevant
      * to the passed in windows
      * @param window the window to take in.
      * @param vec the model to use as a lookup table
@@ -84,7 +84,7 @@ public class WindowConverter {
      * Keep in mind each window is a multi word context.
      *
      * From there, each word uses the passed in model
-     * as a lookup table to getFromOrigin what vectors are relevant
+     * as a lookup table to get what vectors are relevant
      * to the passed in windows
      * @param window the window to take in.
      * @param vec the model to use as a lookup table
diff --git a/deeplearning4j-nn/src/main/java/org/deeplearning4j/datasets/iterator/DataSetFetcher.java b/deeplearning4j-nn/src/main/java/org/deeplearning4j/datasets/iterator/DataSetFetcher.java
index fa4955d68b..86fe05477d 100755
--- a/deeplearning4j-nn/src/main/java/org/deeplearning4j/datasets/iterator/DataSetFetcher.java
+++ b/deeplearning4j-nn/src/main/java/org/deeplearning4j/datasets/iterator/DataSetFetcher.java
@@ -47,7 +47,7 @@ public interface DataSetFetcher extends Serializable {
 
     /**
      * Fetches the next dataset. You need to call this
-     * to getFromOrigin a new dataset, otherwise {@link #next()}
+     * to get a new dataset, otherwise {@link #next()}
      * just returns the last data applyTransformToDestination fetch
      * @param numExamples the number of examples to fetch
      */
diff --git a/deeplearning4j-nn/src/main/java/org/deeplearning4j/datasets/iterator/impl/MovingWindowDataSetFetcher.java b/deeplearning4j-nn/src/main/java/org/deeplearning4j/datasets/iterator/impl/MovingWindowDataSetFetcher.java
index 79c292a9e4..08571a5752 100644
--- a/deeplearning4j-nn/src/main/java/org/deeplearning4j/datasets/iterator/impl/MovingWindowDataSetFetcher.java
+++ b/deeplearning4j-nn/src/main/java/org/deeplearning4j/datasets/iterator/impl/MovingWindowDataSetFetcher.java
@@ -64,7 +64,7 @@ public class MovingWindowDataSetFetcher extends BaseDataFetcher {
 
     /**
      * Fetches the next dataset. You need to call this
-     * to getFromOrigin a new dataset, otherwise {@link #next()}
+     * to get a new dataset, otherwise {@link #next()}
      * just returns the last data applyTransformToDestination fetch
      *
      * @param numExamples the number of examples to fetch
diff --git a/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/layers/feedforward/autoencoder/recursive/Tree.java b/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/layers/feedforward/autoencoder/recursive/Tree.java
index 7a06599184..200ef06759 100644
--- a/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/layers/feedforward/autoencoder/recursive/Tree.java
+++ b/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/layers/feedforward/autoencoder/recursive/Tree.java
@@ -204,7 +204,7 @@ public class Tree implements Serializable {
     /**
      * Returns the distance between this node
      * and the specified subnode
-     * @param node the node to getFromOrigin the distance from
+     * @param node the node to get the distance from
      * @return the distance between the 2 nodes
      */
     public int depth(Tree node) {
diff --git a/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/multilayer/MultiLayerNetwork.java b/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/multilayer/MultiLayerNetwork.java
index 435c1fc8ca..f594bc4754 100755
--- a/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/multilayer/MultiLayerNetwork.java
+++ b/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/multilayer/MultiLayerNetwork.java
@@ -2169,7 +2169,7 @@ public class MultiLayerNetwork implements Serializable, Classifier, Layer, Neura
      * Assigns the parameters of this model to the ones specified by this
      * network. This is used in loading from input streams, factory methods, etc
      *
-     * @param network the network to getFromOrigin parameters from
+     * @param network the network to get parameters from
      */
     public void update(MultiLayerNetwork network) {
         this.defaultConfiguration =
diff --git a/deeplearning4j-nn/src/main/java/org/deeplearning4j/util/Dl4jReflection.java b/deeplearning4j-nn/src/main/java/org/deeplearning4j/util/Dl4jReflection.java
index 5cbff31c42..b403aeb07b 100755
--- a/deeplearning4j-nn/src/main/java/org/deeplearning4j/util/Dl4jReflection.java
+++ b/deeplearning4j-nn/src/main/java/org/deeplearning4j/util/Dl4jReflection.java
@@ -35,7 +35,7 @@ public class Dl4jReflection {
 
     /**
      * Gets the empty constructor from a class
-     * @param clazz the class to getFromOrigin the constructor from
+     * @param clazz the class to get the constructor from
      * @return the empty constructor for the class
      */
     public static Constructor<?> getEmptyConstructor(Class<?> clazz) {
diff --git a/deeplearning4j-nn/src/main/java/org/deeplearning4j/util/StringGrid.java b/deeplearning4j-nn/src/main/java/org/deeplearning4j/util/StringGrid.java
index 55199ddac4..066dde28f0 100755
--- a/deeplearning4j-nn/src/main/java/org/deeplearning4j/util/StringGrid.java
+++ b/deeplearning4j-nn/src/main/java/org/deeplearning4j/util/StringGrid.java
@@ -350,7 +350,7 @@ public class StringGrid extends ArrayList<List<String>> {
 
         //wtf is wrong with you people?
         if (chosenKey == null) {
-            //getFromOrigin the max value of the cluster
+            //get the max value of the cluster
             String max2 = maximalValue(cluster);
             StringTokenizer val = new StringTokenizer(max2);
             List<String> list = new ArrayList<>();
diff --git a/deeplearning4j-scaleout/deeplearning4j-aws/src/main/java/org/deeplearning4j/aws/ec2/provision/ClusterSetup.java b/deeplearning4j-scaleout/deeplearning4j-aws/src/main/java/org/deeplearning4j/aws/ec2/provision/ClusterSetup.java
index 975112576f..eac5798bb9 100755
--- a/deeplearning4j-scaleout/deeplearning4j-aws/src/main/java/org/deeplearning4j/aws/ec2/provision/ClusterSetup.java
+++ b/deeplearning4j-scaleout/deeplearning4j-aws/src/main/java/org/deeplearning4j/aws/ec2/provision/ClusterSetup.java
@@ -81,7 +81,7 @@ public class ClusterSetup {
         boxCreator.create();
         boxCreator.blockTillAllRunning();
         List<String> hosts = boxCreator.getHosts();
-        //provisionMaster(hosts.getFromOrigin(0));
+        //provisionMaster(hosts.get(0));
         provisionWorkers(hosts);
 
 
diff --git a/deeplearning4j-scaleout/deeplearning4j-aws/src/main/java/org/deeplearning4j/aws/s3/reader/S3Downloader.java b/deeplearning4j-scaleout/deeplearning4j-aws/src/main/java/org/deeplearning4j/aws/s3/reader/S3Downloader.java
index 213503e462..1f55d66e2a 100755
--- a/deeplearning4j-scaleout/deeplearning4j-aws/src/main/java/org/deeplearning4j/aws/s3/reader/S3Downloader.java
+++ b/deeplearning4j-scaleout/deeplearning4j-aws/src/main/java/org/deeplearning4j/aws/s3/reader/S3Downloader.java
@@ -86,7 +86,7 @@ public class S3Downloader extends BaseS3 {
 
     /**
      * Iterator style one list at a time
-     * @param list the list to getFromOrigin the next batch for
+     * @param list the list to get the next batch for
      * @return the next batch of objects or null if
      * none are left
      */