[mlpack-git] master: Add auxiliary network function to get the size of the network. (a49e0fe)
gitdub at mlpack.org
gitdub at mlpack.org
Fri Feb 19 08:58:41 EST 2016
Repository : https://github.com/mlpack/mlpack
On branch : master
Link : https://github.com/mlpack/mlpack/compare/f6dd2f7a9752a7db8ec284a938b3e84a13d0bfb2...6205f3e0b62b56452b2a4afc4da24fce5b21e72f
>---------------------------------------------------------------
commit a49e0feedb8cf04c90c742e8257410a32b6b5dfc
Author: marcus <marcus.edel at fu-berlin.de>
Date: Fri Feb 19 14:58:41 2016 +0100
Add auxiliary network function to get the size of the network.
>---------------------------------------------------------------
a49e0feedb8cf04c90c742e8257410a32b6b5dfc
src/mlpack/methods/ann/network_util.hpp | 149 +++++++++++++++++++++++
src/mlpack/methods/ann/network_util_impl.hpp | 172 +++++++++++++++++++++++++++
2 files changed, 321 insertions(+)
diff --git a/src/mlpack/methods/ann/network_util.hpp b/src/mlpack/methods/ann/network_util.hpp
new file mode 100644
index 0000000..c0b2227
--- /dev/null
+++ b/src/mlpack/methods/ann/network_util.hpp
@@ -0,0 +1,149 @@
+/**
+ * @file network_util.hpp
+ * @author Marcus Edel
+ *
+ * Neural network utilities.
+ */
+#ifndef __MLPACK_METHODS_ANN_NETWORK_UTIL_HPP
+#define __MLPACK_METHODS_ANN_NETWORK_UTIL_HPP
+
+#include <mlpack/core.hpp>
+
+#include <mlpack/methods/ann/layer/layer_traits.hpp>
+
+/**
+ * Neural network utility functions.
+ */
+namespace mlpack {
+namespace ann /** Artificial Neural Network. */ {
+
+/**
+ * Auxiliary function to get the number of weights of the specified network.
+ *
+ * @param network The network used for specifying the number of weights.
+ * @return The number of weights.
+ */
+template<size_t I = 0, typename... Tp>
+typename std::enable_if<I < sizeof...(Tp), size_t>::type
+NetworkSize(std::tuple<Tp...>& network);
+
+template<size_t I, typename... Tp>
+typename std::enable_if<I == sizeof...(Tp), size_t>::type
+NetworkSize(std::tuple<Tp...>& network);
+
+/**
+ * Auxiliary function to get the number of weights of the specified layer.
+ *
+ * @param layer The layer used for specifying the number of weights.
+ * @param output The layer output parameter.
+ * @return The number of weights.
+ */
+template<typename T, typename P>
+typename std::enable_if<
+ !HasWeightsCheck<T, P&(T::*)()>::value, size_t>::type
+LayerSize(T& layer, P& output);
+
+template<typename T, typename P>
+typename std::enable_if<
+ HasWeightsCheck<T, P&(T::*)()>::value, size_t>::type
+LayerSize(T& layer, P& output);
+
+/**
+ * Auxiliary function to set the weights of the specified network.
+ *
+ * @param weights The weights used to set the weights of the network.
+ * @param network The network used to set the weights.
+ * @param offset The memory offset of the weights.
+ */
+template<size_t I = 0, typename... Tp>
+typename std::enable_if<I < sizeof...(Tp), void>::type
+NetworkWeights(arma::mat& weights,
+ std::tuple<Tp...>& network,
+ size_t offset = 0);
+
+template<size_t I, typename... Tp>
+typename std::enable_if<I == sizeof...(Tp), void>::type
+NetworkWeights(arma::mat& weights,
+ std::tuple<Tp...>& network,
+ size_t offset = 0);
+
+/**
+ * Auxiliary function to set the weights of the specified layer.
+ *
+ * @param layer The layer used to set the weights.
+ * @param weights The weights used to set the weights of the layer.
+ * @param offset The memory offset of the weights.
+ * @param output The output parameter of the layer.
+ * @return The number of weights.
+ */
+template<typename T>
+typename std::enable_if<
+ HasWeightsCheck<T, arma::mat&(T::*)()>::value, size_t>::type
+LayerWeights(T& layer, arma::mat& weights, size_t offset, arma::mat& output);
+
+template<typename T>
+typename std::enable_if<
+ HasWeightsCheck<T, arma::cube&(T::*)()>::value, size_t>::type
+LayerWeights(T& layer, arma::mat& weights, size_t offset, arma::cube& output);
+
+template<typename T, typename P>
+typename std::enable_if<
+ !HasWeightsCheck<T, P&(T::*)()>::value, size_t>::type
+LayerWeights(T& layer, arma::mat& weights, size_t offset, P& output);
+
+/**
+ * Auxiliary function to set the gradients of the specified network.
+ *
+ * @param gradients The gradients used to set the gradient of the network.
+ * @param network The network used to set the gradients.
+ * @param offset The memory offset of the gradients.
+ * return The number of gradients.
+ */
+template<size_t I = 0, typename... Tp>
+typename std::enable_if<I < sizeof...(Tp), void>::type
+NetworkGradients(arma::mat& gradients,
+ std::tuple<Tp...>& network,
+ size_t offset = 0);
+
+template<size_t I, typename... Tp>
+typename std::enable_if<I == sizeof...(Tp), void>::type
+NetworkGradients(arma::mat& gradients,
+ std::tuple<Tp...>& network,
+ size_t offset = 0);
+
+/**
+ * Auxiliary function to set the gradients of the specified layer.
+ *
+ * @param layer The layer used to set the gradients.
+ * @param gradients The gradients used to set the gradient of the layer.
+ * @param offset The memory offset of the gradients.
+ * @param output The output parameter of the layer.
+ * @return The number of gradients.
+ */
+template<typename T>
+typename std::enable_if<
+ HasGradientCheck<T, arma::mat&(T::*)()>::value, size_t>::type
+LayerGradients(T& layer,
+ arma::mat& gradients,
+ size_t offset,
+ arma::mat& output);
+
+template<typename T>
+typename std::enable_if<
+ HasGradientCheck<T, arma::cube&(T::*)()>::value, size_t>::type
+LayerGradients(T& layer,
+ arma::mat& gradients,
+ size_t offset,
+ arma::cube& output);
+
+template<typename T, typename P>
+typename std::enable_if<
+ !HasGradientCheck<T, P&(T::*)()>::value, size_t>::type
+LayerGradients(T& layer, arma::mat& gradients, size_t offset, P& output);
+} // namespace ann
+} // namespace mlpack
+
+// Include implementation.
+#include "network_util_impl.hpp"
+
+#endif
diff --git a/src/mlpack/methods/ann/network_util_impl.hpp b/src/mlpack/methods/ann/network_util_impl.hpp
new file mode 100644
index 0000000..7752d1e
--- /dev/null
+++ b/src/mlpack/methods/ann/network_util_impl.hpp
@@ -0,0 +1,172 @@
+/**
+ * @file network_util_impl.hpp
+ * @author Marcus Edel
+ *
+ * Implementation of the network auxiliary functions.
+ */
+#ifndef __MLPACK_METHODS_ANN_NETWORK_UTIL_IMPL_HPP
+#define __MLPACK_METHODS_ANN_NETWORK_UTIL_IMPL_HPP
+
+#include "network_util_impl.hpp"
+
+#include <mlpack/methods/ann/layer/layer_traits.hpp>
+
+namespace mlpack {
+namespace ann {
+
+template<size_t I, typename... Tp>
+typename std::enable_if<I == sizeof...(Tp), size_t>::type
+NetworkSize(std::tuple<Tp...>& /* unused */)
+{
+ return 0;
+}
+
+template<size_t I, typename... Tp>
+typename std::enable_if<I < sizeof...(Tp), size_t>::type
+NetworkSize(std::tuple<Tp...>& network)
+{
+ return LayerSize(std::get<I>(network), std::get<I>(
+ network).OutputParameter()) + NetworkSize<I + 1, Tp...>(network);
+}
+
+template<typename T, typename P>
+typename std::enable_if<
+ HasWeightsCheck<T, P&(T::*)()>::value, size_t>::type
+LayerSize(T& layer, P& /* unused */)
+{
+ return layer.Weights().n_elem;
+}
+
+template<typename T, typename P>
+typename std::enable_if<
+ !HasWeightsCheck<T, P&(T::*)()>::value, size_t>::type
+LayerSize(T& /* unused */, P& /* unused */)
+{
+ return 0;
+}
+
+template<size_t I, typename... Tp>
+typename std::enable_if<I < sizeof...(Tp), void>::type
+NetworkWeights(arma::mat& weights,
+ std::tuple<Tp...>& network,
+ size_t offset)
+{
+ NetworkWeights<I + 1, Tp...>(weights, network,
+ offset + LayerWeights(std::get<I>(network), weights,
+ offset, std::get<I>(network).OutputParameter()));
+
+}
+
+template<size_t I, typename... Tp>
+typename std::enable_if<I == sizeof...(Tp), void>::type
+NetworkWeights(arma::mat& /* unused */,
+ std::tuple<Tp...>& /* unused */,
+ size_t /* unused */)
+{
+ /* Nothing to do here */
+}
+
+template<typename T>
+typename std::enable_if<
+ HasWeightsCheck<T, arma::mat&(T::*)()>::value, size_t>::type
+LayerWeights(T& layer,
+ arma::mat& weights,
+ size_t offset,
+ arma::mat& /* unused */)
+{
+ layer.Weights() = arma::mat(weights.memptr() + offset,
+ layer.Weights().n_rows, layer.Weights().n_cols, false);
+
+ return layer.Weights().n_elem;
+}
+
+template<typename T>
+typename std::enable_if<
+ HasWeightsCheck<T, arma::cube&(T::*)()>::value, size_t>::type
+LayerWeights(T& layer,
+ arma::mat& weights,
+ size_t offset,
+ arma::cube& /* unused */)
+{
+ layer.Weights() = arma::cube(weights.memptr() + offset,
+ layer.Weights().n_rows, layer.Weights().n_cols,
+ layer.Weights().n_slices, false);
+
+ return layer.Weights().n_elem;
+}
+
+template<typename T, typename P>
+typename std::enable_if<
+ !HasWeightsCheck<T, P&(T::*)()>::value, size_t>::type
+LayerWeights(T& /* unused */,
+ arma::mat& /* unused */,
+ size_t /* unused */,
+ P& /* unused */)
+{
+ return 0;
+}
+
+template<size_t I, typename... Tp>
+typename std::enable_if<I < sizeof...(Tp), void>::type
+NetworkGradients(arma::mat& gradients,
+ std::tuple<Tp...>& network,
+ size_t offset)
+{
+ NetworkGradients<I + 1, Tp...>(gradients, network,
+ offset + LayerGradients(std::get<I>(network), gradients,
+ offset, std::get<I>(network).OutputParameter()));
+}
+
+template<size_t I, typename... Tp>
+typename std::enable_if<I == sizeof...(Tp), void>::type
+NetworkGradients(arma::mat& /* unused */,
+ std::tuple<Tp...>& /* unused */,
+ size_t /* unused */)
+{
+ /* Nothing to do here */
+}
+
+template<typename T>
+typename std::enable_if<
+ HasGradientCheck<T, arma::mat&(T::*)()>::value, size_t>::type
+LayerGradients(T& layer,
+ arma::mat& gradients,
+ size_t offset,
+ arma::mat& /* unused */)
+{
+ layer.Gradient() = arma::mat(gradients.memptr() + offset,
+ layer.Weights().n_rows, layer.Weights().n_cols, false);
+
+ return layer.Weights().n_elem;
+}
+
+template<typename T>
+typename std::enable_if<
+ HasGradientCheck<T, arma::cube&(T::*)()>::value, size_t>::type
+LayerGradients(T& layer,
+ arma::mat& gradients,
+ size_t offset,
+ arma::cube& /* unused */)
+{
+ layer.Gradient() = arma::cube(gradients.memptr() + offset,
+ layer.Weights().n_rows, layer.Weights().n_cols,
+ layer.Weights().n_slices, false);
+
+ return layer.Weights().n_elem;
+}
+
+template<typename T, typename P>
+typename std::enable_if<
+ !HasGradientCheck<T, P&(T::*)()>::value, size_t>::type
+LayerGradients(T& /* unused */,
+ arma::mat& /* unused */,
+ size_t /* unused */,
+ P& /* unused */)
+{
+ return 0;
+}
+
+} // namespace ann
+} // namespace mlpack
+
+#endif
More information about the mlpack-git
mailing list