/
2_cifar_conv_da.cpp
147 lines (114 loc) · 3.94 KB
/
2_cifar_conv_da.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/*
* EDDL Library - European Distributed Deep Learning Library.
* Version: 1.1
* copyright (c) 2022, Universitat Politècnica de València (UPV), PRHLT Research Centre
* Date: March 2022
* Author: PRHLT Research Centre, UPV, (rparedes@prhlt.upv.es), (jon@prhlt.upv.es)
* All rights reserved
*/
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include "eddl/apis/eddl.h"
using namespace eddl;
//////////////////////////////////
// cifar_conv_da.cpp:
// A very basic Conv for cifar10
// Data augmentation
// Using fit for training
//////////////////////////////////
int main(int argc, char **argv){
bool testing = false;
bool use_cpu = false;
for (int i = 1; i < argc; ++i) {
if (strcmp(argv[i], "--testing") == 0) testing = true;
else if (strcmp(argv[i], "--cpu") == 0) use_cpu = true;
}
// download CIFAR data
download_cifar10();
// Settings
int epochs = testing ? 2 : 10;
int batch_size = 128;
int num_classes = 10;
// network
layer in=Input({3,32,32});
layer l=in;
// Data augmentation
l = RandomHorizontalFlip(l);
l = RandomCropScale(l, {0.8f, 1.0f});
l = RandomCutout(l,{0.1,0.5},{0.1,0.5});
// l = Pad(l, {2, 2});
////
l=MaxPool(ReLu(BatchNormalization(HeUniform(Conv(l,32,{3,3},{1,1},"same",false)))),{2,2});
l=MaxPool(ReLu(BatchNormalization(HeUniform(Conv(l,64,{3,3},{1,1},"same",false)))),{2,2});
l=MaxPool(ReLu(BatchNormalization(HeUniform(Conv(l,128,{3,3},{1,1},"same",false)))),{2,2});
l=MaxPool(ReLu(BatchNormalization(HeUniform(Conv(l,256,{3,3},{1,1},"same",false)))),{2,2});
l=Reshape(l,{-1});
l=Activation(BatchNormalization(Dense(l,128)),"relu");
layer out= Softmax(BatchNormalization(Dense(l, num_classes)));
// net define input and output layers list
model net=Model({in},{out});
compserv cs = nullptr;
if (use_cpu) {
cs = CS_CPU();
} else {
cs = CS_GPU({1}, "low_mem"); // one GPU
// cs = CS_GPU({1,1},100); // two GPU with weight sync every 100 batches
// cs = CS_CPU();
// cs = CS_FPGA({1});
}
// Build model
build(net,
adam(0.001), // Optimizer
{"softmax_cross_entropy"}, // Losses
{"categorical_accuracy"}, // Metrics
cs);
// plot the model
plot(net,"model.pdf");
// get some info from the network
summary(net);
// Load and preprocess training data
Tensor* x_train = Tensor::load("cifar_trX.bin");
Tensor* y_train = Tensor::load("cifar_trY.bin");
x_train->div_(255.0f);
// Load and preprocess test data
Tensor* x_test = Tensor::load("cifar_tsX.bin");
Tensor* y_test = Tensor::load("cifar_tsY.bin");
x_test->div_(255.0f);
if (testing) {
std::string _range_ = "0:" + std::to_string(2 * batch_size);
Tensor* x_mini_train = x_train->select({_range_, ":"});
Tensor* y_mini_train = y_train->select({_range_, ":"});
Tensor* x_mini_test = x_test->select({_range_, ":"});
Tensor* y_mini_test = y_test->select({_range_, ":"});
delete x_train;
delete y_train;
delete x_test;
delete y_test;
x_train = x_mini_train;
y_train = y_mini_train;
x_test = x_mini_test;
y_test = y_mini_test;
}
for(int i=0;i<epochs;i++) {
// training, list of input and output tensors, batch, epochs
fit(net,{x_train},{y_train},batch_size, 1);
// Evaluate train
std::cout << "Evaluate test:" << std::endl;
evaluate(net,{x_test},{y_test});
}
setlr(net,{0.0001});
for(int i=0;i<epochs;i++) {
// training, list of input and output tensors, batch, epochs
fit(net,{x_train},{y_train},batch_size, 1);
// Evaluate train
std::cout << "Evaluate test:" << std::endl;
evaluate(net,{x_test},{y_test});
}
delete x_train;
delete y_train;
delete x_test;
delete y_test;
delete net;
return EXIT_SUCCESS;
}