You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mxnet.apache.org by zh...@apache.org on 2017/10/07 21:42:00 UTC
[incubator-mxnet] branch master updated: Minor enhancement for the
auto-encoder example (#8167)
This is an automated email from the ASF dual-hosted git repository.
zhasheng 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 17a22a3 Minor enhancement for the auto-encoder example (#8167)
17a22a3 is described below
commit 17a22a34d8ea49bad387c616042cb4d2e9307845
Author: Haibin Lin <li...@gmail.com>
AuthorDate: Sat Oct 7 14:41:57 2017 -0700
Minor enhancement for the auto-encoder example (#8167)
* add arg parser
* add viz
* fix viz
* add num units to parser
* remove import matplotlib
* change arg name
---
example/autoencoder/autoencoder.py | 8 ++---
example/autoencoder/mnist_sae.py | 60 +++++++++++++++++++++++++++++++++-----
example/autoencoder/solver.py | 7 -----
3 files changed, 56 insertions(+), 19 deletions(-)
diff --git a/example/autoencoder/autoencoder.py b/example/autoencoder/autoencoder.py
index a84b271..5089a4d 100644
--- a/example/autoencoder/autoencoder.py
+++ b/example/autoencoder/autoencoder.py
@@ -148,12 +148,12 @@ class AutoEncoderModel(model.MXModel):
x = mx.symbol.Dropout(data=x, p=dropout)
return x
- def layerwise_pretrain(self, X, batch_size, n_iter, optimizer, l_rate, decay, lr_scheduler=None):
+ def layerwise_pretrain(self, X, batch_size, n_iter, optimizer, l_rate, decay, lr_scheduler=None, print_every=1000):
def l2_norm(label, pred):
return np.mean(np.square(label-pred))/2.0
solver = Solver(optimizer, momentum=0.9, wd=decay, learning_rate=l_rate, lr_scheduler=lr_scheduler)
solver.set_metric(mx.metric.CustomMetric(l2_norm))
- solver.set_monitor(Monitor(1000))
+ solver.set_monitor(Monitor(print_every))
data_iter = mx.io.NDArrayIter({'data': X}, batch_size=batch_size, shuffle=True,
last_batch_handle='roll_over')
for i in range(self.N):
@@ -168,12 +168,12 @@ class AutoEncoderModel(model.MXModel):
solver.solve(self.xpu, self.stacks[i], self.args, self.args_grad, self.auxs, data_iter_i,
0, n_iter, {}, False)
- def finetune(self, X, batch_size, n_iter, optimizer, l_rate, decay, lr_scheduler=None):
+ def finetune(self, X, batch_size, n_iter, optimizer, l_rate, decay, lr_scheduler=None, print_every=1000):
def l2_norm(label, pred):
return np.mean(np.square(label-pred))/2.0
solver = Solver(optimizer, momentum=0.9, wd=decay, learning_rate=l_rate, lr_scheduler=lr_scheduler)
solver.set_metric(mx.metric.CustomMetric(l2_norm))
- solver.set_monitor(Monitor(1000))
+ solver.set_monitor(Monitor(print_every))
data_iter = mx.io.NDArrayIter({'data': X}, batch_size=batch_size, shuffle=True,
last_batch_handle='roll_over')
logging.info('Fine tuning...')
diff --git a/example/autoencoder/mnist_sae.py b/example/autoencoder/mnist_sae.py
index 5525948..8ab4b0b 100644
--- a/example/autoencoder/mnist_sae.py
+++ b/example/autoencoder/mnist_sae.py
@@ -15,30 +15,74 @@
# specific language governing permissions and limitations
# under the License.
-# pylint: skip-file
from __future__ import print_function
+import argparse
import mxnet as mx
import numpy as np
import logging
import data
from autoencoder import AutoEncoderModel
+parser = argparse.ArgumentParser(description='Train an auto-encoder model for mnist dataset.')
+parser.add_argument('--print-every', type=int, default=1000,
+ help='the interval of printing during training.')
+parser.add_argument('--batch-size', type=int, default=256,
+ help='the batch size used for training.')
+parser.add_argument('--pretrain-num-iter', type=int, default=50000,
+ help='the number of iterations for pretraining.')
+parser.add_argument('--finetune-num-iter', type=int, default=100000,
+ help='the number of iterations for fine-tuning.')
+parser.add_argument('--visualize', action='store_true',
+ help='whether to visualize the original image and the reconstructed one.')
+parser.add_argument('--num-units', type=str, default="784,500,500,2000,10",
+ help='the number of hidden units for the layers of the encoder.' \
+ 'The decoder layers are created in the reverse order.')
+
+# set to INFO to see less information during training
+logging.basicConfig(level=logging.DEBUG)
+opt = parser.parse_args()
+logging.info(opt)
+print_every = opt.print_every
+batch_size = opt.batch_size
+pretrain_num_iter = opt.pretrain_num_iter
+finetune_num_iter = opt.finetune_num_iter
+visualize = opt.visualize
+layers = [int(i) for i in opt.num_units.split(',')]
if __name__ == '__main__':
- # set to INFO to see less information during training
- logging.basicConfig(level=logging.DEBUG)
- ae_model = AutoEncoderModel(mx.gpu(0), [784,500,500,2000,10], pt_dropout=0.2,
+ ae_model = AutoEncoderModel(mx.cpu(0), layers, pt_dropout=0.2,
internal_act='relu', output_act='relu')
X, _ = data.get_mnist()
train_X = X[:60000]
val_X = X[60000:]
- ae_model.layerwise_pretrain(train_X, 256, 50000, 'sgd', l_rate=0.1, decay=0.0,
- lr_scheduler=mx.misc.FactorScheduler(20000,0.1))
- ae_model.finetune(train_X, 256, 100000, 'sgd', l_rate=0.1, decay=0.0,
- lr_scheduler=mx.misc.FactorScheduler(20000,0.1))
+ ae_model.layerwise_pretrain(train_X, batch_size, pretrain_num_iter, 'sgd', l_rate=0.1,
+ decay=0.0, lr_scheduler=mx.misc.FactorScheduler(20000,0.1),
+ print_every=print_every)
+ ae_model.finetune(train_X, batch_size, finetune_num_iter, 'sgd', l_rate=0.1, decay=0.0,
+ lr_scheduler=mx.misc.FactorScheduler(20000,0.1), print_every=print_every)
ae_model.save('mnist_pt.arg')
ae_model.load('mnist_pt.arg')
print("Training error:", ae_model.eval(train_X))
print("Validation error:", ae_model.eval(val_X))
+ if visualize:
+ try:
+ from matplotlib import pyplot as plt
+ from model import extract_feature
+ # sample a random image
+ original_image = X[np.random.choice(X.shape[0]), :].reshape(1, 784)
+ data_iter = mx.io.NDArrayIter({'data': original_image}, batch_size=1, shuffle=False,
+ last_batch_handle='pad')
+ # reconstruct the image
+ reconstructed_image = extract_feature(ae_model.decoder, ae_model.args,
+ ae_model.auxs, data_iter, 1,
+ ae_model.xpu).values()[0]
+ print("original image")
+ plt.imshow(original_image.reshape((28,28)))
+ plt.show()
+ print("reconstructed image")
+ plt.imshow(reconstructed_image.reshape((28, 28)))
+ plt.show()
+ except ImportError:
+ logging.info("matplotlib is required for visualization")
diff --git a/example/autoencoder/solver.py b/example/autoencoder/solver.py
index 5589c5a..69d8836 100644
--- a/example/autoencoder/solver.py
+++ b/example/autoencoder/solver.py
@@ -140,10 +140,3 @@ class Solver(object):
if self.iter_end_callback(i):
return
exe.outputs[0].wait_to_read()
-
-
-
-
-
-
-
--
To stop receiving notification emails like this one, please contact
['"commits@mxnet.apache.org" <co...@mxnet.apache.org>'].