mirror of
https://github.com/lordmathis/CUDANet.git
synced 2025-11-06 01:34:22 +00:00
Make conv2d work again
This commit is contained in:
@@ -12,7 +12,7 @@ class Conv2dTest : public ::testing::Test {
|
||||
int inputChannels,
|
||||
int kernelSize,
|
||||
int stride,
|
||||
std::string padding,
|
||||
Padding padding,
|
||||
int numFilters,
|
||||
Activation activation,
|
||||
std::vector<float>& input,
|
||||
@@ -30,12 +30,14 @@ class Conv2dTest : public ::testing::Test {
|
||||
|
||||
// Allocate device memory
|
||||
cudaStatus = cudaMalloc(
|
||||
(void**)&d_input, sizeof(float) * inputSize * inputSize * inputChannels
|
||||
(void**)&d_input,
|
||||
sizeof(float) * inputSize * inputSize * inputChannels
|
||||
);
|
||||
EXPECT_EQ(cudaStatus, cudaSuccess);
|
||||
|
||||
cudaStatus = cudaMalloc(
|
||||
(void**)&d_output, sizeof(float) * conv2d.outputSize * conv2d.outputSize * numFilters
|
||||
(void**)&d_output,
|
||||
sizeof(float) * conv2d.outputSize * conv2d.outputSize * numFilters
|
||||
);
|
||||
EXPECT_EQ(cudaStatus, cudaSuccess);
|
||||
|
||||
@@ -46,7 +48,6 @@ class Conv2dTest : public ::testing::Test {
|
||||
);
|
||||
EXPECT_EQ(cudaStatus, cudaSuccess);
|
||||
|
||||
|
||||
return conv2d;
|
||||
}
|
||||
|
||||
@@ -60,13 +61,13 @@ class Conv2dTest : public ::testing::Test {
|
||||
};
|
||||
|
||||
TEST_F(Conv2dTest, SimpleTest) {
|
||||
int inputSize = 4;
|
||||
int inputChannels = 1;
|
||||
int kernelSize = 2;
|
||||
int stride = 1;
|
||||
std::string padding = "VALID";
|
||||
int numFilters = 1;
|
||||
Activation activation = LINEAR;
|
||||
int inputSize = 4;
|
||||
int inputChannels = 1;
|
||||
int kernelSize = 2;
|
||||
int stride = 1;
|
||||
Padding padding = VALID;
|
||||
int numFilters = 1;
|
||||
Activation activation = LINEAR;
|
||||
|
||||
std::vector<float> input = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f,
|
||||
7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f,
|
||||
@@ -109,14 +110,15 @@ TEST_F(Conv2dTest, SimpleTest) {
|
||||
}
|
||||
|
||||
TEST_F(Conv2dTest, ComplexTest) {
|
||||
int inputSize = 5;
|
||||
int inputChannels = 3;
|
||||
int kernelSize = 3;
|
||||
int stride = 1;
|
||||
std::string padding = "SAME";
|
||||
int numFilters = 2;
|
||||
Activation activation = LINEAR;
|
||||
int inputSize = 5;
|
||||
int inputChannels = 3;
|
||||
int kernelSize = 3;
|
||||
int stride = 1;
|
||||
Padding padding = SAME;
|
||||
int numFilters = 2;
|
||||
Activation activation = LINEAR;
|
||||
|
||||
// clang-format off
|
||||
std::vector<float> input = {
|
||||
// Channel 1
|
||||
0.823f, 0.217f, 0.435f, 0.981f, 0.742f,
|
||||
@@ -139,33 +141,32 @@ TEST_F(Conv2dTest, ComplexTest) {
|
||||
};
|
||||
|
||||
std::vector<float> kernels = {
|
||||
// Filter 1 Channel 1
|
||||
// Filter 1, Channel 1
|
||||
0.128f, 0.754f, 0.987f,
|
||||
0.321f, 0.412f, 0.635f,
|
||||
0.298f, 0.017f, 0.845f,
|
||||
// Filter 1 Channel 2
|
||||
// Filter 1, Channel 2
|
||||
0.514f, 0.729f, 0.952f,
|
||||
0.684f, 0.378f, 0.159f,
|
||||
0.823f, 0.547f, 0.216f,
|
||||
// Filter 1 Channel 3
|
||||
0.456f, 0.123f, 0.789f,
|
||||
0.123f, 0.345f, 0.123f,
|
||||
0.789f, 0.123f, 0.345f,
|
||||
// Filter 2 Channel 1
|
||||
0.123f, 0.345f, 0.123f,
|
||||
0.789f, 0.123f, 0.345f,
|
||||
0.123f, 0.345f, 0.123f,
|
||||
// Filter 2 Channel 2
|
||||
0.146f, 0.789f, 0.123f,
|
||||
0.345f, 0.123f, 0.789f,
|
||||
0.123f, 0.345f, 0.123f,
|
||||
// Filter 2 Channel 3
|
||||
0.123f, 0.345f, 0.123f,
|
||||
0.789f, 0.123f, 0.345f,
|
||||
0.123f, 0.345f, 0.123f
|
||||
|
||||
|
||||
// Filter 1, Channel 3
|
||||
0.983f, 0.231f, 0.456f,
|
||||
0.178f, 0.654f, 0.821f,
|
||||
0.345f, 0.987f, 0.123f,
|
||||
// Filter 2, Channel 1
|
||||
0.789f, 0.543f, 0.210f,
|
||||
0.012f, 0.371f, 0.638f,
|
||||
0.456f, 0.198f, 0.907f,
|
||||
// Filter 2, Channel 2
|
||||
0.101f, 0.432f, 0.759f,
|
||||
0.234f, 0.567f, 0.890f,
|
||||
0.543f, 0.876f, 0.219f,
|
||||
// Filter 2, Channel 3
|
||||
0.345f, 0.678f, 0.011f,
|
||||
0.678f, 0.011f, 0.345f,
|
||||
0.011f, 0.345f, 0.678f
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
float* d_input;
|
||||
float* d_output;
|
||||
@@ -178,4 +179,28 @@ TEST_F(Conv2dTest, ComplexTest) {
|
||||
EXPECT_EQ(inputSize, conv2d.outputSize);
|
||||
|
||||
conv2d.forward(d_input, d_output);
|
||||
|
||||
std::vector<float> output(
|
||||
conv2d.outputSize * conv2d.outputSize * numFilters
|
||||
);
|
||||
cudaMemcpy(
|
||||
output.data(), d_output,
|
||||
sizeof(float) * conv2d.outputSize * conv2d.outputSize * numFilters,
|
||||
cudaMemcpyDeviceToHost
|
||||
);
|
||||
|
||||
// Generated by tools/generate_conv2d_test.py
|
||||
std::vector<float> expected = {
|
||||
2.29426f, 3.89173f, 4.17634f, 3.25501f, 2.07618f, 5.41483f, 7.09971f,
|
||||
6.39811f, 5.71432f, 3.10928f, 5.12973f, 6.29638f, 5.26962f, 5.21997f,
|
||||
3.05852f, 6.17517f, 7.19311f, 6.69771f, 6.2142f, 4.03242f, 3.3792f,
|
||||
4.36444f, 4.396f, 4.69905f, 3.62061f, 2.87914f, 3.71743f, 3.51854f,
|
||||
2.98413f, 1.46579f, 4.94951f, 6.18983f, 4.98187f, 4.38372f, 3.35386f,
|
||||
5.0364f, 5.3756f, 4.05993f, 4.89299f, 2.78625f, 5.33763f, 5.80899f,
|
||||
5.89785f, 5.51095f, 3.74287f, 2.64053f, 4.05895f, 3.96482f, 4.30177f,
|
||||
1.94269f
|
||||
};
|
||||
for (int i = 0; i < output.size(); i++) {
|
||||
EXPECT_NEAR(output[i], expected[i], 0.0001f);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user