DiSMEC++
numpy.cpp
Go to the documentation of this file.
1 // Copyright (c) 2021, Aalto University, developed by Erik Schultheis
2 // All rights reserved.
3 //
4 // SPDX-License-Identifier: MIT
5 
6 #include "training/initializer.h"
7 #include "data/types.h"
8 #include "io/numpy.h"
9 
10 
11 using namespace dismec::init;
12 namespace {
13  using WeightMatrix = Eigen::Matrix<real_t, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
14 }
15 
16 namespace dismec::init {
18  public:
19  explicit NumpyInitializer(std::shared_ptr<const WeightMatrix> weights, std::shared_ptr<const DenseRealVector> biases) :
20  m_PreTrainedWeights(std::move(weights)),
21  m_Biases(std::move(biases))
22  {
23  }
24  void get_initial_weight(label_id_t label_id, Eigen::Ref<DenseRealVector> target, objective::Objective& objective) override {
25  if(m_Biases) {
26  target.head(target.size() - 1) = m_PreTrainedWeights->row(label_id.to_index());
27  //spdlog::info("BIAS: {}", m_Biases->coeff(label_id.to_index()));
28  target.tail(1).coeffRef(0) = m_Biases->coeff(label_id.to_index());
29  } else {
30  target = m_PreTrainedWeights->row(label_id.to_index());
31  }
32  }
33  private:
34  std::shared_ptr<const WeightMatrix> m_PreTrainedWeights;
35  std::shared_ptr<const DenseRealVector> m_Biases;
36  };
37 
39  public:
40  explicit NumpyInitializationStrategy(std::shared_ptr<const WeightMatrix>, std::shared_ptr<const DenseRealVector> biases);
41  [[nodiscard]] std::unique_ptr<WeightsInitializer> make_initializer(const std::shared_ptr<const GenericFeatureMatrix>& features) const override;
42  private:
43  std::shared_ptr<const WeightMatrix> m_WeightMatrix;
44  std::shared_ptr<const DenseRealVector> m_BiasVector;
45  };
46 }
47 
49  std::shared_ptr<const WeightMatrix> weights,
50  std::shared_ptr<const DenseRealVector> biases) :
51  m_WeightMatrix(std::move(weights)), m_BiasVector(std::move(biases)) {
52 
53 }
54 std::unique_ptr<WeightsInitializer> NumpyInitializationStrategy::make_initializer(const std::shared_ptr<const GenericFeatureMatrix>& features) const {
55  return std::make_unique<NumpyInitializer>(m_WeightMatrix, m_BiasVector);
56 }
57 
58 std::shared_ptr<WeightInitializationStrategy> dismec::init::create_numpy_initializer(const std::filesystem::path& weight_file,
59  std::optional<std::filesystem::path> bias_file) {
60  auto weights = std::make_shared<WeightMatrix>(io::load_matrix_from_npy(weight_file));
61  spdlog::info("Loaded weight matrix from {}: {} x {}", weight_file.string(), weights->rows(), weights->cols());
62  std::shared_ptr<const DenseRealVector> biases = nullptr;
63  if(bias_file) {
64  biases = std::make_shared<const DenseRealVector>(io::load_matrix_from_npy(bias_file->string()));
65  }
66  return std::make_shared<NumpyInitializationStrategy>(weights, biases);
67 }
NumpyInitializationStrategy(std::shared_ptr< const WeightMatrix >, std::shared_ptr< const DenseRealVector > biases)
Definition: numpy.cpp:48
std::shared_ptr< const WeightMatrix > m_WeightMatrix
Definition: numpy.cpp:43
std::shared_ptr< const DenseRealVector > m_BiasVector
Definition: numpy.cpp:44
std::unique_ptr< WeightsInitializer > make_initializer(const std::shared_ptr< const GenericFeatureMatrix > &features) const override
Creats a new, thread local WeightsInitializer.
Definition: numpy.cpp:54
std::shared_ptr< const WeightMatrix > m_PreTrainedWeights
Definition: numpy.cpp:34
std::shared_ptr< const DenseRealVector > m_Biases
Definition: numpy.cpp:35
void get_initial_weight(label_id_t label_id, Eigen::Ref< DenseRealVector > target, objective::Objective &objective) override
Generate an initial vector for the given label. The result should be placed in target.
Definition: numpy.cpp:24
NumpyInitializer(std::shared_ptr< const WeightMatrix > weights, std::shared_ptr< const DenseRealVector > biases)
Definition: numpy.cpp:19
Base class for all weight init strategies.
Definition: initializer.h:53
Base class for all weight initializers.
Definition: initializer.h:30
Strong typedef for an int to signify a label id.
Definition: types.h:20
Class that models an optimization objective.
Definition: objective.h:41
constexpr T to_index() const
! Explicitly convert to an integer.
Definition: opaque_int.h:32
Eigen::Matrix< real_t, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > WeightMatrix
Definition: numpy.cpp:13
std::shared_ptr< WeightInitializationStrategy > create_numpy_initializer(const std::filesystem::path &weights, std::optional< std::filesystem::path > biases)
Creates an initialization strategy that uses weights loaded from a npy file.
Definition: numpy.cpp:58
types::DenseRowMajor< real_t > load_matrix_from_npy(std::istream &source)
Loads a matrix from a numpy array.
Definition: numpy.cpp:342