[mlpack-git] [mlpack] [Proposal]Enhance the class SparseAutoencoder and SoftmaxRegression (#454)

Ryan Curtin notifications at github.com
Sat Sep 26 11:07:00 EDT 2015


> void(double value) and void(const double value) are the same thing, compiler treat them as same symbol, and since the copy of primitive would not have any side effect, could I just declare them as non const?like void(double value) rather than void(const double value).

Yeah, these are the same.  I often write 'const double' just to denote that the double won't be modified, but it doesn't really make a difference either way.

> About the default constructor, I cannot find a good way to design a default constructor to fulfill the requirements for mlpack yet, so I think it is better to remain the old way(no default constructor)

In some cases I've made a default constructor that takes the model's size but nothing else.  Take a look at the constructor I made for `NaiveBayesClassifier` yesterday; maybe that is a strategy that could be applied here?

https://github.com/mlpack/mlpack/commit/4a469b2733c122870274ab813528182157b12211#diff-9ce92a606304271ed37a8531bb3de99dR69

I think maybe instead of default constructors, simple constructors that don't take data can be used.

> The last thing is, if you do not care about breaking the old api, I would like to replace the SparseAutoencder and SparseAutoencoderFunction under the folder methods/sparse_autoencoder

Replace it with what?  Do you mean moving it to `src/mlpack/methods/ann/` or something?  I've got no problem changing the API; we're preparing for a release that will not be reverse-compatible (API-wise) anyway.  Lots of the old design abstractions turned out to not be the best ones.

> I forgot to said, rather than add a default constructor, I would suggest adding one more constructors , this way the users can reuse the trained parameters to train the model if they want to.

I didn't completely understand this idea, could you elaborate more please?

> But this also mean these two classes better offer users "save" and "load" functions.
> sm.save("smoke_params_of_sm");
> sm.load("smoke_params_of_sm");

Why not just use the existing `data::Load()` function that works with `boost::serialization` once `Serialize()` is implemented?  That would look like this:

```
data::Save("model_file.xml" /* or .bin or .txt */, "softmax_regression", sm);
data::Load("model_file.xml", "softmax_regression", sm);
```

> This way the users can reuse the trained results easier, I intent to use boost::serialization to store and save the data of the class, what do you think about it?

`boost::serialization` is pretty nice to use; you can take a look at the other classes I've used for examples (for instance, `NaiveBayesClassifier`, which I just did), or refer to their documentation.  The only difference is the serialization shim that means you can write a `Serialize()` method instead of a `serialize()` method (although, as a technical note, if you write a `serialize()` method, it will still work.  If you like template metaprogramming, take a look at `src/mlpack/core/data/serialization_shim.hpp`; it was a lot of fun to write. :) ).

---
Reply to this email directly or view it on GitHub:
https://github.com/mlpack/mlpack/issues/454#issuecomment-143461939
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.cc.gatech.edu/pipermail/mlpack-git/attachments/20150926/059c145b/attachment-0001.html>


More information about the mlpack-git mailing list