mirror of
https://github.com/lordmathis/CUDANet.git
synced 2025-11-06 01:34:22 +00:00
Rework padding size setting
This commit is contained in:
@@ -23,7 +23,7 @@ class Conv2d : public WeightedLayer {
|
|||||||
* @param kernelSize Width and height of the convolution kernel
|
* @param kernelSize Width and height of the convolution kernel
|
||||||
* @param stride Convolution stride
|
* @param stride Convolution stride
|
||||||
* @param numFilters Number of output filters
|
* @param numFilters Number of output filters
|
||||||
* @param padding Padding type ('SAME' or 'VALID')
|
* @param paddingSize Padding size
|
||||||
* @param activationType Activation function type ('RELU', 'SIGMOID',
|
* @param activationType Activation function type ('RELU', 'SIGMOID',
|
||||||
* 'SOFTMAX' or 'NONE')
|
* 'SOFTMAX' or 'NONE')
|
||||||
*/
|
*/
|
||||||
@@ -33,7 +33,7 @@ class Conv2d : public WeightedLayer {
|
|||||||
int kernelSize,
|
int kernelSize,
|
||||||
int stride,
|
int stride,
|
||||||
int numFilters,
|
int numFilters,
|
||||||
Padding padding,
|
int paddingSize,
|
||||||
ActivationType activationType
|
ActivationType activationType
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -4,32 +4,26 @@
|
|||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#define CUDANET_SAME_PADDING(inputSize, kernelSize, stride) ((stride - 1) * inputSize - stride + kernelSize) / 2;
|
||||||
|
|
||||||
|
|
||||||
namespace CUDANet::Layers {
|
namespace CUDANet::Layers {
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Padding types
|
|
||||||
*
|
|
||||||
* SAME: Zero padding such that the output size is the same as the input
|
|
||||||
* VALID: No padding
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
enum Padding { SAME, VALID };
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Basic Sequential Layer
|
* @brief Basic Sequential Layer
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
class SequentialLayer {
|
class SequentialLayer {
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* @brief Destroy the Sequential Layer
|
* @brief Destroy the Sequential Layer
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
virtual ~SequentialLayer() {};
|
virtual ~SequentialLayer(){};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Forward propagation virtual function
|
* @brief Forward propagation virtual function
|
||||||
*
|
*
|
||||||
* @param input Device pointer to the input
|
* @param input Device pointer to the input
|
||||||
* @return float* Device pointer to the output
|
* @return float* Device pointer to the output
|
||||||
*/
|
*/
|
||||||
@@ -45,7 +39,7 @@ class WeightedLayer : public SequentialLayer {
|
|||||||
* @brief Destroy the ILayer object
|
* @brief Destroy the ILayer object
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
virtual ~WeightedLayer() {};
|
virtual ~WeightedLayer(){};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Virtual function for forward pass
|
* @brief Virtual function for forward pass
|
||||||
@@ -64,7 +58,7 @@ class WeightedLayer : public SequentialLayer {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Virtual function for getting weights
|
* @brief Virtual function for getting weights
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
virtual std::vector<float> getWeights() = 0;
|
virtual std::vector<float> getWeights() = 0;
|
||||||
|
|
||||||
@@ -77,7 +71,7 @@ class WeightedLayer : public SequentialLayer {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Virtual function for getting biases
|
* @brief Virtual function for getting biases
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
virtual std::vector<float> getBiases() = 0;
|
virtual std::vector<float> getBiases() = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -12,29 +12,17 @@ Conv2d::Conv2d(
|
|||||||
int kernelSize,
|
int kernelSize,
|
||||||
int stride,
|
int stride,
|
||||||
int numFilters,
|
int numFilters,
|
||||||
Padding padding,
|
int paddingSize,
|
||||||
ActivationType activationType
|
ActivationType activationType
|
||||||
)
|
)
|
||||||
: inputSize(inputSize),
|
: inputSize(inputSize),
|
||||||
inputChannels(inputChannels),
|
inputChannels(inputChannels),
|
||||||
kernelSize(kernelSize),
|
kernelSize(kernelSize),
|
||||||
stride(stride),
|
stride(stride),
|
||||||
numFilters(numFilters) {
|
numFilters(numFilters),
|
||||||
|
paddingSize(paddingSize) {
|
||||||
switch (padding) {
|
|
||||||
case SAME:
|
|
||||||
outputSize = inputSize;
|
|
||||||
paddingSize = ((stride - 1) * inputSize - stride + kernelSize) / 2;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VALID:
|
outputSize = (inputSize - kernelSize + 2 * paddingSize) / stride + 1;
|
||||||
paddingSize = 0;
|
|
||||||
outputSize = (inputSize - kernelSize) / stride + 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
activation = Activation(
|
activation = Activation(
|
||||||
activationType, outputSize * outputSize * numFilters
|
activationType, outputSize * outputSize * numFilters
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class Conv2dTest : public ::testing::Test {
|
|||||||
int kernelSize,
|
int kernelSize,
|
||||||
int stride,
|
int stride,
|
||||||
int numFilters,
|
int numFilters,
|
||||||
CUDANet::Layers::Padding padding,
|
int paddingSize,
|
||||||
CUDANet::Layers::ActivationType activationType,
|
CUDANet::Layers::ActivationType activationType,
|
||||||
std::vector<float>& input,
|
std::vector<float>& input,
|
||||||
float* kernels,
|
float* kernels,
|
||||||
@@ -21,8 +21,8 @@ class Conv2dTest : public ::testing::Test {
|
|||||||
) {
|
) {
|
||||||
// Create Conv2d layer
|
// Create Conv2d layer
|
||||||
CUDANet::Layers::Conv2d conv2d(
|
CUDANet::Layers::Conv2d conv2d(
|
||||||
inputSize, inputChannels, kernelSize, stride, numFilters, padding,
|
inputSize, inputChannels, kernelSize, stride, numFilters,
|
||||||
activationType
|
paddingSize, activationType
|
||||||
);
|
);
|
||||||
|
|
||||||
conv2d.setWeights(kernels);
|
conv2d.setWeights(kernels);
|
||||||
@@ -54,12 +54,13 @@ class Conv2dTest : public ::testing::Test {
|
|||||||
};
|
};
|
||||||
|
|
||||||
TEST_F(Conv2dTest, SimpleTest) {
|
TEST_F(Conv2dTest, SimpleTest) {
|
||||||
int inputSize = 4;
|
int inputSize = 4;
|
||||||
int inputChannels = 1;
|
int inputChannels = 1;
|
||||||
int kernelSize = 2;
|
int kernelSize = 2;
|
||||||
int stride = 1;
|
int stride = 1;
|
||||||
int numFilters = 1;
|
int numFilters = 1;
|
||||||
CUDANet::Layers::Padding padding = CUDANet::Layers::Padding::VALID;
|
int paddingSize = 0;
|
||||||
|
|
||||||
CUDANet::Layers::ActivationType activationType =
|
CUDANet::Layers::ActivationType activationType =
|
||||||
CUDANet::Layers::ActivationType::NONE;
|
CUDANet::Layers::ActivationType::NONE;
|
||||||
|
|
||||||
@@ -77,7 +78,7 @@ TEST_F(Conv2dTest, SimpleTest) {
|
|||||||
float* d_output;
|
float* d_output;
|
||||||
|
|
||||||
CUDANet::Layers::Conv2d conv2d = commonTestSetup(
|
CUDANet::Layers::Conv2d conv2d = commonTestSetup(
|
||||||
inputSize, inputChannels, kernelSize, stride, numFilters, padding,
|
inputSize, inputChannels, kernelSize, stride, numFilters, paddingSize,
|
||||||
activationType, input, kernels.data(), d_input
|
activationType, input, kernels.data(), d_input
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -104,12 +105,12 @@ TEST_F(Conv2dTest, SimpleTest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(Conv2dTest, PaddedTest) {
|
TEST_F(Conv2dTest, PaddedTest) {
|
||||||
int inputSize = 5;
|
int inputSize = 5;
|
||||||
int inputChannels = 3;
|
int inputChannels = 3;
|
||||||
int kernelSize = 3;
|
int kernelSize = 3;
|
||||||
int stride = 1;
|
int stride = 1;
|
||||||
int numFilters = 2;
|
int numFilters = 2;
|
||||||
CUDANet::Layers::Padding padding = CUDANet::Layers::Padding::SAME;
|
int paddingSize = CUDANET_SAME_PADDING(inputSize, kernelSize, stride);
|
||||||
CUDANet::Layers::ActivationType activationType =
|
CUDANet::Layers::ActivationType activationType =
|
||||||
CUDANet::Layers::ActivationType::NONE;
|
CUDANet::Layers::ActivationType::NONE;
|
||||||
|
|
||||||
@@ -167,7 +168,7 @@ TEST_F(Conv2dTest, PaddedTest) {
|
|||||||
float* d_output;
|
float* d_output;
|
||||||
|
|
||||||
CUDANet::Layers::Conv2d conv2d = commonTestSetup(
|
CUDANet::Layers::Conv2d conv2d = commonTestSetup(
|
||||||
inputSize, inputChannels, kernelSize, stride, numFilters, padding,
|
inputSize, inputChannels, kernelSize, stride, numFilters, paddingSize,
|
||||||
activationType, input, kernels.data(), d_input
|
activationType, input, kernels.data(), d_input
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -206,12 +207,12 @@ TEST_F(Conv2dTest, PaddedTest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(Conv2dTest, StridedPaddedConvolution) {
|
TEST_F(Conv2dTest, StridedPaddedConvolution) {
|
||||||
int inputSize = 5;
|
int inputSize = 5;
|
||||||
int inputChannels = 2;
|
int inputChannels = 2;
|
||||||
int kernelSize = 3;
|
int kernelSize = 3;
|
||||||
int stride = 2;
|
int stride = 2;
|
||||||
int numFilters = 2;
|
int numFilters = 2;
|
||||||
CUDANet::Layers::Padding padding = CUDANet::Layers::Padding::SAME;
|
int paddingSize = CUDANET_SAME_PADDING(inputSize, kernelSize, stride);
|
||||||
CUDANet::Layers::ActivationType activationType =
|
CUDANet::Layers::ActivationType activationType =
|
||||||
CUDANet::Layers::ActivationType::RELU;
|
CUDANet::Layers::ActivationType::RELU;
|
||||||
|
|
||||||
@@ -254,7 +255,7 @@ TEST_F(Conv2dTest, StridedPaddedConvolution) {
|
|||||||
float* d_output;
|
float* d_output;
|
||||||
|
|
||||||
CUDANet::Layers::Conv2d conv2d = commonTestSetup(
|
CUDANet::Layers::Conv2d conv2d = commonTestSetup(
|
||||||
inputSize, inputChannels, kernelSize, stride, numFilters, padding,
|
inputSize, inputChannels, kernelSize, stride, numFilters, paddingSize,
|
||||||
activationType, input, kernels.data(), d_input
|
activationType, input, kernels.data(), d_input
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -24,10 +24,12 @@ class ModelTest : public ::testing::Test {
|
|||||||
CUDANet::Model *model =
|
CUDANet::Model *model =
|
||||||
new CUDANet::Model(inputSize, inputChannels, outputSize);
|
new CUDANet::Model(inputSize, inputChannels, outputSize);
|
||||||
|
|
||||||
|
int paddingSize = 0;
|
||||||
|
|
||||||
// Conv2d
|
// Conv2d
|
||||||
CUDANet::Layers::Conv2d *conv2d = new CUDANet::Layers::Conv2d(
|
CUDANet::Layers::Conv2d *conv2d = new CUDANet::Layers::Conv2d(
|
||||||
inputSize, inputChannels, kernelSize, stride, numFilters,
|
inputSize, inputChannels, kernelSize, stride, numFilters,
|
||||||
CUDANet::Layers::Padding::VALID,
|
paddingSize,
|
||||||
CUDANet::Layers::ActivationType::NONE
|
CUDANet::Layers::ActivationType::NONE
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user