This is an automated email from the ASF dual-hosted git repository. cmeier pushed a commit to branch more-clojure-tests in repository https://gitbox.apache.org/repos/asf/incubator-mxnet.git
commit e80765f4929caa5f65050b43eb89e7684b220ded Author: gigasquid <cme...@gigasquidsoftware.com> AuthorDate: Fri Aug 3 14:50:52 2018 -0400 add initializer test add profiler and lr-scheduler tests basic symbol test add more symbol tests re-enable deeper visualization graph example and add simple test running cljfmt add license - fix typo --- .../examples/tutorial/src/tutorial/symbol.clj | 1 - .../examples/visualization/README.md | 2 + .../visualization/src/visualization/core.clj | 18 +++++---- .../clojure-package/examples/visualization/testviz | 32 +++++++++++++++ .../src/org/apache/clojure_mxnet/profiler.clj | 2 +- .../org/apache/clojure_mxnet/initializer_test.clj | 45 ++++++++++++++++++++++ .../org/apache/clojure_mxnet/lr_scheduler_test.clj | 24 ++++++++++++ .../org/apache/clojure_mxnet/profiler_test.clj | 31 +++++++++++++++ .../test/org/apache/clojure_mxnet/symbol_test.clj | 32 ++++++++++++++- .../apache/clojure_mxnet/visualization_test.clj | 38 ++++++++++++++++++ 10 files changed, 214 insertions(+), 11 deletions(-) diff --git a/contrib/clojure-package/examples/tutorial/src/tutorial/symbol.clj b/contrib/clojure-package/examples/tutorial/src/tutorial/symbol.clj index 0dd0e4d..bec71de 100644 --- a/contrib/clojure-package/examples/tutorial/src/tutorial/symbol.clj +++ b/contrib/clojure-package/examples/tutorial/src/tutorial/symbol.clj @@ -50,7 +50,6 @@ net ;=> #object[org.apache.mxnet.Symbol 0x5c78c8c2 "org.apache.mxnet.Symbol@5c78 (def b (sym/variable "b")) (def c (sym/+ a b)) - ;; Each symbol takes a (unique) string name. NDArray and Symbol both represent a single tensor. Operators represent the computation between tensors. Operators take symbol (or NDArray) as inputs and might also additionally accept other hyperparameters such as the number of hidden neurons (num_hidden) or the activation type (act_type) and produce the output. ;; We can view a symbol simply as a function taking several arguments. And we can retrieve those arguments with the following method call: diff --git a/contrib/clojure-package/examples/visualization/README.md b/contrib/clojure-package/examples/visualization/README.md index 8c6e2c2..54ece37 100644 --- a/contrib/clojure-package/examples/visualization/README.md +++ b/contrib/clojure-package/examples/visualization/README.md @@ -1,4 +1,6 @@ # visualization +You must have graphviz installed to be able to run this. + Run `lein run` to have a sample network visualization printed for you "testviz.pdf" diff --git a/contrib/clojure-package/examples/visualization/src/visualization/core.clj b/contrib/clojure-package/examples/visualization/src/visualization/core.clj index 31cce92..8e51d87 100644 --- a/contrib/clojure-package/examples/visualization/src/visualization/core.clj +++ b/contrib/clojure-package/examples/visualization/src/visualization/core.clj @@ -22,16 +22,18 @@ (defn get-symbol [] (as-> (sym/variable "data") data - #_(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/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]}) + (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/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]}) (sym/flatten "fl" {:data data}) - #_(sym/fully-connected "fc2" {:data data :num-hidden 10}) + (sym/fully-connected "fc2" {:data data :num-hidden 10}) (sym/softmax-output "softmax" {:data data}))) (defn test-viz [] diff --git a/contrib/clojure-package/examples/visualization/testviz b/contrib/clojure-package/examples/visualization/testviz new file mode 100644 index 0000000..c0161e9 --- /dev/null +++ b/contrib/clojure-package/examples/visualization/testviz @@ -0,0 +1,32 @@ +digraph foo{ + data [label=data fixedsize=false style=filled height=0.8034 fillcolor="#8dd3c7" shape=oval width=1.3] + conv1 [label="Convolution\n3x3/2x2, 32" fixedsize=false style=filled height=0.8034 fillcolor="#fb8072" shape=oval width=1.3] + bn1 [label=bn1 fixedsize=false style=filled height=0.8034 fillcolor="#bebada" shape=oval width=1.3] + relu1 [label="Activation +relu" fixedsize=false style=filled height=0.8034 fillcolor="#ffffb3" shape=oval width=1.3] + mp1 [label="Pooling +max, 2x2/2x2" fixedsize=false style=filled height=0.8034 fillcolor="#80b1d3" shape=oval width=1.3] + conv2 [label="Convolution\n3x3/2x2, 32" fixedsize=false style=filled height=0.8034 fillcolor="#fb8072" shape=oval width=1.3] + bn2 [label=bn2 fixedsize=false style=filled height=0.8034 fillcolor="#bebada" shape=oval width=1.3] + relu2 [label="Activation +relu" fixedsize=false style=filled height=0.8034 fillcolor="#ffffb3" shape=oval width=1.3] + mp2 [label="Pooling +max, 2x2/2x2" fixedsize=false style=filled height=0.8034 fillcolor="#80b1d3" shape=oval width=1.3] + fl [label=fl fixedsize=false style=filled height=0.8034 fillcolor="#fdb462" shape=oval width=1.3] + fc2 [label="FullyConnected +10" fixedsize=false style=filled height=0.8034 fillcolor="#fb8072" shape=oval width=1.3] + softmax_label [label=softmax_label fixedsize=false style=filled height=0.8034 fillcolor="#8dd3c7" shape=oval width=1.3] + softmax [label=softmax fixedsize=false style=filled height=0.8034 fillcolor="#fccde5" shape=oval width=1.3] + conv1 -> data [ arrowtail=open dir=back label="1x28x28"] + bn1 -> conv1 [ arrowtail=open dir=back label="32x13x13"] + relu1 -> bn1 [ arrowtail=open dir=back label="32x13x13"] + mp1 -> relu1 [ arrowtail=open dir=back label="32x13x13"] + conv2 -> mp1 [ arrowtail=open dir=back label="32x6x6"] + bn2 -> conv2 [ arrowtail=open dir=back label="32x2x2"] + relu2 -> bn2 [ arrowtail=open dir=back label="32x2x2"] + mp2 -> relu2 [ arrowtail=open dir=back label="32x2x2"] + fl -> mp2 [ arrowtail=open dir=back label="32x1x1"] + fc2 -> fl [ arrowtail=open dir=back label="32"] + softmax -> fc2 [ arrowtail=open dir=back label="10"] + softmax -> softmax_label [ arrowtail=open dir=back label=""] +} 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 48fd041..5b4f9b1 100644 --- a/contrib/clojure-package/src/org/apache/clojure_mxnet/profiler.clj +++ b/contrib/clojure-package/src/org/apache/clojure_mxnet/profiler.clj @@ -36,7 +36,7 @@ ([state] (Profiler/profilerSetState state)) ([] - (profiler-set-state false))) + (profiler-set-state "stop"))) (defn dump-profile " Dump profile and stop profiler. Use this to save profile diff --git a/contrib/clojure-package/test/org/apache/clojure_mxnet/initializer_test.clj b/contrib/clojure-package/test/org/apache/clojure_mxnet/initializer_test.clj new file mode 100644 index 0000000..288a414 --- /dev/null +++ b/contrib/clojure-package/test/org/apache/clojure_mxnet/initializer_test.clj @@ -0,0 +1,45 @@ +;; +;; Licensed to the Apache Software Foundation (ASF) under one or more +;; contributor license agreements. See the NOTICE file distributed with +;; this work for additional information regarding copyright ownership. +;; The ASF licenses this file to You under the Apache License, Version 2.0 +;; (the "License"); you may not use this file except in compliance with +;; the License. You may obtain a copy of the License at +;; +;; http://www.apache.org/licenses/LICENSE-2.0 +;; +;; Unless required by applicable law or agreed to in writing, software +;; distributed under the License is distributed on an "AS IS" BASIS, +;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +;; See the License for the specific language governing permissions and +;; limitations under the License. +;; + +(ns org.apache.clojure-mxnet.initializer-test + (:require [org.apache.clojure-mxnet.initializer :as initializer] + [org.apache.clojure-mxnet.ndarray :as ndarray] + [clojure.test :refer :all])) + +(defn exercise-initializer [init] + (-> init + (initializer/init-weight "test-weight" (ndarray/zeros [3 3]))) + + (is (number? + (-> init + (initializer/apply "test-weight" (ndarray/zeros [3 3])) + (ndarray/->vec) + (first))))) + +(deftest test-uniform + (exercise-initializer (initializer/uniform)) + (exercise-initializer (initializer/uniform 0.8))) + +(deftest test-normal + (exercise-initializer (initializer/normal)) + (exercise-initializer (initializer/normal 0.2))) + +(deftest test-xavier + (exercise-initializer (initializer/xavier)) + (exercise-initializer (initializer/xavier {:rand-type "gaussian" + :factor-type "in" + :magnitude 2}))) diff --git a/contrib/clojure-package/test/org/apache/clojure_mxnet/lr_scheduler_test.clj b/contrib/clojure-package/test/org/apache/clojure_mxnet/lr_scheduler_test.clj new file mode 100644 index 0000000..c60389a --- /dev/null +++ b/contrib/clojure-package/test/org/apache/clojure_mxnet/lr_scheduler_test.clj @@ -0,0 +1,24 @@ +;; +;; Licensed to the Apache Software Foundation (ASF) under one or more +;; contributor license agreements. See the NOTICE file distributed with +;; this work for additional information regarding copyright ownership. +;; The ASF licenses this file to You under the Apache License, Version 2.0 +;; (the "License"); you may not use this file except in compliance with +;; the License. You may obtain a copy of the License at +;; +;; http://www.apache.org/licenses/LICENSE-2.0 +;; +;; Unless required by applicable law or agreed to in writing, software +;; distributed under the License is distributed on an "AS IS" BASIS, +;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +;; See the License for the specific language governing permissions and +;; limitations under the License. +;; + +(ns org.apache.clojure-mxnet.lr-scheduler-test + (:require [org.apache.clojure-mxnet.lr-scheduler :as lr-scheduler] + [clojure.test :refer :all])) + +(deftest test-factor-scheduler + ;; just excercising + (lr-scheduler/factor-scheduler 2 0.3)) diff --git a/contrib/clojure-package/test/org/apache/clojure_mxnet/profiler_test.clj b/contrib/clojure-package/test/org/apache/clojure_mxnet/profiler_test.clj new file mode 100644 index 0000000..f4b7434 --- /dev/null +++ b/contrib/clojure-package/test/org/apache/clojure_mxnet/profiler_test.clj @@ -0,0 +1,31 @@ +;; +;; Licensed to the Apache Software Foundation (ASF) under one or more +;; contributor license agreements. See the NOTICE file distributed with +;; this work for additional information regarding copyright ownership. +;; The ASF licenses this file to You under the Apache License, Version 2.0 +;; (the "License"); you may not use this file except in compliance with +;; the License. You may obtain a copy of the License at +;; +;; http://www.apache.org/licenses/LICENSE-2.0 +;; +;; Unless required by applicable law or agreed to in writing, software +;; distributed under the License is distributed on an "AS IS" BASIS, +;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +;; See the License for the specific language governing permissions and +;; limitations under the License. +;; + +(ns org.apache.clojure-mxnet.profiler-test + (:require [org.apache.clojure-mxnet.profiler :as profiler] + [clojure.test :refer :all])) + +;; Just excercising the interop + +(deftest test-profiler + (do + (profiler/profiler-set-config {:filename "test-profile.json" + :profile-symbolic 1}) + (profiler/profiler-set-state "run") + (profiler/profiler-set-state "stop") + (profiler/profiler-set-state) + (profiler/dump-profile 0))) 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 6df2a10..89b5123 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 @@ -17,9 +17,12 @@ (ns org.apache.clojure-mxnet.symbol-test (:require [org.apache.clojure-mxnet.dtype :as dtype] + [org.apache.clojure-mxnet.executor :as executor] + [org.apache.clojure-mxnet.ndarray :as ndarray] [org.apache.clojure-mxnet.symbol :as sym] [org.apache.clojure-mxnet.util :as util] - [clojure.test :refer :all])) + [clojure.test :refer :all] + [org.apache.clojure-mxnet.context :as context])) (deftest test-compose (let [data (sym/variable "data") @@ -61,3 +64,30 @@ (let [data (sym/variable "data") data2 (sym/clone data)] (is (= (sym/to-json data) (sym/to-json data2))))) + +(deftest test-basic-bind + (let [a (sym/variable "a") + b (sym/variable "b") + c (sym/+ a b) + ex (sym/bind c {"a" (ndarray/ones [2 2]) "b" (ndarray/ones [2 2])})] + (is (= [2.0 2.0 2.0 2.0]) (-> (executor/forward ex) + (executor/outputs) + (first) + (ndarray/->vec))))) +(deftest test-simple-bind + (let [a (sym/ones [3]) + b (sym/ones [3]) + c (sym/+ a b) + ex (sym/simple-bind c (context/default-context))] + (is (= [2.0 2.0 2.0] (-> (executor/forward ex) + (executor/outputs) + (first) + (ndarray/->vec)))))) + +(deftest test-infer-shape + (let [a (sym/variable "a") + b (sym/variable "b") + c (sym/+ a b) + [arg-shapes out-shapes] (sym/infer-shape c {"a" [2 2] "b" [2 2]})] + (is (= [[2 2] [2 2]] arg-shapes)) + (is (= [[2 2]] out-shapes)))) diff --git a/contrib/clojure-package/test/org/apache/clojure_mxnet/visualization_test.clj b/contrib/clojure-package/test/org/apache/clojure_mxnet/visualization_test.clj new file mode 100644 index 0000000..2332941 --- /dev/null +++ b/contrib/clojure-package/test/org/apache/clojure_mxnet/visualization_test.clj @@ -0,0 +1,38 @@ +;; +;; Licensed to the Apache Software Foundation (ASF) under one or more +;; contributor license agreements. See the NOTICE file distributed with +;; this work for additional information regarding copyright ownership. +;; The ASF licenses this file to You under the Apache License, Version 2.0 +;; (the "License"); you may not use this file except in compliance with +;; the License. You may obtain a copy of the License at +;; +;; http://www.apache.org/licenses/LICENSE-2.0 +;; +;; Unless required by applicable law or agreed to in writing, software +;; distributed under the License is distributed on an "AS IS" BASIS, +;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +;; See the License for the specific language governing permissions and +;; limitations under the License. +;; + +(ns org.apache.clojure-mxnet.visualization-test + (:require [org.apache.clojure-mxnet.symbol :as sym] + [org.apache.clojure-mxnet.visualization :as viz] + [clojure.test :refer :all]) + (:import (org.apache.mxnet Visualization$Dot))) + +(deftest test-plot-network + (let [to-plot-sym (as-> (sym/variable "data") data + (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/fully-connected "fc2" {:data data :num-hidden 10}) + (sym/softmax-output "softmax" {:data data})) + dot (viz/plot-network to-plot-sym + {"data" [1 1 28 28]} + {:title "foo" + :node-attrs {:shape "oval" :fixedsize "false"}})] + (is (instance? Visualization$Dot dot))))