26 #include <boost/thread/thread.hpp>
27 #include <boost/bind.hpp>
29 #include <importers/MNISTMatrixImporter.hpp>
31 #include <logger/Log.hpp>
32 #include <logger/ConsoleOutput.hpp>
33 using namespace mic::logger;
35 #include <application/ApplicationState.hpp>
37 #include <configuration/ParameterServer.hpp>
39 #include <opengl/visualization/WindowManager.hpp>
40 #include <opengl/visualization/WindowGrayscaleBatch.hpp>
41 #include <opengl/visualization/WindowCollectorChart.hpp>
42 using namespace mic::opengl::visualization;
46 using namespace mic::mlnn;
49 #include <encoders/MatrixXfMatrixXfEncoder.hpp>
50 #include <encoders/UIntMatrixXfEncoder.hpp>
63 mic::importers::MNISTMatrixImporter<float>*
importer;
106 LOG(LINFO) <<
"Generated new neural network";
114 size_t iteration = 0;
121 while (!APP_STATE->Quit()) {
124 if (!APP_STATE->isPaused()) {
127 if (APP_STATE->isSingleStepModeOn())
128 APP_STATE->pressPause();
131 APP_DATA_SYNCHRONIZATION_SCOPED_LOCK();
134 mic::types::MNISTBatch<float> bt =
importer->getRandomBatch();
137 mic::types::MatrixXfPtr encoded_batch =
mnist_encoder->encodeBatch(bt.data());
138 mic::types::MatrixXfPtr encoded_labels =
label_encoder->encodeBatch(bt.labels());
151 float loss =
neural_net.
train (encoded_batch, encoded_labels, 0.001, 0.0001);
158 if (iteration%10 == 0) {
162 std::shared_ptr<mic::mlnn::convolution::Convolution<float> > conv1 =
164 w_conv10->setBatchUnsynchronized(conv1->getInputActivations());
165 w_conv11->setBatchUnsynchronized(conv1->getInputGradientActivations());
166 w_conv12->setBatchUnsynchronized(conv1->getWeightActivations());
167 w_conv13->setBatchUnsynchronized(conv1->getWeightGradientActivations());
168 w_conv14->setBatchUnsynchronized(conv1->getOutputActivations());
169 w_conv15->setBatchUnsynchronized(conv1->getOutputGradientActivations());
172 mic::types::MatrixPtr<float> similarity = conv1->getFilterSimilarityMatrix();
173 w_conv16->setSampleUnsynchronized(similarity);
175 float max_similarity = 0;
176 float mean_similarity = 0;
177 for (
size_t i=0; i<9; i++)
178 for (
size_t j=0; j<i; j++) {
179 std::string label =
"Similarity " + std::to_string(i) +
"-" +std::to_string(j);
180 collector_ptr->addDataToContainer(label, (*similarity)(i,j));
181 mean_similarity += (*similarity)(i,j);
182 max_similarity = ((*similarity)(i,j) > max_similarity) ? (*similarity)(i,j) : max_similarity;
185 collector_ptr->addDataToContainer(
"Similarity max", max_similarity);
186 mean_similarity /= (1+2+3+4+5+6+7+8);
187 collector_ptr->addDataToContainer(
"Similarity mean", mean_similarity);
190 std::shared_ptr<mic::mlnn::convolution::Convolution<float> > conv2 =
192 w_conv20->setBatchUnsynchronized(conv2->getInputActivations());
193 w_conv21->setBatchUnsynchronized(conv2->getInputGradientActivations());
194 w_conv22->setBatchUnsynchronized(conv2->getWeightActivations());
195 w_conv23->setBatchUnsynchronized(conv2->getWeightGradientActivations());
196 w_conv24->setBatchUnsynchronized(conv2->getOutputActivations());
197 w_conv25->setBatchUnsynchronized(conv2->getOutputGradientActivations());
199 std::shared_ptr<mic::mlnn::fully_connected::Linear<float> > lin1 =
201 w_conv30->setBatchUnsynchronized(lin1->getInputActivations());
202 w_conv31->setBatchUnsynchronized(lin1->getInputGradientActivations());
203 w_conv32->setBatchUnsynchronized(lin1->getWeightActivations());
204 w_conv33->setBatchUnsynchronized(lin1->getWeightGradientActivations());
207 w_conv34->setBatchUnsynchronized(sm1->getOutputActivations());
208 w_conv35->setBatchUnsynchronized(sm1->getOutputGradientActivations());
222 LOG(LINFO) <<
"Iteration: " << iteration <<
" loss =" << loss;
242 int main(
int argc,
char* argv[]) {
244 LOGGER->addOutput(
new ConsoleOutput());
245 LOG(LINFO) <<
"Logger initialized. Starting application";
248 PARAM_SERVER->parseApplicationParameters(argc, argv);
254 importer =
new mic::importers::MNISTMatrixImporter<float>();
258 mnist_encoder =
new mic::encoders::MatrixXfMatrixXfEncoder(28, 28);
262 PARAM_SERVER->loadPropertiesFromConfiguration();
265 PARAM_SERVER->initializePropertyDependentVariables();
268 VGL_MANAGER->initializeGLUT(argc, argv);
271 w_conv10 =
new WindowGrayscaleBatch<float>(
"Conv1 x", WindowGrayscaleBatch<float>::Norm_HotCold, WindowGrayscaleBatch<float>::Grid_Both, 50, 50, 256, 256);
272 w_conv11 =
new WindowGrayscaleBatch<float>(
"Conv1 dx", WindowGrayscaleBatch<float>::Norm_HotCold, WindowGrayscaleBatch<float>::Grid_Both, 316, 50, 256, 256);
273 w_conv12 =
new WindowGrayscaleBatch<float>(
"Conv1 W", WindowGrayscaleBatch<float>::Norm_HotCold, WindowGrayscaleBatch<float>::Grid_Both, 562, 50, 256, 256);
274 w_conv13 =
new WindowGrayscaleBatch<float>(
"Conv1 dW", WindowGrayscaleBatch<float>::Norm_HotCold, WindowGrayscaleBatch<float>::Grid_Both, 818, 50, 256, 256);
275 w_conv14 =
new WindowGrayscaleBatch<float>(
"Conv1 y", WindowGrayscaleBatch<float>::Norm_HotCold, WindowGrayscaleBatch<float>::Grid_Both, 1074, 50, 256, 256);
276 w_conv15 =
new WindowGrayscaleBatch<float>(
"Conv1 dy", WindowGrayscaleBatch<float>::Norm_HotCold, WindowGrayscaleBatch<float>::Grid_Both, 1330, 50, 256, 256);
277 w_conv16 =
new WindowGrayscaleBatch<float>(
"Conv1 similarity", WindowGrayscaleBatch<float>::Norm_HotCold, WindowGrayscaleBatch<float>::Grid_Both, 1586, 50, 256, 256);
279 w_conv20 =
new WindowGrayscaleBatch<float>(
"Conv2 x", WindowGrayscaleBatch<float>::Norm_HotCold, WindowGrayscaleBatch<float>::Grid_Both, 50, 336, 256, 256);
280 w_conv21 =
new WindowGrayscaleBatch<float>(
"Conv2 dx", WindowGrayscaleBatch<float>::Norm_HotCold, WindowGrayscaleBatch<float>::Grid_Both, 316, 336, 256, 256);
281 w_conv22 =
new WindowGrayscaleBatch<float>(
"Conv2 W", WindowGrayscaleBatch<float>::Norm_HotCold, WindowGrayscaleBatch<float>::Grid_Both, 562, 336, 256, 256);
282 w_conv23 =
new WindowGrayscaleBatch<float>(
"Conv2 dW", WindowGrayscaleBatch<float>::Norm_HotCold, WindowGrayscaleBatch<float>::Grid_Both, 818, 336, 256, 256);
283 w_conv24 =
new WindowGrayscaleBatch<float>(
"Conv2 y", WindowGrayscaleBatch<float>::Norm_HotCold, WindowGrayscaleBatch<float>::Grid_Both, 1074, 336, 256, 256);
284 w_conv25 =
new WindowGrayscaleBatch<float>(
"Conv2 dy", WindowGrayscaleBatch<float>::Norm_HotCold, WindowGrayscaleBatch<float>::Grid_Both, 1330, 336, 256, 256);
286 w_conv30 =
new WindowGrayscaleBatch<float>(
"L1 x", WindowGrayscaleBatch<float>::Norm_HotCold, WindowGrayscaleBatch<float>::Grid_Both, 50, 622, 256, 256);
287 w_conv31 =
new WindowGrayscaleBatch<float>(
"L1 dx", WindowGrayscaleBatch<float>::Norm_HotCold, WindowGrayscaleBatch<float>::Grid_Both, 316, 622, 256, 256);
288 w_conv32 =
new WindowGrayscaleBatch<float>(
"L1 W", WindowGrayscaleBatch<float>::Norm_HotCold, WindowGrayscaleBatch<float>::Grid_Both, 562, 622, 256, 256);
289 w_conv33 =
new WindowGrayscaleBatch<float>(
"L1 dW", WindowGrayscaleBatch<float>::Norm_HotCold, WindowGrayscaleBatch<float>::Grid_Both, 818, 622, 256, 256);
290 w_conv34 =
new WindowGrayscaleBatch<float>(
"SM y", WindowGrayscaleBatch<float>::Norm_None, WindowGrayscaleBatch<float>::Grid_Both, 1074, 622, 256, 256);
291 w_conv35 =
new WindowGrayscaleBatch<float>(
"SM dy", WindowGrayscaleBatch<float>::Norm_HotCold, WindowGrayscaleBatch<float>::Grid_Both, 1330, 622, 256, 256);
294 w_chart =
new WindowCollectorChart<float>(
"Statistics", 60, 878, 512, 256);
295 collector_ptr= std::make_shared < mic::utils::DataCollector<std::string, float> >( );
296 w_chart->setDataCollectorPtr(collector_ptr);
299 collector_ptr->createContainer(
"Loss", mic::types::color_rgba(0, 100, 0, 180));
301 collector_ptr->createContainer(
"Similarity max", mic::types::color_rgba(255, 0, 0, 180));
302 collector_ptr->createContainer(
"Similarity mean", mic::types::color_rgba(0, 0, 255, 180));
303 for (
size_t i=0; i<9; i++)
304 for (
size_t j=0; j<i; j++) {
305 std::string label =
"Similarity " + std::to_string(i) +
"-" +std::to_string(j);
306 collector_ptr->createContainer(label, mic::types::color_rgba(255*(9*i+j)/81, 255*(9*i+j)/81, 255*(9*i+j)/81, 180));
312 VGL_MANAGER->startVisualizationLoop();
314 LOG(LINFO) <<
"Waiting for threads to join...";
317 LOG(LINFO) <<
"Threads joined - ending application";
WindowCollectorChart< float > * w_chart
Window for displaying chart with statistics.
mic::utils::DataCollectorPtr< std::string, float > collector_ptr
Data collector.
Class implementing the layer with Exponential Linear Unit (ELU). http://arxiv.org/pdf/1511.07289v5.pdf.
WindowGrayscaleBatch< float > * w_conv15
mic::encoders::MatrixXfMatrixXfEncoder * mnist_encoder
MNIST matrix encoder.
Layer performing max pooling.
WindowGrayscaleBatch< float > * w_conv12
mic::encoders::UIntMatrixXfEncoder * label_encoder
Label 2 matrix encoder (1 hot).
Class implementing cropping operation - crops the size of image (matrix) by a margin of n pixels on e...
WindowGrayscaleBatch< float > * w_conv34
WindowGrayscaleBatch< float > * w_conv32
WindowGrayscaleBatch< float > * w_conv35
std::shared_ptr< LayerType > getLayer(size_t index_)
WindowGrayscaleBatch< float > * w_conv11
WindowGrayscaleBatch< float > * w_conv14
mic::importers::MNISTMatrixImporter< float > * importer
MNIST importer.
WindowGrayscaleBatch< float > * w_conv20
WindowGrayscaleBatch< float > * w_conv25
WindowGrayscaleBatch< float > * w_conv22
int main(int argc, char *argv[])
Main program function. Runs two threads: main (for GLUT) and another one (for data processing)...
WindowGrayscaleBatch< float > * w_conv33
WindowGrayscaleBatch< float > * w_conv16
WindowGrayscaleBatch< float > * w_conv24
void batch_function(void)
Function for batch sampling.
eT train(mic::types::MatrixPtr< eT > encoded_batch_, mic::types::MatrixPtr< eT > encoded_targets_, eT learning_rate_, eT decay_=0.0f)
WindowGrayscaleBatch< float > * w_conv10
Windows for displaying activations.
BackpropagationNeuralNetwork< float > neural_net
Multi-layer neural network.
const char * convent_filename
WindowGrayscaleBatch< float > * w_conv30
Adam - adaptive moment estimation.
WindowGrayscaleBatch< float > * w_conv21
void pushLayer(LayerType *layer_ptr_)
WindowGrayscaleBatch< float > * w_conv31
WindowGrayscaleBatch< float > * w_conv13
WindowGrayscaleBatch< float > * w_conv23