30 template <
int In,
int Out,
typename Activation>
void addLayer() { net_wrapper_.addLayer<In, Out, Activation>(); }
50 std::cout <<
">>> Running CPU Experiment: " << config.
name << std::endl;
52 net_wrapper_.bindParams(config.
seed);
55 optimizer.
optimize(net_wrapper_, dataset_, config);
57 net_wrapper_.getInternal().test(dataset_.train_x, dataset_.train_y,
"Training Results");
64 void test() { net_wrapper_.getInternal().test(dataset_.test_x, dataset_.test_y,
"Test Results"); }
93 template <
int In,
int Out,
typename Activation>
void addLayer() { net_wrapper_.addLayer<In, Out, Activation>(); }
99 void buildNetwork() { net_wrapper_.bindParams(); }
110 if constexpr (std::is_same<double, cuda_mlp::CudaScalar>::value) {
114 std::vector<cuda_mlp::CudaScalar> temp(mat.size());
115 const double *ptr = mat.data();
116 for (
size_t i = 0; i < static_cast<size_t>(mat.size()); ++i)
118 dev_buf.copy_from_host(temp.data(), temp.size());
122 upload(dataset_.train_x, d_train_x_);
123 upload(dataset_.train_y, d_train_y_);
124 upload(dataset_.test_x, d_test_x_);
125 upload(dataset_.test_y, d_test_y_);
127 std::cout <<
"Data Uploaded to GPU. Train: " << dataset_.train_x.cols() <<
" samples." << std::endl;
136 std::cout <<
">>> Running CUDA Experiment: " << config.
name << std::endl;
138 net_wrapper_.bindParams(config.
seed);
141 optimizer.optimize(handle_, net_wrapper_, dataset_, d_train_x_, d_train_y_, config);
143 evaluate(dataset_.train_x, dataset_.train_y, d_train_x_,
"Training Results");
150 void test() { evaluate(dataset_.test_x, dataset_.test_y, d_test_x_,
"Test Results"); }
154 void evaluate(
const Eigen::MatrixXd &x,
155 const Eigen::MatrixXd &y,
158 int batch_size =
static_cast<int>(x.cols());
159 int out_dim =
static_cast<int>(y.rows());
161 auto &net = net_wrapper_.getInternal();
162 net.forward_only(d_x.
data(), batch_size);
164 std::vector<cuda_mlp::CudaScalar> host_output(batch_size * out_dim);
165 net.copy_output_to_host(host_output.data(), host_output.size());
169 const double *target_ptr = y.data();
171 for (
int i = 0; i < batch_size; ++i) {
174 double pred_max = -1e20;
175 double true_max = -1e20;
177 for (
int r = 0; r < out_dim; ++r) {
178 int idx = r + i * out_dim;
179 double val = host_output[idx];
180 double tval = target_ptr[idx];
182 mse += (val - tval) * (val - tval);
184 if (val > pred_max) {
188 if (tval > true_max) {
193 if (pred_idx == true_idx) correct++;
196 mse /= (double)(batch_size * out_dim);
197 double acc = ((double)correct / batch_size) * 100.0;
198 std::cout << label <<
": MSE=" << mse <<
", Accuracy=" << acc <<
"%" << std::endl;
CPU specialization of the network wrapper.
Definition: network_wrapper.hpp:60
Definition: network_wrapper.hpp:55
void test()
Evaluate on test data.
Definition: unified_launcher.hpp:64
void addLayer()
Add a layer to the CPU network.
Definition: unified_launcher.hpp:30
void train(UnifiedOptimizer< CpuBackend > &optimizer, const UnifiedConfig &config)
Run training for the selected optimizer.
Definition: unified_launcher.hpp:49
void buildNetwork()
Finalize parameters and internal buffers.
Definition: unified_launcher.hpp:36
UnifiedLauncher()=default
void setData(const UnifiedDataset &data)
Attach the training/test dataset.
Definition: unified_launcher.hpp:42
NetworkWrapper< CpuBackend > & getWrapper()
Access the underlying wrapper.
Definition: unified_launcher.hpp:70
Definition: unified_launcher.hpp:15
Specialization for CPU Backend.
Definition: unified_optimization.hpp:144
virtual void optimize(NetworkWrapper< CpuBackend > &net, const UnifiedDataset &data, const UnifiedConfig &config)=0
Executes the optimization strategy.
Abstract base class for backend-specific optimizer strategies.
Definition: unified_optimization.hpp:135
RAII-managed cuBLAS handle.
Definition: cublas_handle.cuh:22
Owning buffer for device memory.
Definition: device_buffer.cuh:7
T * data()
Mutable raw pointer to device memory.
Definition: device_buffer.cuh:68
float CudaScalar
Scalar type used across CUDA kernels and optimizers.
Definition: common.cuh:11
Backend-agnostic wrapper for CPU/CUDA networks.
Backend tag for CPU implementations.
Definition: network_wrapper.hpp:20
Backend tag for CUDA implementations.
Definition: network_wrapper.hpp:22
Configuration parameters for training experiments.
Definition: unified_optimization.hpp:26
unsigned int seed
Definition: unified_optimization.hpp:47
bool reset_params
Definition: unified_optimization.hpp:46
std::string name
Definition: unified_optimization.hpp:27
Container for training and test data.
Definition: unified_optimization.hpp:54