27 namespace mic {
namespace neural_nets {
namespace unit_tests {
35 ASSERT_EQ(nn.layers.size(), 4);
37 ASSERT_EQ(nn.layers[0]->inputSize(), 10);
38 ASSERT_EQ(nn.layers[0]->batchSize(), 1);
39 ASSERT_EQ(nn.layers[0]->outputSize(), 20);
42 ASSERT_EQ(nn.layers[2]->inputSize(), 20);
43 ASSERT_EQ(nn.layers[2]->batchSize(), 1);
44 ASSERT_EQ(nn.layers[2]->outputSize(), 4);
54 for (
size_t i=0; i< nn.layers.size(); i++)
55 ASSERT_EQ(nn.layers[0]->batchSize(), 1);
60 for (
size_t i=0; i< nn.layers.size(); i++)
61 ASSERT_EQ(nn.layers[0]->batchSize(), 5);
73 std::cout <<
"Saved network: \n" << nn;
77 restored_nn.
load(fileName);
78 std::cout <<
"Restored network: \n" << restored_nn;
81 ASSERT_EQ(nn.layers.size(), restored_nn.layers.size());
84 for (
size_t i=0; i< nn.layers.size(); i++) {
86 ASSERT_EQ(nn.layers[i]->batchSize(), restored_nn.layers[i]->batchSize());
87 ASSERT_EQ(nn.layers[i]->inputSize(), restored_nn.layers[i]->inputSize());
88 ASSERT_EQ(nn.layers[i]->outputSize(), restored_nn.layers[i]->outputSize());
89 ASSERT_EQ(nn.layers[i]->layer_type, restored_nn.layers[i]->layer_type);
107 ASSERT_LE( fabs( (*nn.layers[0]->s[
"y"])[0] - (*ffpass1_lin1_y)[0]), eps);
108 ASSERT_LE( fabs( (*nn.layers[0]->s[
"y"])[1] - (*ffpass1_lin1_y)[1]), eps);
110 ASSERT_LE( fabs( (*nn.layers[1]->s[
"y"])[0] - (*ffpass1_sig1_y)[0]), eps);
111 ASSERT_LE( fabs( (*nn.layers[1]->s[
"y"])[1] - (*ffpass1_sig1_y)[1]), eps);
113 ASSERT_LE( fabs( (*nn.layers[2]->s[
"y"])[0] - (*ffpass1_lin2_y)[0]), eps);
114 ASSERT_LE( fabs( (*nn.layers[2]->s[
"y"])[1] - (*ffpass1_lin2_y)[1]), eps);
116 ASSERT_LE( fabs( (*nn.layers[3]->s[
"y"])[0] - (*ffpass1_sig2_y)[0]), eps);
117 ASSERT_LE( fabs( (*nn.layers[3]->s[
"y"])[1] - (*ffpass1_sig2_y)[1]), eps);
120 double loss = nn.loss->calculateLoss(target_y, nn.getPredictions());
121 ASSERT_LE( fabs( loss - ffpass1_loss), eps);
124 mic::types::MatrixPtr<double> dy = MAKE_MATRIX_PTR(
double, 2, 1);
125 (*dy) = (*nn.loss->calculateGradient(target_y, nn.getPredictions()));
128 ASSERT_LE( fabs( (*dy)[0] - (*ffpass1_dy)[0]), eps);
129 ASSERT_LE( fabs( (*dy)[1] - (*ffpass1_dy)[1]), eps);
135 ASSERT_LE( fabs( (*nn.layers[2]->g[
"W"])[0] - (*bwpass1_lin2_dW)[0]), eps);
136 ASSERT_LE( fabs( (*nn.layers[2]->g[
"W"])[1] - (*bwpass1_lin2_dW)[1]), eps);
137 ASSERT_LE( fabs( (*nn.layers[2]->g[
"W"])[2] - (*bwpass1_lin2_dW)[2]), eps);
138 ASSERT_LE( fabs( (*nn.layers[2]->g[
"W"])[3] - (*bwpass1_lin2_dW)[3]), eps);
140 ASSERT_LE( fabs( (*nn.layers[0]->g[
"W"])[0] - (*bwpass1_lin1_dW)[0]), eps);
141 ASSERT_LE( fabs( (*nn.layers[0]->g[
"W"])[1] - (*bwpass1_lin1_dW)[1]), eps);
142 ASSERT_LE( fabs( (*nn.layers[0]->g[
"W"])[2] - (*bwpass1_lin1_dW)[2]), eps);
143 ASSERT_LE( fabs( (*nn.layers[0]->g[
"W"])[3] - (*bwpass1_lin1_dW)[3]), eps);
149 ASSERT_LE( fabs( (*nn.layers[2]->p[
"W"])[0] - (*bwpass1_lin2_pW_updated)[0]), eps);
150 ASSERT_LE( fabs( (*nn.layers[2]->p[
"W"])[1] - (*bwpass1_lin2_pW_updated)[1]), eps);
151 ASSERT_LE( fabs( (*nn.layers[2]->p[
"W"])[2] - (*bwpass1_lin2_pW_updated)[2]), eps);
152 ASSERT_LE( fabs( (*nn.layers[2]->p[
"W"])[3] - (*bwpass1_lin2_pW_updated)[3]), eps);
154 ASSERT_LE( fabs( (*nn.layers[0]->p[
"W"])[0] - (*bwpass1_lin1_pW_updated)[0]), eps);
155 ASSERT_LE( fabs( (*nn.layers[0]->p[
"W"])[1] - (*bwpass1_lin1_pW_updated)[1]), eps);
156 ASSERT_LE( fabs( (*nn.layers[0]->p[
"W"])[2] - (*bwpass1_lin1_pW_updated)[2]), eps);
157 ASSERT_LE( fabs( (*nn.layers[0]->p[
"W"])[3] - (*bwpass1_lin1_pW_updated)[3]), eps);
169 double loss = nn.train(input_x, target_y, 0.5);
172 ASSERT_LE( fabs( loss - ffpass1_loss), eps);
175 ASSERT_LE( fabs( (*nn.layers[0]->s[
"y"])[0] - (*ffpass1_lin1_y)[0]), eps);
176 ASSERT_LE( fabs( (*nn.layers[0]->s[
"y"])[1] - (*ffpass1_lin1_y)[1]), eps);
178 ASSERT_LE( fabs( (*nn.layers[1]->s[
"y"])[0] - (*ffpass1_sig1_y)[0]), eps);
179 ASSERT_LE( fabs( (*nn.layers[1]->s[
"y"])[1] - (*ffpass1_sig1_y)[1]), eps);
181 ASSERT_LE( fabs( (*nn.layers[2]->s[
"y"])[0] - (*ffpass1_lin2_y)[0]), eps);
182 ASSERT_LE( fabs( (*nn.layers[2]->s[
"y"])[1] - (*ffpass1_lin2_y)[1]), eps);
184 ASSERT_LE( fabs( (*nn.layers[3]->s[
"y"])[0] - (*ffpass1_sig2_y)[0]), eps);
185 ASSERT_LE( fabs( (*nn.layers[3]->s[
"y"])[1] - (*ffpass1_sig2_y)[1]), eps);
188 ASSERT_LE( fabs( (*nn.layers[2]->p[
"W"])[0] - (*bwpass1_lin2_pW_updated)[0]), eps);
189 ASSERT_LE( fabs( (*nn.layers[2]->p[
"W"])[1] - (*bwpass1_lin2_pW_updated)[1]), eps);
190 ASSERT_LE( fabs( (*nn.layers[2]->p[
"W"])[2] - (*bwpass1_lin2_pW_updated)[2]), eps);
191 ASSERT_LE( fabs( (*nn.layers[2]->p[
"W"])[3] - (*bwpass1_lin2_pW_updated)[3]), eps);
193 ASSERT_LE( fabs( (*nn.layers[0]->p[
"W"])[0] - (*bwpass1_lin1_pW_updated)[0]), eps);
194 ASSERT_LE( fabs( (*nn.layers[0]->p[
"W"])[1] - (*bwpass1_lin1_pW_updated)[1]), eps);
195 ASSERT_LE( fabs( (*nn.layers[0]->p[
"W"])[2] - (*bwpass1_lin1_pW_updated)[2]), eps);
196 ASSERT_LE( fabs( (*nn.layers[0]->p[
"W"])[3] - (*bwpass1_lin1_pW_updated)[3]), eps);
202 int main(
int argc,
char **argv) {
203 testing::InitGoogleTest(&argc, argv);
204 return RUN_ALL_TESTS();
TEST_F(Conv2x2x2Filter2x1x1s1Double, NumericalGradientCheck)
Numerical gradient test of all parameters for layer of input size 2x2x2 and with filter bank of 2 fil...
Test Fixture - simple ff net with 2 layers.
int main(int argc, char **argv)
Test Fixture - feed-forward net with 2 layers. A "formalized" example from a step-by-step tutorial: h...
bool load(std::string filename_)