This is an automated email from the ASF dual-hosted git repository. marcoabreu pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-mxnet.git
The following commit(s) were added to refs/heads/master by this push: new 40ae851 [MXNET-617] - Improve Clojure styles with cljfmt tools revise (#11537) 40ae851 is described below commit 40ae851bf64386d26bc49d42ff6da9a11d337606 Author: Burin Choomnuan <agilecreativ...@users.noreply.github.com> AuthorDate: Tue Jul 3 16:53:47 2018 -0400 [MXNET-617] - Improve Clojure styles with cljfmt tools revise (#11537) * Remove 'vi ci-test.sh' file * Add the scripts to reformat the style with cljfmt - Add lein-cljfmt-check to each project - Add lein-cljfmt-fix to each project * Add lein-cljfmt to the plugins vector * Add steps to keep style consistent to README.md * Run lein-cljfmt-fix on the main src/test codes - Run $MXROOT/contrib/clojure-package/lein-cljfmt-fix * Run lein cljfmt fix on the example projects - Run $MXNET_ROOT/contrib/clojure-package/examples/lein-cljfmt-fix * Use only one script in the base directory. - Thanks to @marcoabreu for the suggestion/review * Minor update to kick off the new build --- contrib/clojure-package/README.md | 10 ++ .../examples/cnn-text-classification/project.clj | 5 +- .../src/cnn_text_classification/classifier.clj | 6 +- .../src/cnn_text_classification/data_helper.clj | 40 +++--- contrib/clojure-package/examples/gan/project.clj | 1 + .../examples/gan/src/gan/gan_mnist.clj | 98 +++++++-------- .../clojure-package/examples/gan/src/gan/viz.clj | 3 +- .../examples/imclassification/project.clj | 5 +- .../src/imclassification/train_mnist.clj | 3 +- .../clojure-package/examples/module/project.clj | 5 +- .../examples/module/src/mnist_mlp.clj | 63 +++++----- .../examples/multi-label/project.clj | 1 + .../examples/multi-label/src/multi_label/core.clj | 8 +- .../examples/neural-style/project.clj | 4 +- .../neural-style/src/neural_style/core.clj | 48 +++---- .../neural-style/src/neural_style/model_vgg_19.clj | 13 +- .../examples/pre-trained-models/project.clj | 1 + .../src/pre_trained_models/fine_tune.clj | 21 ++-- .../src/pre_trained_models/predict_image.clj | 8 +- .../clojure-package/examples/profiler/project.clj | 1 + contrib/clojure-package/examples/rnn/project.clj | 5 +- .../clojure-package/examples/rnn/src/rnn/lstm.clj | 30 ++--- .../examples/rnn/src/rnn/test_char_rnn.clj | 13 +- .../examples/rnn/src/rnn/train_char_rnn.clj | 35 +++--- .../clojure-package/examples/rnn/src/rnn/util.clj | 17 ++- .../clojure-package/examples/tutorial/project.clj | 1 + .../examples/tutorial/src/tutorial/kvstore.clj | 6 +- .../examples/tutorial/src/tutorial/module.clj | 53 ++------ .../examples/visualization/project.clj | 5 +- .../visualization/src/visualization/core.clj | 10 +- .../{vi ci-test.sh => lein-cljfmt-check} | 10 +- .../{vi ci-test.sh => lein-cljfmt-fix} | 8 +- contrib/clojure-package/project.clj | 3 +- .../src/org/apache/clojure_mxnet/callback.clj | 1 - .../src/org/apache/clojure_mxnet/context.clj | 1 - .../src/org/apache/clojure_mxnet/dtype.clj | 1 - .../src/org/apache/clojure_mxnet/eval_metric.clj | 1 - .../src/org/apache/clojure_mxnet/executor.clj | 3 +- .../src/org/apache/clojure_mxnet/initializer.clj | 8 +- .../src/org/apache/clojure_mxnet/io.clj | 138 ++++++++++----------- .../src/org/apache/clojure_mxnet/kvstore.clj | 18 ++- .../org/apache/clojure_mxnet/kvstore_server.clj | 2 - .../src/org/apache/clojure_mxnet/lr_scheduler.clj | 1 - .../src/org/apache/clojure_mxnet/module.clj | 116 ++++++++--------- .../src/org/apache/clojure_mxnet/monitor.clj | 1 - .../src/org/apache/clojure_mxnet/ndarray.clj | 9 +- .../src/org/apache/clojure_mxnet/optimizer.clj | 31 +++-- .../src/org/apache/clojure_mxnet/profiler.clj | 2 +- .../src/org/apache/clojure_mxnet/random.clj | 3 +- .../src/org/apache/clojure_mxnet/shape.clj | 1 - .../src/org/apache/clojure_mxnet/symbol.clj | 134 ++++++++++---------- .../src/org/apache/clojure_mxnet/util.clj | 10 +- .../src/org/apache/clojure_mxnet/visualization.clj | 3 - .../clojure-package/test/dev/generator_test.clj | 61 +++++---- .../test/org/apache/clojure_mxnet/conv_test.clj | 12 +- .../org/apache/clojure_mxnet/executor_test.clj | 1 - .../test/org/apache/clojure_mxnet/io_test.clj | 20 ++- .../test/org/apache/clojure_mxnet/module_test.clj | 80 ++++++------ .../test/org/apache/clojure_mxnet/ndarray_test.clj | 18 +-- .../org/apache/clojure_mxnet/operator_test.clj | 138 +++++++++------------ .../org/apache/clojure_mxnet/optimizer_test.clj | 1 - .../test/org/apache/clojure_mxnet/symbol_test.clj | 5 +- 62 files changed, 611 insertions(+), 749 deletions(-) diff --git a/contrib/clojure-package/README.md b/contrib/clojure-package/README.md index bd226e0..6912f91 100644 --- a/contrib/clojure-package/README.md +++ b/contrib/clojure-package/README.md @@ -168,6 +168,16 @@ _Note: There is an error thrown in the generated code due to some loading issues To run the Code Coverage tool. Run `lein cloverage`. +## Tools to keep style consistent + +To keep the style consistent for the project we include the script that make it easier. +There are two script in the base of the project and in each examples. + +To run it just see the following file. `lein-cljfmt-check` and `lein-cljfmt-fix`. +The first command will run and check and confirm if the code needed to be updated to reflect the community style guide. +The second command will apply the change and fix any inconsistent indentation in place. This is recommendd to be done +before the submit a new pull request so we can keep the style consistent throughout the project. + ## FAQ diff --git a/contrib/clojure-package/examples/cnn-text-classification/project.clj b/contrib/clojure-package/examples/cnn-text-classification/project.clj index f3eb21a..c592dcd 100644 --- a/contrib/clojure-package/examples/cnn-text-classification/project.clj +++ b/contrib/clojure-package/examples/cnn-text-classification/project.clj @@ -17,7 +17,8 @@ (defproject cnn-text-classification "0.1.0-SNAPSHOT" :description "CNN text classification with MXNet" + :plugins [[lein-cljfmt "0.5.7"]] :dependencies [[org.clojure/clojure "1.9.0"] [org.apache.mxnet.contrib.clojure/clojure-mxnet "1.3.0-SNAPSHOT"]] - :main cnn-text-classification.classifier - :pedantic? :skip) + :pedantic? :skip + :main cnn-text-classification.classifier) diff --git a/contrib/clojure-package/examples/cnn-text-classification/src/cnn_text_classification/classifier.clj b/contrib/clojure-package/examples/cnn-text-classification/src/cnn_text_classification/classifier.clj index 756328c..29ff36f 100644 --- a/contrib/clojure-package/examples/cnn-text-classification/src/cnn_text_classification/classifier.clj +++ b/contrib/clojure-package/examples/cnn-text-classification/src/cnn_text_classification/classifier.clj @@ -85,7 +85,7 @@ :data-batch-size batch-size :last-batch-handle "pad"}) test-data (mx-io/ndarray-iter [(get-in shuffled [:test :data])] - {:label[(get-in shuffled [:test :label])] + {:label [(get-in shuffled [:test :label])] :label-name "softmax_label" :data-batch-size batch-size :last-batch-handle "pad"})] @@ -107,8 +107,6 @@ ;; runs all the examples #_(train-convnet {:embedding-size 50 :batch-size 100 :test-size 1000 :num-epoch 10}))) - (comment - (train-convnet {:devs [(context/cpu)] :embedding-size 50 :batch-size 10 :test-size 100 :num-epoch 10 :max-examples 1000}) - ) + (train-convnet {:devs [(context/cpu)] :embedding-size 50 :batch-size 10 :test-size 100 :num-epoch 10 :max-examples 1000})) diff --git a/contrib/clojure-package/examples/cnn-text-classification/src/cnn_text_classification/data_helper.clj b/contrib/clojure-package/examples/cnn-text-classification/src/cnn_text_classification/data_helper.clj index e7a706f..7966521 100644 --- a/contrib/clojure-package/examples/cnn-text-classification/src/cnn_text_classification/data_helper.clj +++ b/contrib/clojure-package/examples/cnn-text-classification/src/cnn_text_classification/data_helper.clj @@ -42,7 +42,6 @@ (.append sb (new String bs 0 i)))) (.toString sb))) - (defn get-float [b] (-> 0 (bit-or (bit-shift-left (bit-and (aget b 0) 0xff) 0)) @@ -70,31 +69,27 @@ (println "Finished") {:num-embed dim :word2vec word2vec}))) - (defn clean-str [s] (-> s - (string/replace #"^A-Za-z0-9(),!?'`]" " ") - (string/replace #"'s" " 's") - (string/replace #"'ve" " 've") - (string/replace #"n't" " n't") - (string/replace #"'re" " 're") - (string/replace #"'d" " 'd") - (string/replace #"'ll" " 'll") - (string/replace #"," " , ") - (string/replace #"!" " ! ") - (string/replace #"\(" " ( ") - (string/replace #"\)" " ) ") - (string/replace #"\?" " ? ") - (string/replace #" {2,}" " ") - (string/trim))) - - - ;; Loads MR polarity data from files, splits the data into words and generates labels. + (string/replace #"^A-Za-z0-9(),!?'`]" " ") + (string/replace #"'s" " 's") + (string/replace #"'ve" " 've") + (string/replace #"n't" " n't") + (string/replace #"'re" " 're") + (string/replace #"'d" " 'd") + (string/replace #"'ll" " 'll") + (string/replace #"," " , ") + (string/replace #"!" " ! ") + (string/replace #"\(" " ( ") + (string/replace #"\)" " ) ") + (string/replace #"\?" " ? ") + (string/replace #" {2,}" " ") + (string/trim)));; Loads MR polarity data from files, splits the data into words and generates labels. ;; Returns split sentences and labels. (defn load-mr-data-and-labels [path max-examples] (println "Loading all the movie reviews from " path) (let [positive-examples (mapv #(string/trim %) (-> (slurp (str path "/rt-polarity.pos")) - (string/split #"\n"))) + (string/split #"\n"))) negative-examples (mapv #(string/trim %) (-> (slurp (str path "/rt-polarity.neg")) (string/split #"\n"))) positive-examples (into [] (if max-examples (take max-examples positive-examples) positive-examples)) @@ -118,10 +113,7 @@ (if (pos? diff) (into s (repeat diff padding-word)) s))) - sentences))) - - - ;; Map sentences and labels to vectors based on a pretrained embeddings + sentences)));; Map sentences and labels to vectors based on a pretrained embeddings (defn build-input-data-with-embeddings [sentences embedding-size embeddings] (mapv (fn [sent] (mapv (fn [word] (or (get embeddings word) diff --git a/contrib/clojure-package/examples/gan/project.clj b/contrib/clojure-package/examples/gan/project.clj index 1469f9f..bebbc20 100644 --- a/contrib/clojure-package/examples/gan/project.clj +++ b/contrib/clojure-package/examples/gan/project.clj @@ -17,6 +17,7 @@ (defproject gan "0.1.0-SNAPSHOT" :description "GAN MNIST with MXNet" + :plugins [[lein-cljfmt "0.5.7"]] :dependencies [[org.clojure/clojure "1.9.0"] [org.apache.mxnet.contrib.clojure/clojure-mxnet "1.3.0-SNAPSHOT"] [nu.pattern/opencv "2.4.9-7"]] diff --git a/contrib/clojure-package/examples/gan/src/gan/gan_mnist.clj b/contrib/clojure-package/examples/gan/src/gan/gan_mnist.clj index 42c116a..14dd2c5 100644 --- a/contrib/clojure-package/examples/gan/src/gan/gan_mnist.clj +++ b/contrib/clojure-package/examples/gan/src/gan/gan_mnist.clj @@ -32,7 +32,6 @@ [org.apache.clojure-mxnet.context :as context]) (:gen-class)) - ;; based off of https://medium.com/@julsimon/generative-adversarial-networks-on-apache-mxnet-part-1-b6d39e6b5df1 @@ -57,7 +56,7 @@ (comment ;;This is for figuring out the convolution and deconvolution layers to convert the image sizes - + (defn conv-output-size [input-size kernel-size padding stride] (float (inc (/ (- (+ input-size (* 2 padding)) kernel-size) stride)))) @@ -86,7 +85,6 @@ (def lr 0.0005) ;; learning rate (def beta1 0.5) - (def label (sym/variable "label")) (defn discriminator [] @@ -130,26 +128,24 @@ label [(ndarray/ones [batch-size 100 1 1])]] (def my-iter (mx-io/ndarray-iter data))) - (defn save-img-gout [i n x] (do (viz/im-sav {:title (str "gout-" i "-" n) - :output-path output-path - :x x - :flip false}))) + :output-path output-path + :x x + :flip false}))) (defn save-img-diff [i n x] (do (viz/im-sav {:title (str "diff-" i "-" n) - :output-path output-path - :x x - :flip false}))) + :output-path output-path + :x x + :flip false}))) (defn save-img-data [i n batch] (do (viz/im-sav {:title (str "data-" i "-" n) - :output-path output-path - :x (first (mx-io/batch-data batch)) - :flip false}))) - + :output-path output-path + :x (first (mx-io/batch-data batch)) + :flip false}))) (defn calc-diff [i n diff-d] (let [diff (ndarray/copy diff-d) @@ -161,8 +157,6 @@ (save-img-diff i n calc-diff)))) - - (defn train [devs] (let [mod-d (-> (m/module (discriminator) {:contexts devs :data-names ["data"] :label-names ["label"]}) (m/bind {:data-shapes (mx-io/provide-data mnist-iter) @@ -171,55 +165,53 @@ (m/init-params {:initializer (init/normal 0.02)}) (m/init-optimizer {:optimizer (opt/adam {:learning-rate lr :wd 0.0 :beta1 beta1})})) mod-g (-> (m/module (generator) {:contexts devs :data-names ["rand"] :label-names nil}) - (m/bind {:data-shapes (mx-io/provide-data rand-noise-iter)}) - (m/init-params {:initializer (init/normal 0.02)}) - (m/init-optimizer {:optimizer (opt/adam {:learning-rate lr :wd 0.0 :beta1 beta1})}))] + (m/bind {:data-shapes (mx-io/provide-data rand-noise-iter)}) + (m/init-params {:initializer (init/normal 0.02)}) + (m/init-optimizer {:optimizer (opt/adam {:learning-rate lr :wd 0.0 :beta1 beta1})}))] (println "Training for " num-epoch " epochs...") (doseq [i (range num-epoch)] - (mx-io/reduce-batches mnist-iter - (fn [n batch] - (let [rbatch (mx-io/next rand-noise-iter) - out-g (-> mod-g - (m/forward rbatch) - (m/outputs)) + (mx-io/reduce-batches mnist-iter + (fn [n batch] + (let [rbatch (mx-io/next rand-noise-iter) + out-g (-> mod-g + (m/forward rbatch) + (m/outputs)) ;; update the discriminiator on the fake - grads-f (mapv #(ndarray/copy (first %)) (-> mod-d - (m/forward {:data (first out-g) :label [(ndarray/zeros [batch-size])]}) - (m/backward) - (m/grad-arrays))) + grads-f (mapv #(ndarray/copy (first %)) (-> mod-d + (m/forward {:data (first out-g) :label [(ndarray/zeros [batch-size])]}) + (m/backward) + (m/grad-arrays))) ;; update the discrimintator on the real - grads-r (-> mod-d - (m/forward {:data (mx-io/batch-data batch) :label [(ndarray/ones [batch-size])]}) - (m/backward) - (m/grad-arrays)) - _ (mapv (fn [real fake] (let [r (first real)] - (ndarray/set r (ndarray/+ r fake)))) grads-r grads-f) - _ (m/update mod-d) + grads-r (-> mod-d + (m/forward {:data (mx-io/batch-data batch) :label [(ndarray/ones [batch-size])]}) + (m/backward) + (m/grad-arrays)) + _ (mapv (fn [real fake] (let [r (first real)] + (ndarray/set r (ndarray/+ r fake)))) grads-r grads-f) + _ (m/update mod-d) ;; update the generator - diff-d (-> mod-d - (m/forward {:data (first out-g) :label [(ndarray/ones [batch-size])]}) - (m/backward) - (m/input-grads)) - _ (-> mod-g - (m/backward (first diff-d)) - (m/update))] - (when (zero? (mod n 100)) - (println "iteration = " i "number = " n) - (save-img-gout i n (ndarray/copy (ffirst out-g))) - (save-img-data i n batch) - (calc-diff i n (ffirst diff-d))) - (inc n))))))) + diff-d (-> mod-d + (m/forward {:data (first out-g) :label [(ndarray/ones [batch-size])]}) + (m/backward) + (m/input-grads)) + _ (-> mod-g + (m/backward (first diff-d)) + (m/update))] + (when (zero? (mod n 100)) + (println "iteration = " i "number = " n) + (save-img-gout i n (ndarray/copy (ffirst out-g))) + (save-img-data i n batch) + (calc-diff i n (ffirst diff-d))) + (inc n))))))) (defn -main [& args] (let [[dev dev-num] args devs (if (= dev ":gpu") (mapv #(context/gpu %) (range (Integer/parseInt (or dev-num "1")))) (mapv #(context/cpu %) (range (Integer/parseInt (or dev-num "1")))))] - (println "Running with context devices of" devs) + (println "Running with context devices of" devs) (train devs))) (comment - (train [(context/cpu)]) - - ) + (train [(context/cpu)])) diff --git a/contrib/clojure-package/examples/gan/src/gan/viz.clj b/contrib/clojure-package/examples/gan/src/gan/viz.clj index 7fab13e..8b57b94 100644 --- a/contrib/clojure-package/examples/gan/src/gan/viz.clj +++ b/contrib/clojure-package/examples/gan/src/gan/viz.clj @@ -27,7 +27,6 @@ ;;; Viz stuff (OpenCV/loadShared) - (defn clip [x] (->> x (mapv #(* 255 %)) @@ -69,7 +68,7 @@ [n c h w] shape totals (* h w) raw-data (byte-array (clip (ndarray/to-array x))) - row (.intValue(Math/sqrt n)) + row (.intValue (Math/sqrt n)) col row line-arrs (into [] (partition (* col c totals) raw-data)) line-mats (mapv (fn [line] diff --git a/contrib/clojure-package/examples/imclassification/project.clj b/contrib/clojure-package/examples/imclassification/project.clj index 5c22d86..e4c34e7 100644 --- a/contrib/clojure-package/examples/imclassification/project.clj +++ b/contrib/clojure-package/examples/imclassification/project.clj @@ -17,7 +17,8 @@ (defproject imclassification "0.1.0-SNAPSHOT" :description "Clojure examples for image classification" + :plugins [[lein-cljfmt "0.5.7"]] :dependencies [[org.clojure/clojure "1.9.0"] [org.apache.mxnet.contrib.clojure/clojure-mxnet "1.3.0-SNAPSHOT"]] - :main imclassification.train-mnist - :pedantic? :skip) + :pedantic? :skip + :main imclassification.train-mnist) diff --git a/contrib/clojure-package/examples/imclassification/src/imclassification/train_mnist.clj b/contrib/clojure-package/examples/imclassification/src/imclassification/train_mnist.clj index 44d3364..a43dc3b 100644 --- a/contrib/clojure-package/examples/imclassification/src/imclassification/train_mnist.clj +++ b/contrib/clojure-package/examples/imclassification/src/imclassification/train_mnist.clj @@ -111,5 +111,4 @@ (start devs))) (comment - (start [(context/cpu)]) - ) + (start [(context/cpu)])) diff --git a/contrib/clojure-package/examples/module/project.clj b/contrib/clojure-package/examples/module/project.clj index 2cd9796..7b32f32 100644 --- a/contrib/clojure-package/examples/module/project.clj +++ b/contrib/clojure-package/examples/module/project.clj @@ -17,8 +17,9 @@ (defproject module-examples "0.1.0-SNAPSHOT" :description "Clojure examples for module" + :plugins [[lein-cljfmt "0.5.7"]] :dependencies [[org.clojure/clojure "1.9.0"] [org.apache.mxnet.contrib.clojure/clojure-mxnet "1.3.0-SNAPSHOT"]] - :main mnist-mlp - :pedantic? :skip) + :pedantic? :skip + :main mnist-mlp) diff --git a/contrib/clojure-package/examples/module/src/mnist_mlp.clj b/contrib/clojure-package/examples/module/src/mnist_mlp.clj index 039a6eb..74edf71 100644 --- a/contrib/clojure-package/examples/module/src/mnist_mlp.clj +++ b/contrib/clojure-package/examples/module/src/mnist_mlp.clj @@ -116,7 +116,6 @@ (let [score (m/score mod {:eval-data test-data :eval-metric (eval-metric/accuracy)})] (println "High level predict score is " score)))) - (defn run-predication-and-calc-accuracy-manually [devs] ;;; Gathers all the predictions at once with `predict-every-batch` ;;; then cycles thorugh the batches and manually calculates the accuracy stats @@ -128,23 +127,23 @@ (m/fit mod {:train-data train-data :eval-data test-data :num-epoch num-epoch}) (let [preds (m/predict-every-batch mod {:eval-data test-data}) stats (mx-io/reduce-batches test-data - (fn [r b] - (let [pred-label (->> (ndarray/argmax-channel (first (get preds (:index r)))) - (ndarray/->vec) - (mapv int)) - label (->> (mx-io/batch-label b) - (first) - (ndarray/->vec) - (mapv int)) - acc-sum (apply + (mapv (fn [pl l] (if (= pl l) 1 0)) - pred-label label))] - (-> r - (update :index inc) - (update :acc-cnt (fn [v] (+ v (count pred-label)))) - (update :acc-sum (fn [v] (+ v - (apply + (mapv (fn [pl l] (if (= pl l) 1 0)) - pred-label label)))))))) - {:acc-sum 0 :acc-cnt 0 :index 0})] + (fn [r b] + (let [pred-label (->> (ndarray/argmax-channel (first (get preds (:index r)))) + (ndarray/->vec) + (mapv int)) + label (->> (mx-io/batch-label b) + (first) + (ndarray/->vec) + (mapv int)) + acc-sum (apply + (mapv (fn [pl l] (if (= pl l) 1 0)) + pred-label label))] + (-> r + (update :index inc) + (update :acc-cnt (fn [v] (+ v (count pred-label)))) + (update :acc-sum (fn [v] (+ v + (apply + (mapv (fn [pl l] (if (= pl l) 1 0)) + pred-label label)))))))) + {:acc-sum 0 :acc-cnt 0 :index 0})] (println "Stats: " stats) (println "Accuracy: " (/ (:acc-sum stats) (* 1.0 (:acc-cnt stats))))))) @@ -159,19 +158,19 @@ ;;; note only one function for training (m/fit mod {:train-data train-data :eval-data test-data :num-epoch num-epoch}) (mx-io/reduce-batches test-data - (fn [r b] - (let [preds (m/predict-batch mod b) - pred-label (->> (ndarray/argmax-channel (first preds)) - (ndarray/->vec) - (mapv int)) - label (->> (mx-io/batch-label b) - (first) - (ndarray/->vec) - (mapv int)) - acc (/ (apply + (mapv (fn [pl l] (if (= pl l) 1 0)) pred-label label)) - (* 1.0 (count pred-label)))] - (println "Batch " r " acc: " acc) - (inc r)))))) + (fn [r b] + (let [preds (m/predict-batch mod b) + pred-label (->> (ndarray/argmax-channel (first preds)) + (ndarray/->vec) + (mapv int)) + label (->> (mx-io/batch-label b) + (first) + (ndarray/->vec) + (mapv int)) + acc (/ (apply + (mapv (fn [pl l] (if (= pl l) 1 0)) pred-label label)) + (* 1.0 (count pred-label)))] + (println "Batch " r " acc: " acc) + (inc r)))))) (defn run-all [devs] (run-intermediate-level-api :devs devs) @@ -190,7 +189,6 @@ (println "Running with context devices of" devs) (run-all devs))) - (comment ;;; run all the example functions @@ -237,4 +235,3 @@ ;;=> Accuracy: 0.9494 ) - diff --git a/contrib/clojure-package/examples/multi-label/project.clj b/contrib/clojure-package/examples/multi-label/project.clj index b67178b..88e3cff 100644 --- a/contrib/clojure-package/examples/multi-label/project.clj +++ b/contrib/clojure-package/examples/multi-label/project.clj @@ -17,6 +17,7 @@ (defproject multi-label "0.1.0-SNAPSHOT" :description "Example of multi-label classification" + :plugins [[lein-cljfmt "0.5.7"]] :dependencies [[org.clojure/clojure "1.9.0"] [org.apache.mxnet.contrib.clojure/clojure-mxnet "1.3.0-SNAPSHOT"]] :main multi-label.core) diff --git a/contrib/clojure-package/examples/multi-label/src/multi_label/core.clj b/contrib/clojure-package/examples/multi-label/src/multi_label/core.clj index 0707d42..e96783d 100644 --- a/contrib/clojure-package/examples/multi-label/src/multi_label/core.clj +++ b/contrib/clojure-package/examples/multi-label/src/multi_label/core.clj @@ -30,7 +30,6 @@ (java.util NoSuchElementException)) (:gen-class)) - (def data-dir "data/") (def batch-size 100) (def num-epoch 1) @@ -101,8 +100,8 @@ (vals) last)] (util/list-map - {"softmax1_label" (mx-shape/->shape shape) - "softmax2_label" (mx-shape/->shape shape)}))) + {"softmax1_label" (mx-shape/->shape shape) + "softmax2_label" (mx-shape/->shape shape)}))) (provideData [] (.provideData data-iter))))) @@ -153,7 +152,7 @@ (update :batch-num inc)))) {:sum [0 0] :batch-num 0})] (println "Multi-accuracy " acc) - (println "Multi-accuracy "(mapv #(/ % (:batch-num acc)) (:sum acc))))))) + (println "Multi-accuracy " (mapv #(/ % (:batch-num acc)) (:sum acc))))))) (defn -main [& args] (let [[dev dev-num] args @@ -164,6 +163,5 @@ (println "Running with context devices of" devs) (train devs))) - (comment (train [(context/cpu)])) diff --git a/contrib/clojure-package/examples/neural-style/project.clj b/contrib/clojure-package/examples/neural-style/project.clj index 4daf20f..f179618 100644 --- a/contrib/clojure-package/examples/neural-style/project.clj +++ b/contrib/clojure-package/examples/neural-style/project.clj @@ -17,9 +17,9 @@ (defproject neural-style "0.1.0-SNAPSHOT" :description "Neural Style Transfer with MXNet" + :plugins [[lein-cljfmt "0.5.7"]] :dependencies [[org.clojure/clojure "1.9.0"] [org.apache.mxnet.contrib.clojure/clojure-mxnet "1.3.0-SNAPSHOT"] [net.mikera/imagez "0.12.0"] [thinktopic/think.image "0.4.16"]] - :main neural-style.core -) + :main neural-style.core) diff --git a/contrib/clojure-package/examples/neural-style/src/neural_style/core.clj b/contrib/clojure-package/examples/neural-style/src/neural_style/core.clj index 07b0a29..50f95c9 100644 --- a/contrib/clojure-package/examples/neural-style/src/neural_style/core.clj +++ b/contrib/clojure-package/examples/neural-style/src/neural_style/core.clj @@ -28,13 +28,10 @@ [mikera.image.filters :as img-filter] [think.image.pixel :as pixel] [neural-style.model-vgg-19 :as model-vgg-19]) - (:gen-class)) - - - ;; An Implementation of the paper A Neural Algorithm of Artistic Style + (:gen-class));; An Implementation of the paper A Neural Algorithm of Artistic Style ;;by Leon A. Gatys, Alexander S. Ecker, and Matthias Bethge -(def content-image "input/IMG_4343.jpg" ) +(def content-image "input/IMG_4343.jpg") (def style-image "input/starry_night.jpg") (def model-path "model/vgg19.params") (def max-long-edge 600) ;; resize the content image @@ -69,7 +66,7 @@ (let [simg (img/load-image path) _ (println "The content image is size " {:height (img/height simg) :width (img/width simg)}) factor (/ short-edge (img/width simg)) - resized-img (img/resize simg (* (img/width simg) factor) (* (img/height simg) factor) ) + resized-img (img/resize simg (* (img/width simg) factor) (* (img/height simg) factor)) new-height (img/height resized-img) new-width (img/width resized-img)] (image->ndarray resized-img))) @@ -97,29 +94,28 @@ _ (img/set-pixels new-image (int-array pixels))] new-image)) - (defn style-gram-symbol [input-size style] (let [[_ output-shape _] (sym/infer-shape style {:data [1 3 (first input-size) (second input-size)]}) output-shapes (mx-shape/->vec output-shape) {:keys [gram-list grad-scale]} (doall (reduce - (fn [result i] - (let [shape (get output-shapes i) - [s0 s1 s2 s3] shape - x (sym/reshape {:data (sym/get style i) :target-shape [s1 (* s2 s3)] }) + (fn [result i] + (let [shape (get output-shapes i) + [s0 s1 s2 s3] shape + x (sym/reshape {:data (sym/get style i) :target-shape [s1 (* s2 s3)]}) ;; use fully connected to quickly do dot(x x^T) - gram (sym/fully-connected {:data x :weight x :no-bias true :num-hidden s1})] - (-> result - (update :gram-list conj gram) - (update :grad-scale conj (* s1 s2 s3 s1))))) - {:gram-list [] :grad-scale []} - (range (count (sym/list-outputs style)))))] + gram (sym/fully-connected {:data x :weight x :no-bias true :num-hidden s1})] + (-> result + (update :gram-list conj gram) + (update :grad-scale conj (* s1 s2 s3 s1))))) + {:gram-list [] :grad-scale []} + (range (count (sym/list-outputs style)))))] {:gram (sym/group (into [] gram-list)) :g-scale grad-scale})) (defn get-loss [gram content] (let [gram-loss (doall (mapv (fn [i] - (let [gvar (sym/variable (str "target_gram_" i))] - (sym/sum (sym/square (sym/- gvar (sym/get gram i)))))) - (range (count (sym/list-outputs gram))))) + (let [gvar (sym/variable (str "target_gram_" i))] + (sym/sum (sym/square (sym/- gvar (sym/get gram i)))))) + (range (count (sym/list-outputs gram))))) cvar (sym/variable "target_content") content-loss (sym/sum (sym/square (sym/- cvar content)))] {:style-loss (sym/group gram-loss) :content-loss content-loss})) @@ -137,7 +133,6 @@ (> a 255) 255 :else a)) - (defn save-image [img filename radius blur?] (let [filtered-image (if blur? ((img-filter/box-blur blur-radius blur-radius) (postprocess-image img)) @@ -149,7 +144,7 @@ (defn get-tv-grad-executor [img ctx tv-weight] (when (pos? tv-weight) (let [img-shape (mx-shape/->vec (ndarray/shape img)) - n-channel(get img-shape 1) + n-channel (get img-shape 1) s-img (sym/variable "img") s-kernel (sym/variable "kernel") channels (sym/split {:data s-img :axis 1 :num-outputs n-channel}) @@ -162,7 +157,6 @@ out (ndarray/* out tv-weight)] (sym/bind out ctx {"img" img "kernel" kernel})))) - (defn train [devs] (let [dev (first devs) @@ -217,7 +211,7 @@ clip-norm (apply * (mx-shape/->vec (ndarray/shape img))) tv-grad-executor (get-tv-grad-executor img dev tv-weight) eps 0.0 - e 0 ] + e 0] (doseq [i (range 20)] (ndarray/set (:data model-executor) img) (-> (:executor model-executor) @@ -255,10 +249,6 @@ (println "Running with context devices of" devs) (train devs))) - - (comment - (train [(context/cpu)]) - - ) + (train [(context/cpu)])) diff --git a/contrib/clojure-package/examples/neural-style/src/neural_style/model_vgg_19.clj b/contrib/clojure-package/examples/neural-style/src/neural_style/model_vgg_19.clj index 5fa11be..e7efa8c 100644 --- a/contrib/clojure-package/examples/neural-style/src/neural_style/model_vgg_19.clj +++ b/contrib/clojure-package/examples/neural-style/src/neural_style/model_vgg_19.clj @@ -71,7 +71,6 @@ content (sym/group [relu1-1])] {:style style :content content})) - (defn get-executor [style content model-path input-size ctx] (let [out (sym/group [style content]) ;; make executor @@ -83,12 +82,12 @@ ;;; I'm not sure this is being set properly pretrained (do (ndarray/load model-path)) arg-map (into {} (mapv (fn [[k v]] - (let [pretrained-key (str "arg:" k)] - (if (and (get pretrained pretrained-key) (not= "data" k)) - (do (ndarray/set v (get pretrained pretrained-key)) - [k v]) - [k v]))) - arg-map)) + (let [pretrained-key (str "arg:" k)] + (if (and (get pretrained pretrained-key) (not= "data" k)) + (do (ndarray/set v (get pretrained pretrained-key)) + [k v]) + [k v]))) + arg-map)) exec (sym/bind out ctx arg-map grad-map) outs (executor/outputs exec)] {:executor exec diff --git a/contrib/clojure-package/examples/pre-trained-models/project.clj b/contrib/clojure-package/examples/pre-trained-models/project.clj index 254f34a..e689e9a 100644 --- a/contrib/clojure-package/examples/pre-trained-models/project.clj +++ b/contrib/clojure-package/examples/pre-trained-models/project.clj @@ -17,6 +17,7 @@ (defproject pre-trained-models "0.1.0-SNAPSHOT" :description "Example of using pre-trained models with MXNet" + :plugins [[lein-cljfmt "0.5.7"]] :dependencies [[org.clojure/clojure "1.9.0"] [org.apache.mxnet.contrib.clojure/clojure-mxnet "1.3.0-SNAPSHOT"] [net.mikera/imagez "0.12.0"] diff --git a/contrib/clojure-package/examples/pre-trained-models/src/pre_trained_models/fine_tune.clj b/contrib/clojure-package/examples/pre-trained-models/src/pre_trained_models/fine_tune.clj index a73aa30..f2b9edd 100644 --- a/contrib/clojure-package/examples/pre-trained-models/src/pre_trained_models/fine_tune.clj +++ b/contrib/clojure-package/examples/pre-trained-models/src/pre_trained_models/fine_tune.clj @@ -34,7 +34,6 @@ (def model-dir "model") (def batch-size 16) - ;;; image set is http://www.vision.caltech.edu/Image_Datasets/Caltech101/ ;; Pictures of objects belonging to 101 categories. About 40 to 800 images per category. Most categories have about 50 images @@ -49,13 +48,13 @@ :rand-mirror true})) (def val-iter (mx-io/image-record-iter - {:path-imgrec "caltech-256/caltech-256-60-val.rec" - :data-name "data" - :label-name "softmax_label" - :batch-size batch-size - :data-shape [3 224 224] - :rand-crop false - :rand-mirror false})) + {:path-imgrec "caltech-256/caltech-256-60-val.rec" + :data-name "data" + :label-name "softmax_label" + :batch-size batch-size + :data-shape [3 224 224] + :rand-crop false + :rand-mirror false})) (defn get-model [] (let [mod (m/load-checkpoint {:prefix (str model-dir "/resnet-50") :epoch 0})] @@ -104,9 +103,7 @@ (mapv #(context/gpu %) (range (Integer/parseInt (or dev-num "1")))) (mapv #(context/cpu %) (range (Integer/parseInt (or dev-num "1")))))] (println "Running with context devices of" devs) - (fine-tune! devs)) - ) - + (fine-tune! devs))) (comment @@ -126,7 +123,5 @@ ;; INFO ml.dmlc.mxnet.Callback$Speedometer: Epoch[0] Batch [120] Speed: 3.44 samples/sec Train-accuracy=0.040806 ;; INFO ml.dmlc.mxnet.Callback$Speedometer: Epoch[0] Batch [130] Speed: 3.41 samples/sec Train-accuracy=0.043893 ;; INFO ml.dmlc.mxnet.Callback$Speedometer: Epoch[0] Batch [140] Speed: 3.42 samples/sec Train-accuracy=0.045213 - ) - diff --git a/contrib/clojure-package/examples/pre-trained-models/src/pre_trained_models/predict_image.clj b/contrib/clojure-package/examples/pre-trained-models/src/pre_trained_models/predict_image.clj index ee25e4c..12bdb12 100644 --- a/contrib/clojure-package/examples/pre-trained-models/src/pre_trained_models/predict_image.clj +++ b/contrib/clojure-package/examples/pre-trained-models/src/pre_trained_models/predict_image.clj @@ -39,7 +39,6 @@ out (io/output-stream file)] (io/copy in out))) - (defn get-image [url show?] (let [fname "test-image.jpg" _ (download url fname) @@ -54,8 +53,8 @@ pixels)] (when show? (img/show image)) (-> rgb-pixels - (flatten) - (ndarray/array [1 num-channels h w])))) + (flatten) + (ndarray/array [1 num-channels h w])))) (defn predict [img-url show?] (let [mod (m/load-checkpoint {:prefix (str model-dir "/resnet-152") :epoch 0}) @@ -110,6 +109,5 @@ ;; {:prob 0.023329297, :label "n02083346 canine, canid"}) (feature-extraction) ;=> [1 2048] - - ) +) diff --git a/contrib/clojure-package/examples/profiler/project.clj b/contrib/clojure-package/examples/profiler/project.clj index ca2fad2..6ea2dfe 100644 --- a/contrib/clojure-package/examples/profiler/project.clj +++ b/contrib/clojure-package/examples/profiler/project.clj @@ -16,6 +16,7 @@ ;; (defproject profiler "0.1.0-SNAPSHOT" + :plugins [[lein-cljfmt "0.5.7"]] :dependencies [[org.clojure/clojure "1.9.0"] [org.apache.mxnet.contrib.clojure/clojure-mxnet "1.3.0-SNAPSHOT"]] :main profiler.core) diff --git a/contrib/clojure-package/examples/rnn/project.clj b/contrib/clojure-package/examples/rnn/project.clj index ff00a10..0175591 100644 --- a/contrib/clojure-package/examples/rnn/project.clj +++ b/contrib/clojure-package/examples/rnn/project.clj @@ -17,6 +17,7 @@ (defproject rnn "0.1.0-SNAPSHOT" :description "RNN example" - :main rnn.train-char-rnn + :plugins [[lein-cljfmt "0.5.7"]] :dependencies [[org.clojure/clojure "1.9.0"] - [org.apache.mxnet.contrib.clojure/clojure-mxnet "1.3.0-SNAPSHOT"]]) + [org.apache.mxnet.contrib.clojure/clojure-mxnet "1.3.0-SNAPSHOT"]] + :main rnn.train-char-rnn) diff --git a/contrib/clojure-package/examples/rnn/src/rnn/lstm.clj b/contrib/clojure-package/examples/rnn/src/rnn/lstm.clj index ec8e9e8..fb3a8f3 100644 --- a/contrib/clojure-package/examples/rnn/src/rnn/lstm.clj +++ b/contrib/clojure-package/examples/rnn/src/rnn/lstm.clj @@ -56,14 +56,14 @@ cls-weight (sym/variable "cls_weight") cls-bias (sym/variable "cls_bias") param-cells (mapv (fn [i] - (lstm-param (sym/variable (str "l" i "_i2h_weight")) - (sym/variable (str "l" i "_i2h_bias")) - (sym/variable (str "l" i "_h2h_weight")) - (sym/variable (str "l" i "_h2h_bias")))) - (range 0 num-lstm-layer)) + (lstm-param (sym/variable (str "l" i "_i2h_weight")) + (sym/variable (str "l" i "_i2h_bias")) + (sym/variable (str "l" i "_h2h_weight")) + (sym/variable (str "l" i "_h2h_bias")))) + (range 0 num-lstm-layer)) last-states (mapv (fn [i] - (lstm-state (sym/variable (str "l" i "_init_c_beta")) - (sym/variable (str "l" i "_init_h_beta")))) + (lstm-state (sym/variable (str "l" i "_init_c_beta")) + (sym/variable (str "l" i "_init_h_beta")))) (range 0 num-lstm-layer)) ;; embedding layer data (sym/variable "data") @@ -76,7 +76,7 @@ hidden-all (doall (for [seq-idx (range seq-len)] (let [hidden (:h (last (loop [i 0 hidden (sym/get wordvec seq-idx) - next-states []] + next-states []] (if (= i num-lstm-layer) next-states (let [dp-ratio (if (zero? i) 0 dropout) @@ -108,14 +108,14 @@ cls-weight (sym/variable "cls_weight") cls-bias (sym/variable "cls_bias") param-cells (mapv (fn [i] - (lstm-param (sym/variable (str "l" i "_i2h_weight")) - (sym/variable (str "l" i "_i2h_bias")) - (sym/variable (str "l" i "_h2h_weight")) - (sym/variable (str "l" i "_h2h_bias")))) - (range 0 num-lstm-layer)) + (lstm-param (sym/variable (str "l" i "_i2h_weight")) + (sym/variable (str "l" i "_i2h_bias")) + (sym/variable (str "l" i "_h2h_weight")) + (sym/variable (str "l" i "_h2h_bias")))) + (range 0 num-lstm-layer)) last-states (mapv (fn [i] - (lstm-state (sym/variable (str "l" i "_init_c_beta")) - (sym/variable (str "l" i "_init_h_beta")))) + (lstm-state (sym/variable (str "l" i "_init_c_beta")) + (sym/variable (str "l" i "_init_h_beta")))) (range 0 num-lstm-layer)) data (sym/variable "data") dp-ratio 0 diff --git a/contrib/clojure-package/examples/rnn/src/rnn/test_char_rnn.clj b/contrib/clojure-package/examples/rnn/src/rnn/test_char_rnn.clj index 35e1a18..d03b1a6 100644 --- a/contrib/clojure-package/examples/rnn/src/rnn/test_char_rnn.clj +++ b/contrib/clojure-package/examples/rnn/src/rnn/test_char_rnn.clj @@ -37,11 +37,11 @@ (let [trained-mod (m/load-checkpoint {:prefix model-prefix :epoch epoch-num}) trained-arg-params (m/arg-params trained-mod) model (lstm/lstm-inference-model {:num-lstm-layer 3 - :input-size (inc (count vocab)) - :num-label (inc (count vocab)) - :num-hidden num-hidden - :num-embed num-embed - :arg-params trained-arg-params}) + :input-size (inc (count vocab)) + :num-label (inc (count vocab)) + :num-hidden num-hidden + :num-embed num-embed + :arg-params trained-arg-params}) input-ndarray (ndarray/zeros [1]) revert-vocab (util/make-revert-vocab vocab) fix-dict (into [""] @@ -68,7 +68,6 @@ output (str output next-char))))))))) - (comment (rnn-test "data/obama" 75 200 false) @@ -76,4 +75,4 @@ (rnn-test "data/obama" 75 200 true) ;=>"The joke before them prepared for five years ago, we only hear a chance to lose our efforts and they made striggling procedural deficit at the city between a politics in the efforts on the Edmund Pett" - ) +) diff --git a/contrib/clojure-package/examples/rnn/src/rnn/train_char_rnn.clj b/contrib/clojure-package/examples/rnn/src/rnn/train_char_rnn.clj index d246760..29aba26 100644 --- a/contrib/clojure-package/examples/rnn/src/rnn/train_char_rnn.clj +++ b/contrib/clojure-package/examples/rnn/src/rnn/train_char_rnn.clj @@ -69,15 +69,15 @@ (defn build-training-data [path] - (let [content (slurp path) - sentences (string/split content #"\n") - max-length (first buckets) - padding-int 0] - (doall (for [sentence sentences] - (let [ids (mapv #(get vocab %) sentence)] - (if (>= (count ids) max-length) - (into [] (take max-length ids)) - (into ids (repeat (- max-length (count ids)) 0)))))))) + (let [content (slurp path) + sentences (string/split content #"\n") + max-length (first buckets) + padding-int 0] + (doall (for [sentence sentences] + (let [ids (mapv #(get vocab %) sentence)] + (if (>= (count ids) max-length) + (into [] (take max-length ids)) + (into ids (repeat (- max-length (count ids)) 0)))))))) (defn build-labels [train-data] ;; want to learn the next char some rotate by 1 @@ -90,7 +90,6 @@ (first) (apply hash-map))) - (defn train [devs] (let [;; initialize the states for the lstm init-c (into {} (map (fn [l] @@ -118,7 +117,7 @@ rnn-mod (-> (m/module rnn-sym {:contexts devs}) (m/bind {:data-shapes (into (mx-io/provide-data train-iter) - (mapv (fn [[k v]] {:name k :shape v}) init-states)) + (mapv (fn [[k v]] {:name k :shape v}) init-states)) :label-shapes (mx-io/provide-label train-iter)}) (m/init-params {:initializer (init/xavier {:factor-type "in" :magnitude 2.34})}) (m/init-optimizer {:optimizer (optimizer/adam {:learning-rate learning-rate :wd 0.0001})})) @@ -138,8 +137,7 @@ (mapv #(Math/log %)) (mapv #(* -1.0 %)) (apply +))] - (float (Math/exp (/ result (count labels))))) - ) + (float (Math/exp (/ result (count labels)))))) "perplexity")] @@ -151,11 +149,11 @@ (fn [batch-num batch] (let [batch (mx-io/next train-iter)] (-> rnn-mod - (m/forward (mx-io/data-batch {:data (into (mx-io/batch-data batch) init-states-data) - :label (mx-io/batch-label batch)})) - (m/update-metric metric (mx-io/batch-label batch)) - (m/backward) - (m/update)) + (m/forward (mx-io/data-batch {:data (into (mx-io/batch-data batch) init-states-data) + :label (mx-io/batch-label batch)})) + (m/update-metric metric (mx-io/batch-label batch)) + (m/backward) + (m/update)) (when (zero? (mod batch-num 10)) (println "Eval metric for batch-num " batch-num " is " (eval-metric/get metric))) (inc batch-num)))) @@ -171,7 +169,6 @@ (println (test-rnn/rnn-test "data/obama" 75 200 true)) (println "====="))) - (defn -main [& args] (let [[dev dev-num] args devs (if (= dev ":gpu") diff --git a/contrib/clojure-package/examples/rnn/src/rnn/util.clj b/contrib/clojure-package/examples/rnn/src/rnn/util.clj index 27e2132..bce5bb7 100644 --- a/contrib/clojure-package/examples/rnn/src/rnn/util.clj +++ b/contrib/clojure-package/examples/rnn/src/rnn/util.clj @@ -21,13 +21,13 @@ (defn build-vocab [path] (let [content (slurp path) vocab-map (reduce (fn [{:keys [vocab idx] :as result} c] - (if (get vocab c) - result - (-> result - (update :vocab assoc c (inc idx)) - (update :idx inc)))) - {:vocab {} :idx 0} ;; 0 is used for padding - content)] + (if (get vocab c) + result + (-> result + (update :vocab assoc c (inc idx)) + (update :idx inc)))) + {:vocab {} :idx 0} ;; 0 is used for padding + content)] (:vocab vocab-map))) (defn make-revert-vocab [vmap] @@ -42,10 +42,9 @@ (defn cdf [weights] (let [total (* 1.0 (apply + weights)) - csums (reduce (fn [cumsum w] (conj cumsum (+ (or (last cumsum) 0) w)) ) [] weights)] + csums (reduce (fn [cumsum w] (conj cumsum (+ (or (last cumsum) 0) w))) [] weights)] (mapv #(/ % total) csums))) - (defn choice [population weights] (assert (= (count population) (count weights))) (let [cdf-vals (cdf weights) diff --git a/contrib/clojure-package/examples/tutorial/project.clj b/contrib/clojure-package/examples/tutorial/project.clj index 027c1d3..ab7606e 100644 --- a/contrib/clojure-package/examples/tutorial/project.clj +++ b/contrib/clojure-package/examples/tutorial/project.clj @@ -17,5 +17,6 @@ (defproject tutorial "0.1.0-SNAPSHOT" :description "MXNET tutorials" + :plugins [[lein-cljfmt "0.5.7"]] :dependencies [[org.clojure/clojure "1.9.0"] [org.apache.mxnet.contrib.clojure/clojure-mxnet "1.3.0-SNAPSHOT"]]) diff --git a/contrib/clojure-package/examples/tutorial/src/tutorial/kvstore.clj b/contrib/clojure-package/examples/tutorial/src/tutorial/kvstore.clj index 5780ac2..558b21f 100644 --- a/contrib/clojure-package/examples/tutorial/src/tutorial/kvstore.clj +++ b/contrib/clojure-package/examples/tutorial/src/tutorial/kvstore.clj @@ -48,7 +48,7 @@ (def cpus [(context/cpu 0) (context/cpu 1) (context/cpu 2)]) (def b [(ndarray/ones shape {:ctx (nth cpus 0)}) (ndarray/ones shape {:ctx (nth cpus 1)}) - (ndarray/ones shape {:ctx (nth cpus 2)}) ]) + (ndarray/ones shape {:ctx (nth cpus 2)})]) (kvstore/push kv ["3" "3" "3"] b) (kvstore/pull kv "3" a) (ndarray/->vec a) ;=> [3.0 3.0 3.0 3.0 3.0 3.0] @@ -57,7 +57,7 @@ ;;Pull ;;You’ve already seen how to pull a single key-value pair. Similar to the way that you use the push command, you can pull the value into several devices with a single call. (def b [(ndarray/ones shape {:ctx (context/cpu 0)}) - (ndarray/ones shape {:ctx (context/cpu 1)}) ]) + (ndarray/ones shape {:ctx (context/cpu 1)})]) (kvstore/pull kv ["3" "3"] b) (map ndarray/->vec b) ;=> ([3.0 3.0 3.0 3.0 3.0 3.0] [3.0 3.0 3.0 3.0 3.0 3.0]) @@ -67,7 +67,7 @@ (def ks ["5" "7" "9"]) (kvstore/init kv ks [(ndarray/ones shape) (ndarray/ones shape) (ndarray/ones shape)]) (kvstore/push kv ks [(ndarray/ones shape) (ndarray/ones shape) (ndarray/ones shape)]) -(def b [(ndarray/zeros shape) (ndarray/zeros shape)(ndarray/zeros shape)]) +(def b [(ndarray/zeros shape) (ndarray/zeros shape) (ndarray/zeros shape)]) (kvstore/pull kv ks b) (map ndarray/->vec b);=> ([1.0 1.0 1.0 1.0 1.0 1.0] [1.0 1.0 1.0 1.0 1.0 1.0] [1.0 1.0 1.0 1.0 1.0 1.0]) diff --git a/contrib/clojure-package/examples/tutorial/src/tutorial/module.clj b/contrib/clojure-package/examples/tutorial/src/tutorial/module.clj index ad5ff13..0009a01 100644 --- a/contrib/clojure-package/examples/tutorial/src/tutorial/module.clj +++ b/contrib/clojure-package/examples/tutorial/src/tutorial/module.clj @@ -31,14 +31,14 @@ ;;; Load the MNIST datasets (def train-data (mx-io/mnist-iter {:image (str data-dir "train-images-idx3-ubyte") - :label (str data-dir "train-labels-idx1-ubyte") - :label-name "softmax_label" - :input-shape [784] - :batch-size 10 - :shuffle true - :flat true - :silent false - :seed 10})) + :label (str data-dir "train-labels-idx1-ubyte") + :label-name "softmax_label" + :input-shape [784] + :batch-size 10 + :shuffle true + :flat true + :silent false + :seed 10})) (def test-data (mx-io/mnist-iter {:image (str data-dir "t10k-images-idx3-ubyte") :label (str data-dir "t10k-labels-idx1-ubyte") @@ -131,10 +131,10 @@ (let [save-prefix "my-model"] (doseq [epoch-num (range 3)] - (mx-io/do-batches train-data (fn [batch + (mx-io/do-batches train-data (fn [batch ;; do something - ])) - (m/save-checkpoint mod {:prefix save-prefix :epoch epoch-num :save-opt-states true}))) +])) + (m/save-checkpoint mod {:prefix save-prefix :epoch epoch-num :save-opt-states true}))) ;; INFO ml.dmlc.mxnet.module.Module: Saved checkpoint to my-model-0000.params ;; INFO ml.dmlc.mxnet.module.Module: Saved optimizer state to my-model-0000.states @@ -155,8 +155,8 @@ ;;To get current parameters, use `params` (let [[arg-params aux-params] (m/params new-mod)] - {:arg-params arg-params - :aux-params aux-params}) + {:arg-params arg-params + :aux-params aux-params}) ;; {:arg-params ;; {"fc3_bias" @@ -190,30 +190,3 @@ ;;Create fit-params, and then use it to set `begin-epoch` so that fit() knows to resume from a saved epoch. - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/contrib/clojure-package/examples/visualization/project.clj b/contrib/clojure-package/examples/visualization/project.clj index 6dc7c49..99d0e40 100644 --- a/contrib/clojure-package/examples/visualization/project.clj +++ b/contrib/clojure-package/examples/visualization/project.clj @@ -17,6 +17,7 @@ (defproject visualization "0.1.0-SNAPSHOT" :description "Visualization example" - :main visualization.core + :plugins [[lein-cljfmt "0.5.7"]] :dependencies [[org.clojure/clojure "1.9.0"] - [org.apache.mxnet.contrib.clojure/clojure-mxnet "1.3.0-SNAPSHOT"]]) + [org.apache.mxnet.contrib.clojure/clojure-mxnet "1.3.0-SNAPSHOT"]] + :main visualization.core) diff --git a/contrib/clojure-package/examples/visualization/src/visualization/core.clj b/contrib/clojure-package/examples/visualization/src/visualization/core.clj index 58980a0..31cce92 100644 --- a/contrib/clojure-package/examples/visualization/src/visualization/core.clj +++ b/contrib/clojure-package/examples/visualization/src/visualization/core.clj @@ -25,10 +25,7 @@ #_(sym/convolution "conv1" {:data data :kernel [3 3] :num-filter 32 :stride [2 2]}) #_(sym/batch-norm "bn1" {:data data}) #_(sym/activation "relu1" {:data data :act-type "relu"}) - #_(sym/pooling "mp1" {:data data :kernel [2 2] :pool-type "max" :stride [2 2]}) - - - #_(sym/convolution "conv2" {:data data :kernel [3 3] :num-filter 32 :stride [2 2]}) + #_(sym/pooling "mp1" {:data data :kernel [2 2] :pool-type "max" :stride [2 2]}) #_(sym/convolution "conv2" {:data data :kernel [3 3] :num-filter 32 :stride [2 2]}) #_(sym/batch-norm "bn2" {:data data}) #_(sym/activation "relu2" {:data data :act-type "relu"}) #_(sym/pooling "mp2" {:data data :kernel [2 2] :pool-type "max" :stride [2 2]}) @@ -39,12 +36,11 @@ (defn test-viz [] (let [dot (viz/plot-network (get-symbol) - {"data" [1 1 28 28]} - {:title "foo" :node-attrs {:shape "oval" :fixedsize "false"}})] + {"data" [1 1 28 28]} + {:title "foo" :node-attrs {:shape "oval" :fixedsize "false"}})] (viz/render dot "testviz" "./"))) (defn -main [& args] (do (test-viz) (println "Check for the testviz.pdf file in the project directory"))) - diff --git a/contrib/clojure-package/vi ci-test.sh b/contrib/clojure-package/lein-cljfmt-check old mode 100644 new mode 100755 similarity index 73% copy from contrib/clojure-package/vi ci-test.sh copy to contrib/clojure-package/lein-cljfmt-check index dc12f13..93f2d3c --- a/contrib/clojure-package/vi ci-test.sh +++ b/contrib/clojure-package/lein-cljfmt-check @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env sh # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file @@ -17,8 +17,8 @@ # specific language governing permissions and limitations # under the License. +set -vx -set -evx - -cd contrib/clojure-package -lein test +lein cljfmt check `find ./src/org/apache/clojure_mxnet -depth 1 -type f -iname "*.clj" | grep -v /gen/` +lein cljfmt check `find ./test -type f -iname "*.clj" | grep -v /test/good-test` +lein cljfmt check `find ./examples -type f -iname "*.clj" | grep -v /scripts/` diff --git a/contrib/clojure-package/vi ci-test.sh b/contrib/clojure-package/lein-cljfmt-fix old mode 100644 new mode 100755 similarity index 74% rename from contrib/clojure-package/vi ci-test.sh rename to contrib/clojure-package/lein-cljfmt-fix index dc12f13..8c35892 --- a/contrib/clojure-package/vi ci-test.sh +++ b/contrib/clojure-package/lein-cljfmt-fix @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env sh # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file @@ -17,8 +17,8 @@ # specific language governing permissions and limitations # under the License. - set -evx -cd contrib/clojure-package -lein test +lein cljfmt fix `find ./src/org/apache/clojure_mxnet -type f -iname "*.clj" | grep -v /gen/` +lein cljfmt fix `find ./test -type f -iname "*.clj" | grep -v /test/good-test` +lein cljfmt fix `find ./examples -type f -iname "*.clj" | grep -v /scripts/` diff --git a/contrib/clojure-package/project.clj b/contrib/clojure-package/project.clj index 42da163..5d94fa7 100644 --- a/contrib/clojure-package/project.clj +++ b/contrib/clojure-package/project.clj @@ -34,7 +34,8 @@ [org.slf4j/slf4j-log4j12 "1.7.25" :exclusions [org.slf4j/slf4j-api]]] :pedantic? :skip :plugins [[lein-codox "0.10.3" :exclusions [org.clojure/clojure]] - [lein-cloverage "1.0.10" :exclusions [org.clojure/clojure]]] + [lein-cloverage "1.0.10" :exclusions [org.clojure/clojure]] + [lein-cljfmt "0.5.7"]] :codox {:namespaces [#"^org\.apache\.clojure-mxnet\.(?!gen).*"]} :aot [dev.generator] :repositories [["staging" {:url "https://repository.apache.org/content/repositories/staging" diff --git a/contrib/clojure-package/src/org/apache/clojure_mxnet/callback.clj b/contrib/clojure-package/src/org/apache/clojure_mxnet/callback.clj index d1c6d88..c007720 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/callback.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/callback.clj @@ -18,7 +18,6 @@ (ns org.apache.clojure-mxnet.callback (:import (org.apache.mxnet Callback$Speedometer))) - ;;; used to track status during epoch (defn speedometer diff --git a/contrib/clojure-package/src/org/apache/clojure_mxnet/context.clj b/contrib/clojure-package/src/org/apache/clojure_mxnet/context.clj index f89fd58..126838c 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/context.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/context.clj @@ -18,7 +18,6 @@ (ns org.apache.clojure-mxnet.context (:import (org.apache.mxnet Context))) - (defn cpu ([device-id] (new Context "cpu" device-id)) diff --git a/contrib/clojure-package/src/org/apache/clojure_mxnet/dtype.clj b/contrib/clojure-package/src/org/apache/clojure_mxnet/dtype.clj index d21fe7f..1d96c22 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/dtype.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/dtype.clj @@ -18,7 +18,6 @@ (ns org.apache.clojure-mxnet.dtype (:import (org.apache.mxnet DType))) - (def UINT8 (DType/UInt8)) (def INT32 (DType/Int32)) (def FLOAT16 (DType/Float16)) diff --git a/contrib/clojure-package/src/org/apache/clojure_mxnet/eval_metric.clj b/contrib/clojure-package/src/org/apache/clojure_mxnet/eval_metric.clj index 3cddb1f..1946103 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/eval_metric.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/eval_metric.clj @@ -20,7 +20,6 @@ (:require [org.apache.clojure-mxnet.util :as util]) (:import (org.apache.mxnet Accuracy TopKAccuracy F1 Perplexity MAE MSE RMSE CustomMetric))) - (defn accuracy "Basic Accuracy Metric" [] diff --git a/contrib/clojure-package/src/org/apache/clojure_mxnet/executor.clj b/contrib/clojure-package/src/org/apache/clojure_mxnet/executor.clj index d1f8df9..4f4155e 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/executor.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/executor.clj @@ -21,7 +21,6 @@ [org.apache.clojure-mxnet.ndarray :as ndarray] [org.apache.clojure-mxnet.shape :as mx-shape])) - ;; need to revisit to get all functions (defn ->vec [nd-array] @@ -96,7 +95,7 @@ (do (let [kwargs-shapes (zipmap (keys kwargs) (mapv (fn [v] (if (vector? v) (mx-shape/->shape v) v)) (vals kwargs)))] - (.reshape executor partial-shaping allow-up-sizing (util/convert-map kwargs-shapes))) + (.reshape executor partial-shaping allow-up-sizing (util/convert-map kwargs-shapes))) executor)) ([executor kwargs] (reshape executor kwargs {}))) diff --git a/contrib/clojure-package/src/org/apache/clojure_mxnet/initializer.clj b/contrib/clojure-package/src/org/apache/clojure_mxnet/initializer.clj index 58413c8..a161759 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/initializer.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/initializer.clj @@ -20,7 +20,7 @@ (:import (org.apache.mxnet Uniform Normal Xavier))) (defn uniform - "Initialize the weight with uniform [-scale, scale] + "Initialize the weight with uniform [-scale, scale] scale - The scale of uniform distribution" ([scale] (new Uniform (float scale))) @@ -41,9 +41,9 @@ factor-type - 'avg' 'in' or 'out' magnitude - scale of random number range " ([{:keys [rand-type factor-type magnitude :as opts] - :or {rand-type "uniform" - factor-type "avg" - magnitude 3}}] + :or {rand-type "uniform" + factor-type "avg" + magnitude 3}}] (new Xavier rand-type factor-type (float magnitude))) ([] (xavier {}))) diff --git a/contrib/clojure-package/src/org/apache/clojure_mxnet/io.clj b/contrib/clojure-package/src/org/apache/clojure_mxnet/io.clj index 2f73beb..d6f1499 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/io.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/io.clj @@ -27,7 +27,6 @@ (:import (org.apache.mxnet IO DataDesc DataBatch NDArray) (org.apache.mxnet.io ResizeIter PrefetchingIter NDArrayIter MXDataIter))) - (defn batches "Convert the data-pack to a batch seq" [data-pack] @@ -56,19 +55,19 @@ (defn iterator [data-pack] (.iterator data-pack)) -(defn resize-iter [iter nbatch ]) +(defn resize-iter [iter nbatch]) (defn provide-data [pack-iterator] - (->> pack-iterator - (.provideData) - (util/scala-map->map) - (mapv (fn [[k v]] {:name k :shape (mx-shape/->vec v)})))) + (->> pack-iterator + (.provideData) + (util/scala-map->map) + (mapv (fn [[k v]] {:name k :shape (mx-shape/->vec v)})))) (defn provide-label [pack-iterator] - (->> pack-iterator - (.provideLabel) - (util/scala-map->map) - (mapv (fn [[k v]] {:name k :shape (mx-shape/->vec v)})))) + (->> pack-iterator + (.provideLabel) + (util/scala-map->map) + (mapv (fn [[k v]] {:name k :shape (mx-shape/->vec v)})))) (defn reset [iterator] (.reset iterator)) @@ -89,7 +88,7 @@ (util/scala-vector->vec (.initLabel iterator))) (defmacro do-batches [iter f] - "Takes an iterator and a function of one argument. The iterator will be reset and run thhrough all the batches with the batch passed to the function argument. nil is returned" + "Takes an iterator and a function of one argument. The iterator will be reset and run thhrough all the batches with the batch passed to the function argument. nil is returned" `(do (reset ~iter) (loop [it# ~iter] @@ -126,48 +125,48 @@ `(reduce-batches ~iter ~f 0))) (defn - csv-iter - ([kwargs] - (util/apply-scala-fn (IO/CSVIter) (util/convert-io-map kwargs)))) + csv-iter + ([kwargs] + (util/apply-scala-fn (IO/CSVIter) (util/convert-io-map kwargs)))) (defn - csv-pack - ([kwargs] - (util/apply-scala-fn (IO/CSVPack) (util/convert-io-map kwargs)))) + csv-pack + ([kwargs] + (util/apply-scala-fn (IO/CSVPack) (util/convert-io-map kwargs)))) (defn - image-recode-pack - ([kwargs] - (util/apply-scala-fn - (IO/ImageRecodePack) - (util/convert-io-map kwargs)))) + image-recode-pack + ([kwargs] + (util/apply-scala-fn + (IO/ImageRecodePack) + (util/convert-io-map kwargs)))) (defn - image-record-iter - ([kwargs] - (util/apply-scala-fn - (IO/ImageRecordIter) - (util/convert-io-map kwargs)))) + image-record-iter + ([kwargs] + (util/apply-scala-fn + (IO/ImageRecordIter) + (util/convert-io-map kwargs)))) (defn - mnist-iter - ([kwargs] - (util/apply-scala-fn (IO/MNISTIter) (util/convert-io-map kwargs)))) + mnist-iter + ([kwargs] + (util/apply-scala-fn (IO/MNISTIter) (util/convert-io-map kwargs)))) (defn - mnist-pack - ([kwargs] - (util/apply-scala-fn (IO/MNISTPack) (util/convert-io-map kwargs)))) + mnist-pack + ([kwargs] + (util/apply-scala-fn (IO/MNISTPack) (util/convert-io-map kwargs)))) (defn - create-iterator - ([iter-name kwargs-map] - (util/coerce-return (IO/createIterator iter-name (util/convert-io-map kwargs-map))))) + create-iterator + ([iter-name kwargs-map] + (util/coerce-return (IO/createIterator iter-name (util/convert-io-map kwargs-map))))) (defn - create-mx-data-pack - ([pack-name kwargs-map] - (util/coerce-return (IO/createMXDataPack pack-name (util/convert-io-map kwargs-map))))) + create-mx-data-pack + ([pack-name kwargs-map] + (util/coerce-return (IO/createMXDataPack pack-name (util/convert-io-map kwargs-map))))) (defn resize-iter "* Resize a data iterator to given number of batches per epoch. @@ -233,7 +232,6 @@ (s/def ::dtype #{dtype/UINT8 dtype/INT32 dtype/FLOAT16 dtype/FLOAT32 dtype/FLOAT64}) (s/def ::data-desc (s/keys :req-un [::name ::shape] :opt-un [::dtype ::layout])) - ;; NCHW is N:batch size C: channel H: height W: width ;;; other layouts are ;; NT, TNC, nad N @@ -249,7 +247,7 @@ (= 3 sc) "TNC" (= 4 sc) "NCHW" :else (apply str (repeat sc "?"))))] - (new DataDesc name (mx-shape/->shape shape) dtype layout))) + (new DataDesc name (mx-shape/->shape shape) dtype layout))) ([name shape] (data-desc {:name name :shape shape}))) @@ -276,40 +274,40 @@ ;; provided-data and provided label is a map of name to shape to indicate the order of the data/label loading (util/validate! ::data-batch info "Invalid data batch") (new DataBatch - (util/vec->indexed-seq data) - (util/vec->indexed-seq label) - (util/vec->indexed-seq index) - (int pad) - bucket-key - (when provided-data (util/list-map provided-data)) - (when provided-label(util/list-map provided-label)))) + (util/vec->indexed-seq data) + (util/vec->indexed-seq label) + (util/vec->indexed-seq index) + (int pad) + bucket-key + (when provided-data (util/list-map provided-data)) + (when provided-label (util/list-map provided-label)))) (defn rand-iter "A implementation of a random noise iterator Instead of data pass in the shape vector of the noise shape" ([shape-vec {:keys [label data-batch-size shuffle last-batch-handle data-name label-name] :as opts - :or {label nil - data-batch-size 1 - shuffle false - last-batch-handle "pad" - data-name "rand" - label-name "label"}}] + :or {label nil + data-batch-size 1 + shuffle false + last-batch-handle "pad" + data-name "rand" + label-name "label"}}] (let [data [(ndarray/ones shape-vec)]] - (proxy [NDArrayIter] - [(util/vec->indexed-seq data) - (if label (util/vec->indexed-seq label) (util/empty-indexed-seq)) - (int data-batch-size) - shuffle - last-batch-handle - data-name - label-name] - (provideData [] - (util/list-map {data-name (mx-shape/->vec (ndarray/shape (first data)))})) - (provideLabel [] (util/empty-list-map)) - (hasNext [] true) - (getData - ([] (util/vec->indexed-seq [(random/normal 0 1 (mx-shape/->vec (ndarray/shape (first data))))]))) - (getLabel - ([] (util/vec->indexed-seq [])))))) + (proxy [NDArrayIter] + [(util/vec->indexed-seq data) + (if label (util/vec->indexed-seq label) (util/empty-indexed-seq)) + (int data-batch-size) + shuffle + last-batch-handle + data-name + label-name] + (provideData [] + (util/list-map {data-name (mx-shape/->vec (ndarray/shape (first data)))})) + (provideLabel [] (util/empty-list-map)) + (hasNext [] true) + (getData + ([] (util/vec->indexed-seq [(random/normal 0 1 (mx-shape/->vec (ndarray/shape (first data))))]))) + (getLabel + ([] (util/vec->indexed-seq [])))))) ([shape-vec] (rand-iter shape-vec {}))) diff --git a/contrib/clojure-package/src/org/apache/clojure_mxnet/kvstore.clj b/contrib/clojure-package/src/org/apache/clojure_mxnet/kvstore.clj index 574bd77..ea7e7f9 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/kvstore.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/kvstore.clj @@ -40,7 +40,6 @@ [kvstore] (.dispose kvstore)) - (s/def ::ks (s/or :string string? :vec-of-string (s/coll-of string? :kind vector?))) (s/def ::ndarray #(instance? NDArray %)) @@ -83,10 +82,10 @@ (util/validate! ::priority priority "Invalid priority") (let [store-vals (if (vector? vs) vs [vs]) store-keys (if (vector? ks) ks (into [] (repeat (count store-vals) ks)))] - (doto kvstore - (.push (into-array store-keys) - (into-array store-vals) - (int priority))))) + (doto kvstore + (.push (into-array store-keys) + (into-array store-vals) + (int priority))))) ([kvstore ks vs] (push kvstore ks vs 0))) @@ -113,10 +112,10 @@ (util/validate! ::priority priority "Invalid priority") (let [store-vals (if (vector? outs) outs [outs]) store-keys (if (vector? ks) ks (into [] (repeat (count store-vals) ks)))] - (doto kvstore - (.pull (into-array store-keys) - (into-array store-vals) - (int priority))))) + (doto kvstore + (.pull (into-array store-keys) + (into-array store-vals) + (int priority))))) ([kvstore ks outs] (pull kvstore ks outs 0))) @@ -183,7 +182,6 @@ (doto kvstore (.sendCommandToServers (int head) body))) - (s/def ::fname string?) (defn save-optimizer-states diff --git a/contrib/clojure-package/src/org/apache/clojure_mxnet/kvstore_server.clj b/contrib/clojure-package/src/org/apache/clojure_mxnet/kvstore_server.clj index 7fa116d..ffce70a 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/kvstore_server.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/kvstore_server.clj @@ -21,14 +21,12 @@ [clojure.spec.alpha :as s]) (:import (org.apache.mxnet KVStoreServer))) - (s/def ::env-map (s/map-of string? string?)) (defn init [env-map] (util/validate! ::env-map env-map "Invalid environment map") (KVStoreServer/init (util/convert-map env-map))) - (s/def ::die-if-others-go-out-timeout int?) (defn start diff --git a/contrib/clojure-package/src/org/apache/clojure_mxnet/lr_scheduler.clj b/contrib/clojure-package/src/org/apache/clojure_mxnet/lr_scheduler.clj index d08c40e..d396540 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/lr_scheduler.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/lr_scheduler.clj @@ -18,7 +18,6 @@ (ns org.apache.clojure-mxnet.lr-scheduler (:import (org.apache.mxnet FactorScheduler))) - (defn factor-scheduler "Assume the weight has been updated by n times, then the learning rate will be base_lr * factor^^(floor(n/step)) diff --git a/contrib/clojure-package/src/org/apache/clojure_mxnet/module.clj b/contrib/clojure-package/src/org/apache/clojure_mxnet/module.clj index 42d206a..22ab761 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/module.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/module.clj @@ -33,7 +33,6 @@ (org.apache.mxnet Initializer Optimizer NDArray DataBatch Context EvalMetric Monitor Callback$Speedometer DataDesc))) - (defn module "Module is a basic module that wrap a symbol. sym : Symbol definition. @@ -131,7 +130,7 @@ (s/def ::force-init boolean?) (s/def ::allow-extra boolean?) (s/def ::init-params-opts (s/keys :opt-un [::initializer ::arg-params ::aux-params - ::force-init ::allow-extra])) + ::force-init ::allow-extra])) (defn init-params " Initialize the parameters and auxiliary states. @@ -190,7 +189,6 @@ ([mod] (init-optimizer mod {}))) - (defn forward "Forward computation. data-batch - input data of form io/data-batch either map or DataBatch @@ -206,7 +204,6 @@ ([mod data-batch-map] (forward mod data-batch-map nil))) - (s/def ::ndarray #(instance? NDArray %)) (s/def ::out-grads (s/nilable (s/coll-of ::ndarray))) @@ -299,7 +296,6 @@ ([mod prefix epoch] (save-checkpoint mod {:prefix prefix :epoch epoch}))) - (s/def ::load-optimizer-states boolean?) (s/def ::data-names (s/coll-of string? :kind vector?)) (s/def ::label-names (s/coll-of string? :kind vector?)) @@ -419,7 +415,6 @@ (doto mod (.installMonitor monitor))) - (defn borrow-optimizer "Borrow optimizer from a shared module. Used in bucketing, where exactly the same optimizer (esp. kvstore) is used. @@ -446,11 +441,9 @@ (doto mod (.loadOptimzerStates fname))) - (s/def ::eval-metric #(instance? EvalMetric %)) (s/def ::labels (s/coll-of ::ndarray :kind vector?)) - (defn update-metric "Evaluate and accumulate evaluation metric on outputs of the last forward computation. - mod module @@ -462,7 +455,6 @@ (doto mod (.updateMetric eval-metric (util/vec->indexed-seq labels)))) - (s/def ::begin-epoch int?) (s/def ::validation-metric ::eval-metric) (s/def ::monitor #(instance? Monitor %)) @@ -472,7 +464,6 @@ ::force-init ::begin-epoch ::validation-metric ::monitor ::batch-end-callback])) - ;; callbacks are not supported for now (defn fit-params "Fit Params" @@ -490,23 +481,22 @@ begin-epoch 0}}] (util/validate! ::fit-params-opts opts "Invalid fit param opts") (doto (new FitParams) - (.setEvalMetric eval-metric) - (.setKVStore kvstore) - (.setOptimizer optimizer) - (.setInitializer initializer) - (.setArgParams (some-> arg-params (util/convert-map))) - (.setAuxParams (some-> aux-params (util/convert-map))) - (.setAllowMissing allow-missing) - (.setForceRebind force-rebind) - (.setForceInit force-init) - (.setBeginEpoch (int begin-epoch)) - (.setValidationMetric validation-metric) - (.setMonitor monitor) - (.setBatchEndCallback batch-end-callback))) + (.setEvalMetric eval-metric) + (.setKVStore kvstore) + (.setOptimizer optimizer) + (.setInitializer initializer) + (.setArgParams (some-> arg-params (util/convert-map))) + (.setAuxParams (some-> aux-params (util/convert-map))) + (.setAllowMissing allow-missing) + (.setForceRebind force-rebind) + (.setForceInit force-init) + (.setBeginEpoch (int begin-epoch)) + (.setValidationMetric validation-metric) + (.setMonitor monitor) + (.setBatchEndCallback batch-end-callback))) ([] (new FitParams))) - (s/def ::mx-data-iter #(instance? MXDataIter %)) (s/def ::ndarray-iter #(instance? NDArrayIter %)) (s/def ::train-data (s/or :mx-iter ::mx-data-iter :ndarry-iter ::ndarray-iter)) @@ -515,7 +505,6 @@ (s/def ::fit-params #(instance? FitParams %)) (s/def ::fit-options (s/keys :req-un [::train-data] :opt-un [::eval-data ::num-epoch ::fit-params])) - ;;; High Level API (defn score @@ -556,8 +545,8 @@ - num-epoch Number of epochs to run training. - f-params Extra parameters for training (See fit-params)." [mod {:keys [train-data eval-data num-epoch fit-params] :as opts - ` :or {num-epoch 1 - fit-params (new FitParams)}}] + `:or {num-epoch 1 + fit-params (new FitParams)}}] (util/validate! ::fit-options opts "Invalid options for fit") (let [fmod (-> mod (bind {:data-shapes (mx-io/provide-data train-data) @@ -576,37 +565,37 @@ val-metric (or (util/option->value (.validationMetric fit-params)) (eval-metric/accuracy))] (doseq [i (range num-epoch)] (let [tic (System/currentTimeMillis)] - (mx-io/reduce-batches train-data - (fn [batch-num batch] - (-> fmod - (forward batch) - (backward) - (update) - (update-metric eval-metric (mx-io/batch-label batch))) - (when-let [cb (util/option->value (.batchEndCallback fit-params))] - (callback/invoke cb i batch-num eval-metric)) - (.dispose batch) - (inc batch-num))) - (println "Epoch " i " Train-" (eval-metric/get eval-metric)) - (println "Epoch " i " Time cost-" (- (System/currentTimeMillis) tic)) + (mx-io/reduce-batches train-data + (fn [batch-num batch] + (-> fmod + (forward batch) + (backward) + (update) + (update-metric eval-metric (mx-io/batch-label batch))) + (when-let [cb (util/option->value (.batchEndCallback fit-params))] + (callback/invoke cb i batch-num eval-metric)) + (.dispose batch) + (inc batch-num))) + (println "Epoch " i " Train-" (eval-metric/get eval-metric)) + (println "Epoch " i " Time cost-" (- (System/currentTimeMillis) tic)) ;;sync across kvstores - (get-params fmod) - (when-let [cb (util/option->value (.epochEndCallback fit-params))] - (callback/invoke cb i 0 val-metric)) + (get-params fmod) + (when-let [cb (util/option->value (.epochEndCallback fit-params))] + (callback/invoke cb i 0 val-metric)) ;; evaluation on the validation set - (when eval-data - (let [res (score fmod {:eval-data eval-data :eval-metric eval-metric :epoch i})] - (println "Epoch " i " Validation- " res))))) + (when eval-data + (let [res (score fmod {:eval-data eval-data :eval-metric eval-metric :epoch i})] + (println "Epoch " i " Validation- " res))))) fmod) ;; old way if the problem with the sizes get resolved in DataDesc #_(doto mod - (.fit - train-data - (util/->option eval-data) - (int num-epoch) - fit-params))) + (.fit + train-data + (util/->option eval-data) + (int num-epoch) + fit-params))) (s/def ::eval-data ::train-data) (s/def ::num-batch integer?) @@ -621,7 +610,7 @@ (util/validate! ::mx-io/data-batch data-batch "Invalid data batch") (util/coerce-return (.predict mod (if (map? data-batch) (mx-io/data-batch data-batch) - data-batch)))) + data-batch)))) (defn predict "Run prediction and collect the outputs. @@ -639,7 +628,6 @@ (util/validate! ::predict-opts opts "Invalid opts for predict") (util/scala-vector->vec (.predict mod eval-data (int num-batch) reset))) - (s/def ::predict-every-batch-opts (s/keys :req-un [::eval-data] :opt-un [::num-batch ::reset])) (defn predict-every-batch @@ -660,11 +648,8 @@ (util/validate! ::predict-every-batch-opts opts "Invalid opts for predict-every-batch") (mapv util/scala-vector->vec (util/scala-vector->vec (.predictEveryBatch mod eval-data (int num-batch) reset)))) - - (s/def ::score-opts (s/keys :req-un [::eval-data ::eval-metric] :opt-un [::num-batch ::reset ::epoch])) - (defn exec-group [mod] (.execGroup mod)) @@ -676,16 +661,13 @@ (r/reflect DataDesc) (new DataDesc) - (.setEpochEndCallback (if epoch-end-callback - (util/->option epoch-end-callback) - (util/->option nil))) - (.setBatchEndCallback (if batch-end-callback - (util/->option batch-end-callback) - (util/->option nil))) - - (fit-params {:allow-missing true}) - (fit-params {}) - - ) + (.setEpochEndCallback (if epoch-end-callback + (util/->option epoch-end-callback) + (util/->option nil))) + (.setBatchEndCallback (if batch-end-callback + (util/->option batch-end-callback) + (util/->option nil))) + (fit-params {:allow-missing true}) + (fit-params {})) diff --git a/contrib/clojure-package/src/org/apache/clojure_mxnet/monitor.clj b/contrib/clojure-package/src/org/apache/clojure_mxnet/monitor.clj index 0550b4c..cbe0484 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/monitor.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/monitor.clj @@ -19,7 +19,6 @@ (:require [org.apache.clojure-mxnet.util :as util]) (:import (org.apache.mxnet Monitor))) - (defmacro monitor "Monitor outputs, weights, and gradients for debugging. - interval Number of batches between printing. diff --git a/contrib/clojure-package/src/org/apache/clojure_mxnet/ndarray.clj b/contrib/clojure-package/src/org/apache/clojure_mxnet/ndarray.clj index b471055..e37a8bc 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/ndarray.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/ndarray.clj @@ -26,7 +26,6 @@ [t6.from-scala.core :refer [$] :as $]) (:import (org.apache.mxnet NDArray))) - ;; loads the generated functions into the namespace (do (clojure.core/load "gen/ndarray")) @@ -80,7 +79,6 @@ ([source-vec shape-vec] (array source-vec shape-vec {}))) - (defn arange "Returns evenly spaced values within a given interval. Values are generated within the half-open interval [`start`, `stop`). In other @@ -88,14 +86,14 @@ ([start stop {:keys [step repeat ctx dtype] :or {step (float 1) repeat (int 1) ctx (mx-context/default-context) dtype base/MX_REAL_TYPE} :as opts}] - (NDArray/arange (float start) ($/option(float stop)) step repeat ctx dtype)) + (NDArray/arange (float start) ($/option (float stop)) step repeat ctx dtype)) ([start stop] (arange start stop {}))) (defn slice "Return a sliced NDArray that shares memory with current one." ([ndarray i] - (.slice ndarray (int i))) + (.slice ndarray (int i))) ([ndarray start stop] (.slice ndarray (int start) (int stop)))) @@ -104,7 +102,6 @@ [source-ndarray target-ndarray] (.copyTo source-ndarray target-ndarray)) - (defn save "Save list of NDArray or dict of str->NDArray to binary file (The name of the file.Can be S3 or HDFS address (remember built with S3 support)) @@ -139,7 +136,7 @@ (.asInContext ndarray ctx)) (defn as-type - "Return a copied numpy array of current array with specified type." + "Return a copied numpy array of current array with specified type." [ndarray dtype] (.asType ndarray dtype)) diff --git a/contrib/clojure-package/src/org/apache/clojure_mxnet/optimizer.clj b/contrib/clojure-package/src/org/apache/clojure_mxnet/optimizer.clj index 45dcc48..f18ff40 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/optimizer.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/optimizer.clj @@ -22,10 +22,10 @@ (defn sgd "A very simple SGD optimizer with momentum and weight regularization." ([{:keys [learning-rate momentum wd clip-gradient lr-scheduler] :as opts - :or {learning-rate 0.01 - momentum 0.0 - wd 0.0001 - clip-gradient 0}}] + :or {learning-rate 0.01 + momentum 0.0 + wd 0.0001 + clip-gradient 0}}] (new SGD (float learning-rate) (float momentum) (float wd) (float clip-gradient) lr-scheduler)) ([] (sgd {}))) @@ -35,11 +35,11 @@ Implementation of paper 'Asynchronous Stochastic Gradient Descent with Delay Compensation for Distributed Deep Learning'" ([{:keys [learning-rate momentum lambda wd clip-gradient lr-scheduler] :as opts - :or {learning-rate 0.01 - momentum 0.0 - lambda 0.04 - wd 0.0 - clip-gradient 0}}] + :or {learning-rate 0.01 + momentum 0.0 + lambda 0.04 + wd 0.0 + clip-gradient 0}}] (new DCASGD (float learning-rate) (float lambda) (float momentum) (float wd) (float clip-gradient) lr-scheduler)) ([] (dcasgd {}))) @@ -49,10 +49,10 @@ It is implemented according to https://github.com/torch/optim/blob/master/sgd.lua" ([{:keys [learning-rate momentum wd clip-gradient lr-scheduler] :as opts - :or {learning-rate 0.01 - momentum 0.0 - wd 0.0001 - clip-gradient 0}}] + :or {learning-rate 0.01 + momentum 0.0 + wd 0.0001 + clip-gradient 0}}] (new NAG (float learning-rate) (float momentum) (float wd) (float clip-gradient) lr-scheduler)) ([] (nag {}))) @@ -106,7 +106,7 @@ rescale-gradient 1.0 epsilon 1e-7 wd 0.0}}] - (new AdaGrad (float learning-rate) (float rescale-gradient) (float epsilon) (float wd) )) + (new AdaGrad (float learning-rate) (float rescale-gradient) (float epsilon) (float wd))) ([] (ada-grad {}))) @@ -139,7 +139,7 @@ (adam {}))) (defn sgld - "Stochastic Langevin Dynamics Updater to sample from a distribution. + "Stochastic Langevin Dynamics Updater to sample from a distribution. - learning-rate Step size. - rescale-gradient rescaling factor of gradient. @@ -169,7 +169,6 @@ (doto optimizer (.update (int index) weight grad state))) - (defn create-state "Create additional optimizer state such as momentum." [optimizer index weight] diff --git a/contrib/clojure-package/src/org/apache/clojure_mxnet/profiler.clj b/contrib/clojure-package/src/org/apache/clojure_mxnet/profiler.clj index 0bc93cc..48fd041 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/profiler.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/profiler.clj @@ -26,7 +26,7 @@ -fileName, optional The name of output trace file. Default is profile.json." [kwargs] (Profiler/profilerSetConfig - (util/convert-io-map kwargs) )) + (util/convert-io-map kwargs))) (defn profiler-set-state "Set up the profiler state to record operator. diff --git a/contrib/clojure-package/src/org/apache/clojure_mxnet/random.clj b/contrib/clojure-package/src/org/apache/clojure_mxnet/random.clj index 99f09aa..d6e3378 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/random.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/random.clj @@ -34,7 +34,7 @@ (uniform low high shape-vec {}))) (defn normal - "Generate normal(Gaussian) distribution N(mean, stdvar^^2) with shape. + "Generate normal(Gaussian) distribution N(mean, stdvar^^2) with shape. loc: The standard deviation of the normal distribution scale: The upper bound of distribution. shape-vec: vector shape of the ndarray generated. @@ -47,7 +47,6 @@ ([loc scale shape-vec] (normal loc scale shape-vec {}))) - (defn seed " Seed the random number generators in mxnet. This seed will affect behavior of functions in this module, diff --git a/contrib/clojure-package/src/org/apache/clojure_mxnet/shape.clj b/contrib/clojure-package/src/org/apache/clojure_mxnet/shape.clj index 684cb0f..01bedef 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/shape.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/shape.clj @@ -19,7 +19,6 @@ (:require [t6.from-scala.core :refer [$] :as $]) (:import (org.apache.mxnet Shape))) - (defn ->shape [v] (new Shape (apply $/immutable-list (map int v)))) diff --git a/contrib/clojure-package/src/org/apache/clojure_mxnet/symbol.clj b/contrib/clojure-package/src/org/apache/clojure_mxnet/symbol.clj index 2dcd847..42ae034 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/symbol.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/symbol.clj @@ -28,7 +28,6 @@ [org.apache.clojure-mxnet.ndarray :as ndarray]) (:import (org.apache.mxnet Symbol))) - ;; loads the generated functions into the namespace (do (clojure.core/load "gen/symbol")) @@ -44,14 +43,14 @@ kwarg-map: Additional attributes which must start and end with double underscores" ([var-name] (variable var-name {})) - ([var-name {:keys [attrs shape lr-mult wd-mult dtype kwargs]:as opts}] - (Symbol/Variable var-name - (when attrs (util/convert-symbol-map attrs)) - (when shape (mx-shape/->shape shape)) - (if lr-mult (float lr-mult)($/option nil)) - (if wd-mult (float wd-mult)($/option nil)) - dtype - (if kwargs (util/convert-symbol-map kwargs) (util/empty-map))))) + ([var-name {:keys [attrs shape lr-mult wd-mult dtype kwargs] :as opts}] + (Symbol/Variable var-name + (when attrs (util/convert-symbol-map attrs)) + (when shape (mx-shape/->shape shape)) + (if lr-mult (float lr-mult) ($/option nil)) + (if wd-mult (float wd-mult) ($/option nil)) + dtype + (if kwargs (util/convert-symbol-map kwargs) (util/empty-map))))) (defn bind "Bind the current symbol to get an executor. @@ -136,80 +135,80 @@ ([start stop {:keys [step repeat dtype] :or {step (float 1) repeat (int 1) dtype base/MX_REAL_TYPE} :as opts}] - (Symbol/arange (float start) ($/option(float stop)) step repeat nil dtype)) + (Symbol/arange (float start) ($/option (float stop)) step repeat nil dtype)) ([start stop] (arange start stop {}))) ;;; manually defined because of a conflicting arity of 2 with the auto-gen (defn min - ([sym-name kwargs-map symbol-list kwargs-map-1] - (util/coerce-return - (Symbol/min - (util/nil-or-coerce-param sym-name #{"java.lang.String"}) - (util/nil-or-coerce-param - kwargs-map - #{"scala.collection.immutable.Map"}) - (util/nil-or-coerce-param symbol-list #{"scala.collection.Seq"}) - (util/nil-or-coerce-param - kwargs-map-1 - #{"scala.collection.immutable.Map"})))) - ([sym-name attr-map kwargs-map] - (min sym-name attr-map (util/empty-list) kwargs-map)) - ([kwargs-map] (min nil nil (util/empty-list) kwargs-map)) - ([sym1 sym2] - (util/coerce-return - (Symbol/min - (util/nil-or-coerce-param - sym1 - #{"ml.dmlc.mxnet.Symbol" "java.lang.Object"}) - (util/nil-or-coerce-param - sym2 - #{"ml.dmlc.mxnet.Symbol" "java.lang.Object"}))))) + ([sym-name kwargs-map symbol-list kwargs-map-1] + (util/coerce-return + (Symbol/min + (util/nil-or-coerce-param sym-name #{"java.lang.String"}) + (util/nil-or-coerce-param + kwargs-map + #{"scala.collection.immutable.Map"}) + (util/nil-or-coerce-param symbol-list #{"scala.collection.Seq"}) + (util/nil-or-coerce-param + kwargs-map-1 + #{"scala.collection.immutable.Map"})))) + ([sym-name attr-map kwargs-map] + (min sym-name attr-map (util/empty-list) kwargs-map)) + ([kwargs-map] (min nil nil (util/empty-list) kwargs-map)) + ([sym1 sym2] + (util/coerce-return + (Symbol/min + (util/nil-or-coerce-param + sym1 + #{"ml.dmlc.mxnet.Symbol" "java.lang.Object"}) + (util/nil-or-coerce-param + sym2 + #{"ml.dmlc.mxnet.Symbol" "java.lang.Object"}))))) ;;; manually defined because of a conflicting arity of 2 with the auto-gen (defn max - ([sym1 sym2] - (util/coerce-return - (Symbol/max - (util/nil-or-coerce-param - sym1 - #{"ml.dmlc.mxnet.Symbol" "java.lang.Object"}) - (util/nil-or-coerce-param - sym2 - #{"ml.dmlc.mxnet.Symbol" "java.lang.Object"})))) - ([sym-name kwargs-map symbol-list kwargs-map-1] - (util/coerce-return - (Symbol/max - (util/nil-or-coerce-param sym-name #{"java.lang.String"}) - (util/nil-or-coerce-param - kwargs-map - #{"scala.collection.immutable.Map"}) - (util/nil-or-coerce-param symbol-list #{"scala.collection.Seq"}) - (util/nil-or-coerce-param - kwargs-map-1 - #{"scala.collection.immutable.Map"})))) - ([sym-name attr-map kwargs-map] - (max sym-name attr-map (util/empty-list) kwargs-map)) + ([sym1 sym2] + (util/coerce-return + (Symbol/max + (util/nil-or-coerce-param + sym1 + #{"ml.dmlc.mxnet.Symbol" "java.lang.Object"}) + (util/nil-or-coerce-param + sym2 + #{"ml.dmlc.mxnet.Symbol" "java.lang.Object"})))) + ([sym-name kwargs-map symbol-list kwargs-map-1] + (util/coerce-return + (Symbol/max + (util/nil-or-coerce-param sym-name #{"java.lang.String"}) + (util/nil-or-coerce-param + kwargs-map + #{"scala.collection.immutable.Map"}) + (util/nil-or-coerce-param symbol-list #{"scala.collection.Seq"}) + (util/nil-or-coerce-param + kwargs-map-1 + #{"scala.collection.immutable.Map"})))) + ([sym-name attr-map kwargs-map] + (max sym-name attr-map (util/empty-list) kwargs-map)) ([kwargs-map] (max nil nil (util/empty-list) kwargs-map))) ;;; redefining to make it easier to work with (defn- coerce-infer-shape-return [ret] (->> ret - (map util/scala-vector->vec) - (map (fn [shapes] (map mx-shape/->vec shapes))))) + (map util/scala-vector->vec) + (map (fn [shapes] (map mx-shape/->vec shapes))))) (defn - infer-shape - ([sym vec-or-strings vec-of-ints vec-of-ints-1] - (let [ret (util/coerce-return - (.inferShape - sym - (util/nil-or-coerce-param vec-or-strings #{"java.lang.String<>"}) - (util/nil-or-coerce-param vec-of-ints #{"int<>"}) - (util/nil-or-coerce-param vec-of-ints-1 #{"int<>"})))] - (coerce-infer-shape-return ret))) + infer-shape + ([sym vec-or-strings vec-of-ints vec-of-ints-1] + (let [ret (util/coerce-return + (.inferShape + sym + (util/nil-or-coerce-param vec-or-strings #{"java.lang.String<>"}) + (util/nil-or-coerce-param vec-of-ints #{"int<>"}) + (util/nil-or-coerce-param vec-of-ints-1 #{"int<>"})))] + (coerce-infer-shape-return ret))) ([sym symbol-list-or-kwargs-map] (let [ret (util/coerce-return (.inferShape @@ -235,5 +234,4 @@ (into {}))) param-name (format "%s-%04d.params" prefix epoch)] (ndarray/save param-name save-map) - (println "Saved checkpoint to " param-name))) - ) + (println "Saved checkpoint to " param-name)))) diff --git a/contrib/clojure-package/src/org/apache/clojure_mxnet/util.clj b/contrib/clojure-package/src/org/apache/clojure_mxnet/util.clj index f42a124..8f2bb3b 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/util.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/util.clj @@ -75,11 +75,10 @@ (defn convert-tuple [param] (apply $/tuple param)) - (def tuple-param-names #{"kernel" "stride" "pad" "target-shape" "shape"}) (defn convert-by-shape [param] - (into {} (mapv (fn [[k v]] + (into {} (mapv (fn [[k v]] [k (if (vector? v) (mx-shape/->shape v) v)]) param))) @@ -87,8 +86,8 @@ (into {} (mapv (fn [[k v]] (if (or (get tuple-param-names k) (get tuple-param-names (name k))) - [k (str (if (vector? v) (mx-shape/->shape v) v))] - [k v])) + [k (str (if (vector? v) (mx-shape/->shape v) v))] + [k v])) param))) (def io-param-names #{"input-shape" "data-shape" "label-shape"}) @@ -110,7 +109,6 @@ flatten keyword->snake-case)))) - (defn convert-symbol-map [param] (convert-map (tuple-convert-by-param-name param))) @@ -183,7 +181,7 @@ [f] `($/fn ~@(drop-last (rest f)) ~(last f))) -(defn translate-keyword-shape[[k v]] +(defn translate-keyword-shape [[k v]] [(if (keyword? k) (string/replace (name k) "-" "_") k) (if (vector? v) (mx-shape/->shape v) v)]) diff --git a/contrib/clojure-package/src/org/apache/clojure_mxnet/visualization.clj b/contrib/clojure-package/src/org/apache/clojure_mxnet/visualization.clj index c7002bf..37d141b 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/visualization.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/visualization.clj @@ -20,8 +20,6 @@ [org.apache.clojure-mxnet.shape :as mx-shape]) (:import (org.apache.mxnet Visualization))) - - (defn plot-network "convert symbol to Dot object for visualization - symbol symbol to be visualized @@ -47,7 +45,6 @@ ([sym shape-map] (plot-network sym shape-map {}))) - (defn render " Render file with Graphviz engine into format. - dot the dot file from plot-network function diff --git a/contrib/clojure-package/test/dev/generator_test.clj b/contrib/clojure-package/test/dev/generator_test.clj index ed16863..a3ec338 100644 --- a/contrib/clojure-package/test/dev/generator_test.clj +++ b/contrib/clojure-package/test/dev/generator_test.clj @@ -30,7 +30,7 @@ (defn ndarray-reflect-info [name] (->> gen/ndarray-public-no-default (filter #(= name (str (:name %)))) - first)) + first)) (defn symbol-reflect-info [name] (->> gen/symbol-public-no-default @@ -50,7 +50,6 @@ (is (= transformed-params (gen/symbol-transform-param-name (:parameter-types (symbol-reflect-info "floor"))))))) - (deftest test-ndarray-transform-param-name (let [params ["scala.collection.immutable.Map" "scala.collection.Seq"] @@ -116,13 +115,13 @@ sym-name nil (if - (clojure.core/map? kwargs-map-or-vec-or-sym) + (clojure.core/map? kwargs-map-or-vec-or-sym) (util/empty-list) (util/coerce-param kwargs-map-or-vec-or-sym #{"scala.collection.Seq"})) (if - (clojure.core/map? kwargs-map-or-vec-or-sym) + (clojure.core/map? kwargs-map-or-vec-or-sym) (org.apache.clojure-mxnet.util/convert-symbol-map kwargs-map-or-vec-or-sym) nil)))) @@ -132,13 +131,13 @@ nil nil (if - (clojure.core/map? kwargs-map-or-vec-or-sym) + (clojure.core/map? kwargs-map-or-vec-or-sym) (util/empty-list) (util/coerce-param kwargs-map-or-vec-or-sym #{"scala.collection.Seq"})) (if - (clojure.core/map? kwargs-map-or-vec-or-sym) + (clojure.core/map? kwargs-map-or-vec-or-sym) (org.apache.clojure-mxnet.util/convert-symbol-map kwargs-map-or-vec-or-sym) nil)))) @@ -170,17 +169,17 @@ (deftest test-gen-ndarray-function-arity (let [op-name (symbol "$div") op-values {1 [{:name (symbol "$div") - :return-type "org.apache.mxnet.NDArray," - :declaring-class "org.apache.mxnet.NDArray," - :parameter-types ["float"], - :exception-types [], - :flags #{:public}} - {:name (symbol "$div") - :return-type "org.apache.mxnet.NDArray," - :declaring-class "org.apache.mxnet.NDArray," - :parameter-types ["org.apache.mxnet.NDArray"], - :exception-types [], - :flags #{:public}}]}] + :return-type "org.apache.mxnet.NDArray," + :declaring-class "org.apache.mxnet.NDArray," + :parameter-types ["float"], + :exception-types [], + :flags #{:public}} + {:name (symbol "$div") + :return-type "org.apache.mxnet.NDArray," + :declaring-class "org.apache.mxnet.NDArray," + :parameter-types ["org.apache.mxnet.NDArray"], + :exception-types [], + :flags #{:public}}]}] (is (= '(([ndarray num-or-ndarray] (util/coerce-return (.$div @@ -192,19 +191,19 @@ (deftest test-write-to-file (testing "symbol" - (let [fname "test/test-symbol.clj" - _ (gen/write-to-file [(first gen/all-symbol-functions)] - gen/symbol-gen-ns - fname) - good-contents (slurp "test/good-test-symbol.clj") - contents (slurp fname)] - (is (= good-contents contents)))) + (let [fname "test/test-symbol.clj" + _ (gen/write-to-file [(first gen/all-symbol-functions)] + gen/symbol-gen-ns + fname) + good-contents (slurp "test/good-test-symbol.clj") + contents (slurp fname)] + (is (= good-contents contents)))) (testing "ndarray" - (let [fname "test/test-ndarray.clj" - _ (gen/write-to-file [(first gen/all-ndarray-functions)] - gen/ndarray-gen-ns - fname) - good-contents (slurp "test/good-test-ndarray.clj") - contents (slurp fname)] - (is (= good-contents contents))))) + (let [fname "test/test-ndarray.clj" + _ (gen/write-to-file [(first gen/all-ndarray-functions)] + gen/ndarray-gen-ns + fname) + good-contents (slurp "test/good-test-ndarray.clj") + contents (slurp fname)] + (is (= good-contents contents))))) diff --git a/contrib/clojure-package/test/org/apache/clojure_mxnet/conv_test.clj b/contrib/clojure-package/test/org/apache/clojure_mxnet/conv_test.clj index 856a9f5..feda45b 100644 --- a/contrib/clojure-package/test/org/apache/clojure_mxnet/conv_test.clj +++ b/contrib/clojure-package/test/org/apache/clojure_mxnet/conv_test.clj @@ -57,10 +57,7 @@ (sym/convolution "conv1" {:data data :kernel [3 3] :num-filter 32 :stride [2 2]}) (sym/batch-norm "bn1" {:data data}) (sym/activation "relu1" {:data data :act-type "relu"}) - (sym/pooling "mp1" {:data data :kernel [2 2] :pool-type "max" :stride [2 2]}) - - - (sym/convolution "conv2" {:data data :kernel [3 3] :num-filter 32 :stride [2 2]}) + (sym/pooling "mp1" {:data data :kernel [2 2] :pool-type "max" :stride [2 2]}) (sym/convolution "conv2" {:data data :kernel [3 3] :num-filter 32 :stride [2 2]}) (sym/batch-norm "bn2" {:data data}) (sym/activation "relu2" {:data data :act-type "relu"}) (sym/pooling "mp2" {:data data :kernel [2 2] :pool-type "max" :stride [2 2]}) @@ -69,10 +66,8 @@ (sym/fully-connected "fc2" {:data data :num-hidden 10}) (sym/softmax-output "softmax" {:data data}))) - - (deftest test-conv [] - (let [mod (m/module (get-symbol) )] + (let [mod (m/module (get-symbol))] ;;; note only one function for training (m/fit mod {:train-data train-data :eval-data test-data :num-epoch num-epoch :fit-params (m/fit-params {:optimizer (optimizer/sgd {:learning-rate 0.1 @@ -90,5 +85,4 @@ (comment (require '[clojure.reflect :as r]) - (r/reflect train-data) - ) + (r/reflect train-data)) diff --git a/contrib/clojure-package/test/org/apache/clojure_mxnet/executor_test.clj b/contrib/clojure-package/test/org/apache/clojure_mxnet/executor_test.clj index 6c885ce..b2a87d4 100644 --- a/contrib/clojure-package/test/org/apache/clojure_mxnet/executor_test.clj +++ b/contrib/clojure-package/test/org/apache/clojure_mxnet/executor_test.clj @@ -53,7 +53,6 @@ (is (test-util/approx= 1e-6 (ndarray/->vec lhs-grad) (ndarray/->vec lhs-grad2))) (is (test-util/approx= 1e-6 (ndarray/->vec rhs-grad) (ndarray/->vec rhs-grad2))))))) - (deftest test-reshape (let [x (sym/variable "x") y (sym/fully-connected {:data x :num-hidden 4}) diff --git a/contrib/clojure-package/test/org/apache/clojure_mxnet/io_test.clj b/contrib/clojure-package/test/org/apache/clojure_mxnet/io_test.clj index 2ccfc1c..ace39ec 100644 --- a/contrib/clojure-package/test/org/apache/clojure_mxnet/io_test.clj +++ b/contrib/clojure-package/test/org/apache/clojure_mxnet/io_test.clj @@ -59,7 +59,6 @@ (is (= label1 label0)) (is (= data1 data0)))))) - (deftest test-image-record-iter (let [_ (when-not (.exists (io/file "data/cifar/train.rec")) (sh "scripts/get_cifar_data.sh")) @@ -120,7 +119,6 @@ (is (= #{[100]} (into #{} (map :shape provide-label)))) (mx-io/dispose prefetch-iter)))) - (deftest test-ndarray-iter (let [shape0 [1000 2 2] data [(ndarray/ones shape0) (ndarray/zeros shape0)] @@ -138,17 +136,17 @@ nbatch0 8] (is (= nbatch0 (count (mx-io/for-batches data-iter0 (fn [batch] 1))))) (is (every? true? (mx-io/for-batches data-iter0 - (fn [batch] - (= batch-data0 - (first (mx-io/batch-data batch))))))) + (fn [batch] + (= batch-data0 + (first (mx-io/batch-data batch))))))) (is (every? true? (mx-io/for-batches data-iter0 - (fn [batch] - (= batch-data1 - (second (mx-io/batch-data batch))))))) + (fn [batch] + (= batch-data1 + (second (mx-io/batch-data batch))))))) (is (every? true? (mx-io/for-batches data-iter0 - (fn [batch] - (= batch-label - (first (mx-io/batch-label batch)))))))) + (fn [batch] + (= batch-label + (first (mx-io/batch-label batch)))))))) ;; test discard (let [data-iter1 (mx-io/ndarray-iter data {:label label diff --git a/contrib/clojure-package/test/org/apache/clojure_mxnet/module_test.clj b/contrib/clojure-package/test/org/apache/clojure_mxnet/module_test.clj index 5ec918f..f3d4e75 100644 --- a/contrib/clojure-package/test/org/apache/clojure_mxnet/module_test.clj +++ b/contrib/clojure-package/test/org/apache/clojure_mxnet/module_test.clj @@ -32,7 +32,6 @@ [clojure.reflect :as r] [clojure.string :as string])) - (deftest test-model-dtype (let [dtype dtype/FLOAT32 dshape [3 8 7] @@ -44,14 +43,14 @@ (m/bind {:data-shapes [{:name "data" :shape dshape :dtype dtype :layout "TNC"}]}) (m/init-params) (m/forward {:data [(ndarray/ones dshape {:dtype dtype})]}) - (m/backward[(ndarray/ones dshape {:dtype dtype})])) + (m/backward [(ndarray/ones dshape {:dtype dtype})])) (let [outputs (-> mod (m/outputs) flatten)] (is (every? #(= dtype/FLOAT32 (ndarray/dtype %)) outputs))))) (deftest test-module-input-grads (let [a (sym/variable "a" {:kwargs {"__layout__" "NC"}}) b (sym/variable "b" {:kwargs {"__layout__" "NC"}}) - c (sym/variable "c" {:kwargs {"__layout__" "NC"}} ) + c (sym/variable "c" {:kwargs {"__layout__" "NC"}}) c (sym/+ a (sym/+ (sym/* b 2) (sym/* c 3))) mod (m/module c ["b" "c" "a"] nil [(context/cpu 0) (context/cpu 1)])] (-> mod @@ -61,11 +60,11 @@ :inputs-need-grad true}) (m/init-params) (m/forward {:data [(ndarray/ones [5 5]) - (ndarray/ones [5 5]) - (ndarray/ones [5 5])] - :label nil - :index nil - :pad 0}) + (ndarray/ones [5 5]) + (ndarray/ones [5 5])] + :label nil + :index nil + :pad 0}) (m/backward [(ndarray/ones [5 5])])) (let [[a-grad b-grad c-grad] (m/input-grads-merged mod)] (is (every? #(= 1.0 %) (ndarray/->vec a-grad))) @@ -74,17 +73,17 @@ (deftest test-module-layout (let [s (sym/variable "data") - s (sym/activation "act "{"__layout__" "TNC"} {:data s :act_type "relu"}) + s (sym/activation "act " {"__layout__" "TNC"} {:data s :act_type "relu"}) dshape [3 8 7] mod (m/module s ["data"] nil [(context/cpu 0) (context/cpu 1)])] (-> mod (m/bind {:data-shapes [{:name "data" :shape dshape :dtype dtype/FLOAT32 :layout "TNC"}]}) (m/init-params) (m/forward {:data [(ndarray/ones dshape)] - :label nil - :index nil - :pad 0}) - (m/backward[(ndarray/ones dshape)])) + :label nil + :index nil + :pad 0}) + (m/backward [(ndarray/ones dshape)])) (let [outputs-merged (m/outputs-merged mod) outputs (m/outputs mod) hd-shape [3 4 7]] @@ -107,7 +106,7 @@ (-> mod2 (m/bind {:data-shapes [{:name "data" :shape [10 10] :layout "NT"}]}) (m/init-optimizer {:optimizer (optimizer/sgd {:learning-rate 0.1 :momentum 0.9})})) - (is (= (-> mod m/symbol sym/to-json) (-> mod2 m/symbol sym/to-json) )) + (is (= (-> mod m/symbol sym/to-json) (-> mod2 m/symbol sym/to-json))) (is (= (-> mod m/params first) (-> mod2 m/params first)))))) (deftest test-module-save-load-multi-device @@ -127,7 +126,7 @@ (-> mod2 (m/bind {:data-shapes [{:name "data" :shape [10 10] :layout "NT"}]}) (m/init-optimizer {:optimizer (optimizer/sgd {:learning-rate 0.1 :momentum 0.9})})) - (is (= (-> mod m/symbol sym/to-json) (-> mod2 m/symbol sym/to-json) )) + (is (= (-> mod m/symbol sym/to-json) (-> mod2 m/symbol sym/to-json))) (is (= (-> mod m/params first) (-> mod2 m/params first)))))) (deftest test-module-reshape @@ -158,7 +157,7 @@ (let [data (ndarray/array [0.05 0.1] [1 1 1 2]) label (ndarray/array [0.01 0.99] [1 1 1 2]) train-data (mx-io/ndarray-iter [data] {:label [label] :label-name "softmax_label"}) - x (as-> (sym/variable "data") v + x (as-> (sym/variable "data") v (sym/fully-connected "fc_0" {:data v :num-hidden 2}) (sym/activation "act_0" {:data v :act-type "sigmoid"}) (sym/fully-connected "fc_1" {:data v :num-hidden 2}) @@ -166,7 +165,7 @@ (sym/linear-regression-output "softmax" {:data v :grad-scale 2})) mod (m/module x)] - (m/bind mod {:data-shapes (mx-io/provide-data train-data) :label-shapes (mx-io/provide-label train-data)} ) + (m/bind mod {:data-shapes (mx-io/provide-data train-data) :label-shapes (mx-io/provide-label train-data)}) (let [arg-params-correct {"fc_0_weight" (ndarray/array [0.15 0.2 0.25 0.3] [2 2]) "fc_0_bias" (ndarray/array [0.35 0.35] [2]) @@ -214,14 +213,13 @@ (let [result (monitor/toc mon) freq (->> result (map (fn [v] (as-> (second v) ? - (clojure.string/split ? #"_") + (clojure.string/split ? #"_") (take 2 ?) (clojure.string/join "_" ?)))) (frequencies)) expected-freq {"act_0" 2 "act_1" 2 "data" 1 "fc_0" 6 "fc_1" 6}] (is (= expected-freq (select-keys freq (keys expected-freq))))))) - (deftest test-forward-reshape (let [num-class 10 data1 (sym/variable "data1") @@ -271,9 +269,9 @@ (-> mod (m/forward data-batch)) (is (= [(first l-shape) num-class]) (-> (m/outputs-merged mod) first (ndarray/shape) (mx-shape/->vec))) - (-> mod - (m/backward) - (m/update))) + (-> mod + (m/backward) + (m/update))) (let [d-shape1 [20 3 64 64] d-shape2 [20 3 32 32] @@ -286,43 +284,41 @@ (-> mod (m/forward data-batch)) (is (= [(first l-shape) num-class]) (-> (m/outputs-merged mod) first (ndarray/shape) (mx-shape/->vec))) - (-> mod - (m/backward) - (m/update))) + (-> mod + (m/backward) + (m/update))) ;; train with both different batch sizes and data shapes (let [d-shape1 [20 3 120 120] d-shape2 [20 3 32 64] l-shape [20] data-batch {:data [(ndarray/random-uniform 0 9 (str (mx-shape/->shape d-shape1))) - (ndarray/random-uniform 15 25 (str (mx-shape/->shape d-shape2)))] - :label [(ndarray/ones l-shape)] - :index nil - :pad 0}] + (ndarray/random-uniform 15 25 (str (mx-shape/->shape d-shape2)))] + :label [(ndarray/ones l-shape)] + :index nil + :pad 0}] (-> mod (m/forward data-batch)) (is (= [(first l-shape) num-class]) (-> (m/outputs-merged mod) first (ndarray/shape) (mx-shape/->vec))) - (-> mod - (m/backward) - (m/update))) + (-> mod + (m/backward) + (m/update))) (let [d-shape1 [5 3 28 40] d-shape2 [5 3 24 16] l-shape [5] data-batch {:data [(ndarray/random-uniform 0 9 (str (mx-shape/->shape d-shape1))) - (ndarray/random-uniform 15 25 (str (mx-shape/->shape d-shape2)))] - :label [(ndarray/ones l-shape)] - :index nil - :pad 0}] + (ndarray/random-uniform 15 25 (str (mx-shape/->shape d-shape2)))] + :label [(ndarray/ones l-shape)] + :index nil + :pad 0}] (-> mod (m/forward data-batch)) (is (= [(first l-shape) num-class]) (-> (m/outputs-merged mod) first (ndarray/shape) (mx-shape/->vec))) - (-> mod - (m/backward) - (m/update))))) - + (-> mod + (m/backward) + (m/update))))) (comment - (m/data-shapes x) - ) + (m/data-shapes x)) diff --git a/contrib/clojure-package/test/org/apache/clojure_mxnet/ndarray_test.clj b/contrib/clojure-package/test/org/apache/clojure_mxnet/ndarray_test.clj index 25d01ec..79e9441 100644 --- a/contrib/clojure-package/test/org/apache/clojure_mxnet/ndarray_test.clj +++ b/contrib/clojure-package/test/org/apache/clojure_mxnet/ndarray_test.clj @@ -46,13 +46,13 @@ (deftest test-set-scalar-value (is (= [10.0 10.0] (-> (ndarray/empty [2 1]) - (ndarray/set 10) - (->vec))))) + (ndarray/set 10) + (->vec))))) (deftest test-copy-from-vector (is (= [1.0 2.0 3.0 4.0] (-> (ndarray/empty [4 1]) - (ndarray/set [1 2 3 4]) - (->vec))))) + (ndarray/set [1 2 3 4]) + (->vec))))) (deftest test-plus (let [ndzeros (zeros [2 1]) @@ -103,12 +103,12 @@ (deftest test-clip (let [nda (-> (ndarray/empty [3 2]) - (ndarray/set [1 2 3 4 5 6]))] + (ndarray/set [1 2 3 4 5 6]))] (is (= [2.0 2.0 3.0 4.0 5.0 5.0] (->vec (ndarray/clip nda 2 5)))))) (deftest test-sqrt (let [nda (-> (ndarray/empty [4 1]) - (ndarray/set [0 1 4 9]))] + (ndarray/set [0 1 4 9]))] (is (= [0.0 1.0 2.0 3.0] (->vec (ndarray/sqrt nda)))))) (deftest test-rsqrt @@ -138,7 +138,6 @@ (is (= [1 1] (mx-shape/->vec (shape res)))) (is (= [11.0] (->vec res))))) - (deftest test-arrange (let [start 0 stop 5 @@ -179,7 +178,6 @@ (is (= [2 1] (-> nda shape mx-shape/->vec))) (is (= [27.0 3125.0] (->vec nda)))))) - (deftest test-equal (let [nda1 (ndarray/array [1 2 3 5] [2 2]) nda2 (ndarray/array [1 4 3 6] [2 2])] @@ -190,7 +188,6 @@ (is (= [2 2] (-> (ndarray/equal nda1 3) shape mx-shape/->vec))) (is (= [0.0 0.0 1.0 0.0] (->vec (ndarray/equal nda1 3)))))) - (deftest test-not-equal (let [nda1 (ndarray/array [1 2 3 5] [2 2]) nda2 (ndarray/array [1 4 3 6] [2 2])] @@ -211,7 +208,6 @@ (is (= [2 2] (-> (ndarray/> nda1 2) shape mx-shape/->vec))) (is (= [0.0 0.0 1.0 1.0] (->vec (ndarray/> nda1 2)))))) - (deftest test-greater-equal (let [nda1 (ndarray/array [1 2 4 5] [2 2]) nda2 (ndarray/array [1 4 3 6] [2 2])] @@ -242,7 +238,6 @@ (is (= [2 2] (-> (ndarray/< nda1 2) shape mx-shape/->vec))) (is (= [1.0 1.0 0.0 0.0] (->vec (ndarray/<= nda1 2)))))) - (deftest test-choose-element-0index (let [nda (ndarray/array [1 2 3 4 6 5] [2 3]) indices (ndarray/array [0 1] [2]) @@ -331,7 +326,6 @@ (is (= [2] (-> argmax shape mx-shape/->vec))) (is (= [1.0 0.0] (->vec argmax))))) - (deftest test-concatenate-axis-0 (let [nda1 (ndarray/array [1 2 4 3 3 3] [2 3]) nda2 (ndarray/array [8 7 6] [1 3]) diff --git a/contrib/clojure-package/test/org/apache/clojure_mxnet/operator_test.clj b/contrib/clojure-package/test/org/apache/clojure_mxnet/operator_test.clj index 1a822d5..a71a312 100644 --- a/contrib/clojure-package/test/org/apache/clojure_mxnet/operator_test.clj +++ b/contrib/clojure-package/test/org/apache/clojure_mxnet/operator_test.clj @@ -50,9 +50,8 @@ (doseq [grad arr-grad] (is (= out-grad grad)))))) - (deftest test-concat - (let [shape-vecs[[2 2] [3 2]] + (let [shape-vecs [[2 2] [3 2]] x (sym/variable "x") y (sym/variable "y") out (sym/concat "conc" nil [x y] {:dim 0}) @@ -80,7 +79,6 @@ np-grads arr-np] (is (= grads (mapv #(ndarray/+ % 1) np-grads)))))) - (defn check-regression [model forward-fn backward-fn] (let [shape-vec [3 1] arr-data (random/uniform -1 1 shape-vec) @@ -99,7 +97,6 @@ np-out (ndarray/->vec arr-label))] (is (approx= 1e-6 npout-back arr-grad))))) - (deftest test-regression (check-regression (sym/logistic-regression-output {:data (sym/variable "data") :label (sym/variable "label")}) (fn [x] (/ 1.0 (+ 1.0 (Math/exp (* -1.0 x))))) @@ -151,7 +148,6 @@ (let [val (ndarray/->vec (ndarray/slice out i))] (is (approx= 1e-6 [1 1 1 2 2 2] val))))))) - (defn check-symbolic-forward [test-sym location expected tolerance] (let [arr-data (mapv #(ndarray/copy %) location) arr-grad (mapv #(ndarray/empty (mx-shape/->vec (ndarray/shape %))) location) @@ -184,7 +180,6 @@ expected grad-arrays))))) - (deftest test-scalar-op (let [data (sym/variable "data") shape-vec [3 4] @@ -216,7 +211,6 @@ [0 0 0 0] (-> exec (executor/forward) (executor/outputs) (first)))))) - (deftest test-arange (let [start 1 stop 100 @@ -384,7 +378,6 @@ (executor/backward exec-test (ndarray/* (ndarray/ones shape-vec) 2)) (is (approx= 1e-6 (ndarray/zeros shape-vec) arr-grad)))) - (deftest test-round-ceil-floor (let [data (sym/variable "data") shape-vec [3 4] @@ -402,7 +395,6 @@ (ndarray/+ (ndarray/floor data-tmp))) (-> (executor/forward exec-test) (executor/outputs) (first)))))) - (deftest test-rsqrt-cos-sin (let [data (sym/variable "data") shape-vec [3 4] @@ -451,8 +443,8 @@ exec-test (sym/bind test (context/default-context) [arr-data1 arr-data2]) out (-> (executor/forward exec-test) (executor/outputs) (first))] (is (approx= 1e-6 - (mapv min (ndarray/->vec data-tmp1) (ndarray/->vec data-tmp2)) - out)))) + (mapv min (ndarray/->vec data-tmp1) (ndarray/->vec data-tmp2)) + out)))) (deftest test-transpose (let [data (sym/variable "data") @@ -513,41 +505,36 @@ (let [out-grad (ndarray/* (ndarray/ones shape-vec) 2) npout-grad (ndarray/* out-grad (ndarray/sign data-tmp))] (executor/backward exec-test out-grad) - (is (approx= 1e-6 npout-grad arr-grad))))) - - - ;; configure A: input --> conv --> deconv --> output. + (is (approx= 1e-6 npout-grad arr-grad)))));; configure A: input --> conv --> deconv --> output. ;; the convolution and deconvoluiton has similar parameter which ensure ;; the input shape is the same as output, and the same weights between conv ;; and deconv; ;; If the input value of forward() and backwrad() is the same, then ;; the output value of them should also the same; -(defn check-deconvolution-forward-backward [{:keys[input-shape-vec num-filter kernel stride pad]}] +(defn check-deconvolution-forward-backward [{:keys [input-shape-vec num-filter kernel stride pad]}] (let [data (sym/variable "data") - conv (sym/convolution "conv" {:data data :kernel kernel :stride stride - :pad pad :num-filter num-filter :no-bias "true"}) - deconv (sym/deconvolution "deconv" {:data conv :kernel kernel :stride stride - :pad pad :num-filter num-filter :no-bias "true"} ) - arg-names (sym/list-arguments deconv) - arg-shape-vecs (first (sym/infer-shape deconv {:data input-shape-vec})) - input-data (random/uniform -5 5 input-shape-vec) - out-grad input-data - conv-weight (random/normal 0 1 [num-filter (second input-shape-vec) (first kernel) (last kernel)]) - args {:data input-data :conv-weight conv-weight :deconv-weight conv-weight} - args-grad (mapv #(ndarray/empty %) arg-shape-vecs) - exec (sym/bind deconv (context/default-context) args args-grad) - out (-> (executor/forward exec) (executor/outputs) first)] - (executor/backward exec out-grad) - (is (approx= 1e-3 (ndarray/->vec out) (ndarray/->vec (first args-grad)))))) - + conv (sym/convolution "conv" {:data data :kernel kernel :stride stride + :pad pad :num-filter num-filter :no-bias "true"}) + deconv (sym/deconvolution "deconv" {:data conv :kernel kernel :stride stride + :pad pad :num-filter num-filter :no-bias "true"}) + arg-names (sym/list-arguments deconv) + arg-shape-vecs (first (sym/infer-shape deconv {:data input-shape-vec})) + input-data (random/uniform -5 5 input-shape-vec) + out-grad input-data + conv-weight (random/normal 0 1 [num-filter (second input-shape-vec) (first kernel) (last kernel)]) + args {:data input-data :conv-weight conv-weight :deconv-weight conv-weight} + args-grad (mapv #(ndarray/empty %) arg-shape-vecs) + exec (sym/bind deconv (context/default-context) args args-grad) + out (-> (executor/forward exec) (executor/outputs) first)] + (executor/backward exec out-grad) + (is (approx= 1e-3 (ndarray/->vec out) (ndarray/->vec (first args-grad)))))) (deftest test-deconvolution-forward-and-backward (check-deconvolution-forward-backward {:input-shape-vec [1 1 5 5] :num-filter 1 :kernel [3 3] :stride [1 1] :pad [1 1]}) (check-deconvolution-forward-backward {:input-shape-vec [32 3 28 28] :num-filter 3 :kernel [3 3] :stride [1 1] :pad [1 1]}) ;; commented out to make the tests fast - #_(check-deconvolution-forward-backward {:input-shape-vec [10 3 403 403] :num-filter 3 :kernel [7 7] :stride [5 5] :pad [2 2]}) - ) + #_(check-deconvolution-forward-backward {:input-shape-vec [10 3 403 403] :num-filter 3 :kernel [7 7] :stride [5 5] :pad [2 2]})) ;; configure A: input --> conv --> output. ;; configure B: input --> deconv --> output @@ -558,52 +545,51 @@ (defn check-deconvolution-gradient [{:keys [input-shape-vec num-filter pad]}] (let [stride [1 1] - kernel [(inc (* 2 (first pad))) (inc (* 2 (second pad)))] - data-conv (sym/variable "data_conv") - conv (sym/convolution "conv" {:data data-conv :kernel kernel :stride stride - :pad pad :num-filter num-filter :no-bias "true"}) - data-deconv (sym/variable "data_deconv") - deconv (sym/deconvolution "deconv" {:data data-deconv :kernel kernel :stride stride - :pad pad :num-filter num-filter :no-bias true}) - conv-data (random/uniform -5 5 input-shape-vec) - conv-args {"data_conv" conv-data "conv_weight" (random/normal 0 1 [num-filter (second input-shape-vec) (first kernel) (second kernel)])} - conv-args-grad [(ndarray/zeros (-> conv-data (ndarray/shape) (ndarray/->vec))) - (ndarray/zeros [num-filter (second input-shape-vec) (first kernel) (second kernel)])] - exec-conv (sym/bind conv (context/default-context) conv-args conv-args-grad) - conv-out-grad (random/normal 0 2 (-> (executor/outputs exec-conv) (first) (ndarray/shape) (mx-shape/->vec)))] - (executor/forward exec-conv) - (executor/backward exec-conv conv-out-grad) - - (let [deconv-data conv-out-grad - deconv-args {"data_deconv" deconv-data "deconv_weight" (get conv-args "conv_weight")} - deconv-args-grad [(ndarray/zeros (-> deconv-data (ndarray/shape) (mx-shape/->vec))) - (ndarray/zeros [num-filter (second input-shape-vec) (first kernel) (second kernel)])] - exec-deconv (sym/bind deconv (context/default-context) deconv-args deconv-args-grad) - deconv-out-grad conv-data] - (executor/forward exec-deconv) - (executor/backward exec-deconv deconv-out-grad) - - (is (approx= 1e-4 (ndarray/->vec (second conv-args-grad)) (ndarray/->vec (second deconv-args-grad))))))) + kernel [(inc (* 2 (first pad))) (inc (* 2 (second pad)))] + data-conv (sym/variable "data_conv") + conv (sym/convolution "conv" {:data data-conv :kernel kernel :stride stride + :pad pad :num-filter num-filter :no-bias "true"}) + data-deconv (sym/variable "data_deconv") + deconv (sym/deconvolution "deconv" {:data data-deconv :kernel kernel :stride stride + :pad pad :num-filter num-filter :no-bias true}) + conv-data (random/uniform -5 5 input-shape-vec) + conv-args {"data_conv" conv-data "conv_weight" (random/normal 0 1 [num-filter (second input-shape-vec) (first kernel) (second kernel)])} + conv-args-grad [(ndarray/zeros (-> conv-data (ndarray/shape) (ndarray/->vec))) + (ndarray/zeros [num-filter (second input-shape-vec) (first kernel) (second kernel)])] + exec-conv (sym/bind conv (context/default-context) conv-args conv-args-grad) + conv-out-grad (random/normal 0 2 (-> (executor/outputs exec-conv) (first) (ndarray/shape) (mx-shape/->vec)))] + (executor/forward exec-conv) + (executor/backward exec-conv conv-out-grad) + + (let [deconv-data conv-out-grad + deconv-args {"data_deconv" deconv-data "deconv_weight" (get conv-args "conv_weight")} + deconv-args-grad [(ndarray/zeros (-> deconv-data (ndarray/shape) (mx-shape/->vec))) + (ndarray/zeros [num-filter (second input-shape-vec) (first kernel) (second kernel)])] + exec-deconv (sym/bind deconv (context/default-context) deconv-args deconv-args-grad) + deconv-out-grad conv-data] + (executor/forward exec-deconv) + (executor/backward exec-deconv deconv-out-grad) + + (is (approx= 1e-4 (ndarray/->vec (second conv-args-grad)) (ndarray/->vec (second deconv-args-grad))))))) (deftest test-deconvolution-gradient (check-deconvolution-gradient {:input-shape-vec [1 3 5 5] :num-filter 3 :pad [1 1]})) (defn check-nearest-up-sampling-with-shape [{:keys [shape-vecs scale root-scale]}] - (let [arr (zipmap (map #(str "arg_" %) (range 0 (count shape-vecs))) - (map #(random/uniform -10 10 %) shape-vecs)) - arr-grad (zipmap (map #(str "arg_" %) (range 0 (count shape-vecs))) - (map #(ndarray/zeros %) shape-vecs)) - up-args (mapv #(sym/variable (str "arg_" %)) (range 0 (count shape-vecs))) - up (sym/up-sampling "up-sampling" nil up-args {:sample-type "nearest" :scale root-scale}) - exec (sym/bind up (context/default-context) arr arr-grad)] - (executor/forward exec) - (executor/backward exec (executor/outputs exec)) - (doseq [k (range 0 (count shape-vecs))] - (let [k-name (str "arg_" k) - expected (->> (get arr k-name) (ndarray/->vec) (mapv #(* % (Math/pow root-scale 2) (Math/pow scale (* 2 k))))) - real (-> (get arr-grad k-name) (ndarray/->vec))] - (is (approx= 0.1 expected real)))))) - + (let [arr (zipmap (map #(str "arg_" %) (range 0 (count shape-vecs))) + (map #(random/uniform -10 10 %) shape-vecs)) + arr-grad (zipmap (map #(str "arg_" %) (range 0 (count shape-vecs))) + (map #(ndarray/zeros %) shape-vecs)) + up-args (mapv #(sym/variable (str "arg_" %)) (range 0 (count shape-vecs))) + up (sym/up-sampling "up-sampling" nil up-args {:sample-type "nearest" :scale root-scale}) + exec (sym/bind up (context/default-context) arr arr-grad)] + (executor/forward exec) + (executor/backward exec (executor/outputs exec)) + (doseq [k (range 0 (count shape-vecs))] + (let [k-name (str "arg_" k) + expected (->> (get arr k-name) (ndarray/->vec) (mapv #(* % (Math/pow root-scale 2) (Math/pow scale (* 2 k))))) + real (-> (get arr-grad k-name) (ndarray/->vec))] + (is (approx= 0.1 expected real)))))) (deftest test-nearest-upsampling (doall (for [root-scale (range 1 4) @@ -611,6 +597,6 @@ num-shape (range 1 4) base (range 1 4)] (let [shape-vecs (mapv (fn [i] [1 3 (* base root-scale (int (Math/pow scale (- (dec num-shape) i)))) - (* base root-scale (int (Math/pow scale (- (dec num-shape) i))))]) + (* base root-scale (int (Math/pow scale (- (dec num-shape) i))))]) (range 0 num-shape))] (check-nearest-up-sampling-with-shape {:shape-vecs shape-vecs :scale scale :root-scale root-scale}))))) diff --git a/contrib/clojure-package/test/org/apache/clojure_mxnet/optimizer_test.clj b/contrib/clojure-package/test/org/apache/clojure_mxnet/optimizer_test.clj index e90516f..f6461b1 100644 --- a/contrib/clojure-package/test/org/apache/clojure_mxnet/optimizer_test.clj +++ b/contrib/clojure-package/test/org/apache/clojure_mxnet/optimizer_test.clj @@ -33,7 +33,6 @@ (m/init-optimizer {:optimizer (optimizer-fn)}) (m/update)))) - (deftest test-optimizer-update (let [opts [["sgd" optimizer/sgd] ["dcasgd" optimizer/dcasgd] diff --git a/contrib/clojure-package/test/org/apache/clojure_mxnet/symbol_test.clj b/contrib/clojure-package/test/org/apache/clojure_mxnet/symbol_test.clj index 9d37f07..6df2a10 100644 --- a/contrib/clojure-package/test/org/apache/clojure_mxnet/symbol_test.clj +++ b/contrib/clojure-package/test/org/apache/clojure_mxnet/symbol_test.clj @@ -21,7 +21,6 @@ [org.apache.clojure-mxnet.util :as util] [clojure.test :refer :all])) - (deftest test-compose (let [data (sym/variable "data") net1 (sym/fully-connected "fc1" {:data data :num-hidden 10}) @@ -45,8 +44,8 @@ net1 (sym/fully-connected "fc2" {:data oldfc :num-hidden 100})] (is (= ["data" "fc1_weight" "fc1_bias" "fc2_weight" "fc2_bias"] (sym/list-arguments net1))) (= (sym/list-arguments oldfc) (-> (sym/get-internals net1) - (sym/get "fc1_output") - (sym/list-arguments))))) + (sym/get "fc1_output") + (sym/list-arguments))))) (deftest test-infer-type (let [data (sym/variable "data")