27 namespace mic {
namespace neural_nets {
namespace unit_tests {
33 TEST(Convolutions, LayerDimensions) {
40 ASSERT_EQ(l1.
s[
"y"]->rows(), 3*5*1);
43 ASSERT_EQ(l2.output_height, 2);
44 ASSERT_EQ(l2.output_width, 3);
45 ASSERT_EQ(l2.s[
"y"]->rows(), 2*3*1);
49 ASSERT_EQ(l3.output_height, 3);
50 ASSERT_EQ(l3.output_width, 4);
51 ASSERT_EQ(l3.s[
"y"]->rows(), 3*4*1);
55 ASSERT_EQ(l4.output_height, 2);
56 ASSERT_EQ(l4.output_width, 3);
57 ASSERT_EQ(l4.s[
"y"]->rows(), 2*3*1);
61 ASSERT_EQ(l5.output_height, 3);
62 ASSERT_EQ(l5.output_width, 4);
63 ASSERT_EQ(l5.s[
"y"]->rows(), 3*4*1);
67 ASSERT_EQ(l6.output_height, 2);
68 ASSERT_EQ(l6.output_width, 3);
69 ASSERT_EQ(l6.s[
"y"]->rows(), 2*3*1);
88 mic::types::MatrixPtr<double> y = layer.forward(x);
92 for (
size_t i=0; i<8; i++)
93 ASSERT_EQ((*y)[i], (*desired_y)[i]) <<
"at position " << i;
106 mic::types::MatrixPtr<double> dx = layer.backward(dy);
110 for (
size_t i=0; i<8; i++)
111 ASSERT_EQ((*desired_dx)[i], (*dx)[i]) <<
"at position " << i;
113 mic::types::MatrixPtr<double> db = layer.g[
"b"];
115 for (
size_t i=0; i<2; i++)
116 ASSERT_EQ((*desired_db)[i], (*db)[i]) <<
"at position " << i;
119 std::cout<<
"dW0x0 = \n" << (*layer.g[
"W0x0"]).transpose() <<std::endl;
120 std::cout<<
"dW1x1 = \n" << (*layer.g[
"W1x1"]).transpose() <<std::endl;
121 std::cout<<
"dW0x1 = \n" << (*layer.g[
"W0x1"]).transpose() <<std::endl;
122 std::cout<<
"dW1x0 = \n" << (*layer.g[
"W1x0"]).transpose() <<std::endl;
124 ASSERT_EQ((*desired_dW)[0], (*layer.g[
"W0x0"])[0]);
125 ASSERT_EQ((*desired_dW)[1], (*layer.g[
"W1x1"])[0]);
126 ASSERT_EQ((*desired_dW)[2], (*layer.g[
"W0x1"])[0]);
127 ASSERT_EQ((*desired_dW)[3], (*layer.g[
"W1x0"])[0]);
142 mic::types::MatrixPtr<float> output = layer.forward(x);
146 for (
size_t i=0; i<9; i++)
147 ASSERT_EQ((*output)[i], (*desired_y)[i]) <<
"at position " << i;
150 output = layer.forward(x);
161 mic::types::MatrixPtr<float> y = layer.forward(x);
164 for (
size_t i=0; i<4; i++)
165 ASSERT_EQ((*y)[i], (*desired_y)[i]) <<
"at position " << i;
178 mic::types::MatrixPtr<float> dx = layer.backward(dy);
181 for (
size_t i=0; i<8; i++)
182 ASSERT_EQ((*desired_dx)[i], (*dx)[i]) <<
"at position " << i;
185 mic::types::MatrixPtr<float> db = layer.g[
"b"];
186 ASSERT_EQ((*desired_db)[0], (*db)[0]);
189 mic::types::MatrixPtr<float> dW = layer.g[
"W0x0"];
190 for (
size_t i=0; i<4; i++)
191 ASSERT_EQ((*desired_dW)[i], (*dW)[i]) <<
"at position " << i;
203 mic::types::MatrixPtr<double> y = layer.forward(x);
206 for (
size_t i=0; i<12; i++)
207 ASSERT_EQ((*y)[i], (*desired_y)[i]) <<
"at position " << i;
220 mic::types::MatrixPtr<double> dx = layer.backward(dy);
223 for (
size_t i=0; i<16; i++)
224 ASSERT_EQ((*desired_dx)[i], (*dx)[i]) <<
"at position " << i;
227 mic::types::MatrixPtr<double> db = layer.g[
"b"];
228 for (
size_t i=0; i<3; i++)
229 ASSERT_EQ((*desired_db)[i], (*db)[i]);
232 ASSERT_EQ((*desired_dW)[0], (*layer.g[
"W0x0"])[0]);
233 ASSERT_EQ((*desired_dW)[1], (*layer.g[
"W1x0"])[0]);
234 ASSERT_EQ((*desired_dW)[2], (*layer.g[
"W2x0"])[0]);
246 ASSERT_EQ((*layer.p[
"W0x0"]).rows(), 1);
247 ASSERT_EQ((*layer.p[
"W0x0"]).cols(), 9);
250 ASSERT_EQ((*layer.p[
"b"]).rows(), 1);
251 ASSERT_EQ((*layer.p[
"b"]).cols(), 1);
254 ASSERT_EQ((*layer.s[
"x"]).rows(), 25);
255 ASSERT_EQ((*layer.s[
"x"]).cols(), 1);
258 ASSERT_EQ((*layer.s[
"y"]).rows(), 9);
259 ASSERT_EQ((*layer.s[
"y"]).cols(), 1);
271 mic::types::MatrixPtr<float> y = layer.forward(x);
274 for (
size_t i=0; i<9; i++)
275 ASSERT_EQ((*y)[i], (*desired_y)[i]) <<
"at position " << i;
287 mic::types::MatrixPtr<float> y = layer.forward(x);
290 for (
size_t i=0; i<4; i++)
291 ASSERT_EQ((*y)[i], (*desired_y)[i]) <<
"at position " << i;
304 mic::types::MatrixPtr<float> dx = layer.backward(dy);
307 for (
size_t i=0; i<25; i++)
308 ASSERT_EQ((*desired_dx)[i], (*dx)[i]) <<
"at position " << i;
311 mic::types::MatrixPtr<float> db = layer.g[
"b"];
312 for (
size_t i=0; i<1; i++)
313 ASSERT_EQ((*desired_db)[i], (*db)[i]);
316 for (
size_t i=0; i<4; i++)
317 ASSERT_EQ((*desired_dW)[i], (*layer.g[
"W0x0"])[i]);
327 mic::types::MatrixPtr<float> output = layer.forward(x);
331 for (
size_t i=0; i<6; i++)
332 ASSERT_EQ((*output)[i], (*desired_y)[i]) <<
"at position " << i;
345 mic::types::MatrixPtr<float> output = layer.forward(x);
349 for (
size_t i=0; i<18; i++)
350 ASSERT_EQ((*output)[i], (*desired_y)[i]) <<
"at position " << i;
359 int main(
int argc,
char **argv) {
360 testing::InitGoogleTest(&argc, argv);
361 return RUN_ALL_TESTS();
Test Fixture - layer of input size 4x4x1 and with filter bank of 3 filters of size 1x1 with stride 3...
Test Fixture - layer of input size 5x6x1 and with filter bank of 1 filter of size 4x4 with stride 1...
TEST(Convolutions, LayerDimensions)
Test Fixture - layer of input size 4x4x1 and with filter bank of 1 filters of size 2x2 with stride 2...
Test Fixture - layer of input size 2x2x2 and with filter bank of 2 filters of size 1x1 with stride 1...
Test Fixture - layer of input size 5x5x1 and with filter bank of 1 filter of size 3x3 with stride 1 (...
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 - layer of input size 3x3x2 and with filter bank of 3 filters of size 2x2 with stride 1...
mic::types::MatrixArray< eT > s
States - contains input [x] and output [y] matrices.
size_t output_height
Number of receptive fields in a single channel - vertical direction.
size_t output_width
Number of receptive fields in a single channel - horizontal direction.
int main(int argc, char **argv)
Test Fixture - layer of input size 5x5x1 and with filter bank of 1 filter of size 2x2 with stride 3 (...
Test Fixture - layer of input size 7x7x3 and with filter bank of 2 filters of 3x3 with stride 2 (floa...