#pragma once #include "gtest/gtest.h" #include "layer/convolution.h" using namespace ncnn; /* forward - pass: [0,1,2,3,4, 1,2,3,4,5, [1,1,1, [ 9.5, 18.5, 2,3,4,5,6, * 0.5* 1,1,1, + 0.5 = 3,4,5,6,7, 1,1,1] 18.5, 27.5] 4,5,6,7,8] */ TEST(convolution, forward) { // layer params Convolution convolution_layer; convolution_layer.num_output = 1; convolution_layer.kernel_size = 3; convolution_layer.dilation = 1; convolution_layer.stride = 2; convolution_layer.pad = 0; convolution_layer.bias_term = 1; convolution_layer.weight_data_size = 9; // input & output float_t in[] = { 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f }; float_t expected_out[] = { 9.5f, 18.5f, 18.5f, 27.5f }; // weights & bias float_t w[] = { 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f }; float_t b[] = { 0.5f }; // forward Mat mat_in(5, 5, 1, in); Mat mat_out; convolution_layer.bias_data.data = b; convolution_layer.weight_data.data = w; convolution_layer.forward(mat_in, mat_out); // check expect EXPECT_EQ(mat_out.w, 2); EXPECT_EQ(mat_out.h, 2); EXPECT_EQ(mat_out.c, 1); for (int i = 0; i < _countof(expected_out); ++i) { EXPECT_NEAR(mat_out[i], expected_out[i], 1E-5); } }