128 {
129 setRunning();
130 auto& dataset = conf.dataset;
131 assert(dataset != nullptr);
132 auto dataloader = dataset->trainingData();
133 assert(dataloader != nullptr);
134 notify(&TrainerObserver::onTrainingBegun, model);
136 for (size_t epoch = 0; isRunning(); ++epoch) {
137 size_t progress = 0;
138 for (auto&& [out, in] : *dataloader) {
139 if (!isRunning())
140 break;
141 auto loss = adapter(model, in, out);
142 conf.optimizer->step(loss);
144 notify(&TrainerObserver::progressChanged, epoch, trainsetSize, progress);
145 progress += 1;
146 }
147 }
148 auto tmp = &TrainerObserver::onTrainingEnded;
149 notify(&TrainerObserver::onTrainingEnded, model);
150 }