1 #ifndef BPLYFMIFNNWSGMLLEKBJMAJDBRSPHHRAYMOHTWSTCMNMFSLLYNQTTCCAQXKXSLMSLKESHRASL
2 #define BPLYFMIFNNWSGMLLEKBJMAJDBRSPHHRAYMOHTWSTCMNMFSLLYNQTTCCAQXKXSLMSLKESHRASL
8 #include "./utils/better_assert.hpp"
9 #include "./utils/context_cast.hpp"
10 #include "./utils/tqdm.hpp"
17 template< Expression Ex >
20 if constexpr (is_variable_v<Ex>)
24 else if constexpr (is_binary_operator_v<Ex>)
29 else if constexpr (is_unary_operator_v<Ex>)
43 template< Expression Ex, Place_Holder Ph, Expression Ey >
46 if constexpr (is_value_v<Ex> || is_constant_v<Ex> || is_variable_v<Ex>)
50 else if constexpr (is_place_holder_v<Ex>)
52 return new_expression;
55 else if constexpr (is_unary_operator_v<Ex>)
59 else if constexpr (is_binary_operator_v<Ex>)
67 better_assert(
false,
"replace::Should never reach here!" );
71 template<
typename Model,
typename Optimizer,
typename Loss >
75 typedef decltype(std::declval<Optimizer>()(std::declval<Loss&>()))
optimizer_type;
94 template< Tensor Tsor >
95 auto evaluate( Tsor
const& inputs, Tsor
const& outputs,
unsigned long batch_size=32 )
98 unsigned long const samples = *(inputs.shape().begin());
99 unsigned long const loops = samples / batch_size;
102 std::vector<unsigned long> batch_input_shape = inputs.shape();
103 batch_input_shape[0] = batch_size;
104 Tsor input_samples{ batch_input_shape };
105 unsigned long const input_size_per_batch = input_samples.size();
108 std::vector<unsigned long> batch_output_shape = outputs.shape();
109 batch_output_shape[0] = batch_size;
110 Tsor output_samples{ batch_output_shape };
111 unsigned long const output_size_per_batch = output_samples.size();
115 auto& s = get_default_session<Tsor>();
119 typedef typename Tsor::value_type value_type;
120 value_type validation_error = 0;
124 for (
auto l : tq::trange( loops ) )
127 std::copy_n( inputs.data() + l * input_size_per_batch, input_size_per_batch, input_samples.data() );
128 std::copy_n( outputs.data() + l * output_size_per_batch, output_size_per_batch, output_samples.data() );
130 auto error = s.run(
loss_ ).as_scalar();
132 validation_error += error;
137 return validation_error / loops;
163 template< Tensor Tsor >
164 auto fit( Tsor
const& inputs, Tsor
const& outputs,
unsigned long batch_size,
unsigned long epoch=1,
int verbose=0,
double validation_split=0.0 )
167 unsigned long const samples = *(inputs.shape().begin());
168 unsigned long const loops_per_epoch = samples / batch_size;
169 unsigned long const training_loops = ( 1.0 - validation_split ) * loops_per_epoch;
170 unsigned long const validation_loops = loops_per_epoch - training_loops;
173 std::vector<unsigned long> batch_input_shape = inputs.shape();
174 batch_input_shape[0] = batch_size;
175 Tsor input_samples{ batch_input_shape };
176 unsigned long const input_size_per_batch = input_samples.size();
179 std::vector<unsigned long> batch_output_shape = outputs.shape();
180 batch_output_shape[0] = batch_size;
181 Tsor output_samples{ batch_output_shape };
182 unsigned long const output_size_per_batch = output_samples.size();
186 auto& s = get_default_session<Tsor>();
191 typedef typename Tsor::value_type value_type;
192 std::vector<value_type> training_errors;
193 std::vector<value_type> validation_errors;
197 for (
auto e : range( epoch ) )
199 value_type training_error = 0;
200 value_type validation_error = 0;
201 for (
auto l : tq::trange( loops_per_epoch ) )
204 std::copy_n( inputs.data() + l * input_size_per_batch, input_size_per_batch, input_samples.data() );
205 std::copy_n( outputs.data() + l * output_size_per_batch, output_size_per_batch, output_samples.data() );
207 auto error = s.run(
loss_ ).as_scalar();
209 if ( l <= training_loops )
211 training_error += error;
216 validation_error += error;
219 training_errors.push_back( training_error / training_loops );
220 validation_errors.push_back( validation_error / validation_loops );
222 std::cout <<
"\nTraining error: " << training_error / training_loops <<
" and validation error: " << validation_error / validation_loops <<
" at epoch: " << e+1 <<
"/" << epoch;
223 std::cout << std::endl;
225 return std::make_tuple( training_errors, validation_errors );
246 template< Tensor Tsor >
250 auto& s = get_default_session<Tsor>();
254 auto error = s.run(
loss_ );
257 return error.as_scalar();
260 template< Tensor Tsor>
264 return m.predict( input_tensor );
267 template< Expression Exp >
279 template<
typename Model,
typename Optimizer,
typename Loss >
282 auto input_place_holder = m.input();
283 auto ground_truth_place_holder =
typename Model::input_layer_type{};
284 auto loss = l( m.output() )( ground_truth_place_holder );
285 auto optimizer = o( loss );
286 return compiled_model{ m, input_place_holder, ground_truth_place_holder, loss, o};
295 template< Expression Ex, Place_Holder Ph >
345 template< Tensor Tsor>
351 auto& s = get_default_session<Tsor>();
381 template< Expression Exp >
401 template<
typename Loss,
typename Optimizer >
402 auto compile( Loss
const& l, Optimizer
const& o )
418 auto& s = get_default_session<tensor<float>>();
427 auto& s = get_default_session<tensor<float>>();
428 s.deserialize( file );
436 void summary(std::string
const& file_name=std::string{})
const noexcept
440 if ( file_name.empty() )
442 std::cout << g << std::endl;
446 std::ofstream ofs{ file_name };
Definition: activation.hpp:12
static constexpr auto make_binary_operator
Definition: operation.hpp:108
auto make_compiled_model(Model const &m, Loss const &l, Optimizer const &o)
Definition: model.hpp:280
auto replace_placeholder_with_expression(Ex const &ex, Ph const &old_place_holder, Ey const &new_expression)
Definition: model.hpp:44
std::string computation_graph(Ex const &ex) noexcept
Definition: operation.hpp:178
void make_trainable(Ex &ex, bool t)
Definition: model.hpp:18
static constexpr auto make_unary_operator
Definition: operation.hpp:49
auto fit(Tsor const &inputs, Tsor const &outputs, unsigned long batch_size, unsigned long epoch=1, int verbose=0, double validation_split=0.0)
Definition: model.hpp:164
Loss loss_
Definition: model.hpp:80
Optimizer optimizer_
Definition: model.hpp:81
optimizer_type compiled_optimizer_
Definition: model.hpp:82
decltype(std::declval< Optimizer >()(std::declval< Loss & >())) typedef optimizer_type
Definition: model.hpp:75
auto evaluate(Tsor const &inputs, Tsor const &outputs, unsigned long batch_size=32)
Definition: model.hpp:95
Model model_
Definition: model.hpp:77
auto operator()(Exp const &ex) const noexcept
Definition: model.hpp:268
io_layer_type input_place_holder_
Definition: model.hpp:78
void trainable(bool t)
Definition: model.hpp:273
Model::input_layer_type io_layer_type
Definition: model.hpp:74
io_layer_type ground_truth_place_holder_
Definition: model.hpp:79
auto train_on_batch(Tsor const &input, Tsor const &output)
Definition: model.hpp:247
auto predict(Tsor const &input_tensor)
Definition: model.hpp:261
Definition: model.hpp:297
Ex output_layer_type
Definition: model.hpp:299
auto compile(Loss const &l, Optimizer const &o)
Definition: model.hpp:402
model(input_layer_type const &place_holder, output_layer_type const &expression)
Definition: model.hpp:327
void trainable(bool t)
Definition: model.hpp:407
input_layer_type place_holder_
Definition: model.hpp:302
output_layer_type expression_
output layer of the model.
Definition: model.hpp:301
void save_weights(std::string const &file)
Definition: model.hpp:416
auto operator()(Exp const &ex) const noexcept
Definition: model.hpp:382
output_layer_type output() const noexcept
Definition: model.hpp:313
input_layer_type input() const noexcept
Definition: model.hpp:308
void summary(std::string const &file_name=std::string{}) const noexcept
Definition: model.hpp:436
auto predict(Tsor const &input_tensor)
Definition: model.hpp:346
Ph input_layer_type
Definition: model.hpp:298
void load_weights(std::string const &file)
Definition: model.hpp:425
Definition: place_holder.hpp:24