Add activations enum

This commit is contained in:
2024-03-03 15:24:54 +01:00
parent 7e4460cc5e
commit f37320594a
4 changed files with 33 additions and 22 deletions

View File

@@ -10,4 +10,10 @@ relu_kernel(const float* __restrict__ src, float* __restrict__ dst, int len);
__global__ void __global__ void
linear_kernel(const float* __restrict__ src, float* __restrict__ dst, int len); linear_kernel(const float* __restrict__ src, float* __restrict__ dst, int len);
enum Activation {
SIGMOID,
RELU,
LINEAR
};
#endif // ACTIVATIONS_H #endif // ACTIVATIONS_H

View File

@@ -16,7 +16,7 @@ class Dense : public ILayer {
Dense( Dense(
int inputSize, int inputSize,
int outputSize, int outputSize,
std::string activation, Activation activation,
cublasHandle_t cublasHandle cublasHandle_t cublasHandle
); );
~Dense(); ~Dense();
@@ -37,7 +37,7 @@ class Dense : public ILayer {
std::vector<float> weights; std::vector<float> weights;
std::vector<float> biases; std::vector<float> biases;
std::string activation; Activation activation;
void initializeWeights(); void initializeWeights();
void initializeBiases(); void initializeBiases();

View File

@@ -13,7 +13,7 @@
Layers::Dense::Dense( Layers::Dense::Dense(
int inputSize, int inputSize,
int outputSize, int outputSize,
std::string activation, Activation activation,
cublasHandle_t cublasHandle cublasHandle_t cublasHandle
) )
: inputSize(inputSize), : inputSize(inputSize),
@@ -68,18 +68,24 @@ void Layers::Dense::forward(const float* d_input, float* d_output) {
int threadsPerBlock = 256; int threadsPerBlock = 256;
int blocksPerGrid = (outputSize + threadsPerBlock - 1) / threadsPerBlock; int blocksPerGrid = (outputSize + threadsPerBlock - 1) / threadsPerBlock;
if (activation == "sigmoid") { switch (activation) {
case SIGMOID:
sigmoid_kernel<<<blocksPerGrid, threadsPerBlock>>>( sigmoid_kernel<<<blocksPerGrid, threadsPerBlock>>>(
d_output, d_output, outputSize d_output, d_output, outputSize
); );
} else if (activation == "relu") { break;
case RELU:
relu_kernel<<<blocksPerGrid, threadsPerBlock>>>( relu_kernel<<<blocksPerGrid, threadsPerBlock>>>(
d_output, d_output, outputSize d_output, d_output, outputSize
); );
} else { break;
default:
linear_kernel<<<blocksPerGrid, threadsPerBlock>>>( linear_kernel<<<blocksPerGrid, threadsPerBlock>>>(
d_output, d_output, outputSize d_output, d_output, outputSize
); );
break;
} }
CUDA_CHECK(cudaDeviceSynchronize()); CUDA_CHECK(cudaDeviceSynchronize());

View File

@@ -17,7 +17,7 @@ class DenseLayerTest : public CublasTestFixture {
std::vector<float>& biases, std::vector<float>& biases,
float*& d_input, float*& d_input,
float*& d_output, float*& d_output,
std::string activation Activation activation
) { ) {
// Create Dense layer // Create Dense layer
Layers::Dense denseLayer( Layers::Dense denseLayer(
@@ -63,7 +63,7 @@ TEST_F(DenseLayerTest, Init) {
// std::cout << "Dense layer: input size = " << inputSize << ", // std::cout << "Dense layer: input size = " << inputSize << ",
// output size = " << outputSize << std::endl; // output size = " << outputSize << std::endl;
Layers::Dense denseLayer( Layers::Dense denseLayer(
inputSize, outputSize, "sigmoid", cublasHandle inputSize, outputSize, SIGMOID, cublasHandle
); );
} }
} }
@@ -81,7 +81,7 @@ TEST_F(DenseLayerTest, setWeights) {
{1.3f, 0.5f, 0.0f, 1.7f} {1.3f, 0.5f, 0.0f, 1.7f}
}; };
Layers::Dense denseLayer(inputSize, outputSize, "sigmoid", cublasHandle); Layers::Dense denseLayer(inputSize, outputSize, SIGMOID, cublasHandle);
denseLayer.setWeights(weights); denseLayer.setWeights(weights);
} }
@@ -108,8 +108,7 @@ TEST_F(DenseLayerTest, ForwardUnitWeightMatrixLinear) {
float* d_output; float* d_output;
Layers::Dense denseLayer = commonTestSetup( Layers::Dense denseLayer = commonTestSetup(
inputSize, outputSize, input, weights, biases, d_input, d_output, inputSize, outputSize, input, weights, biases, d_input, d_output, LINEAR
"linear"
); );
denseLayer.forward(d_input, d_output); denseLayer.forward(d_input, d_output);
@@ -145,7 +144,7 @@ TEST_F(DenseLayerTest, ForwardRandomWeightMatrixRelu) {
float* d_output; float* d_output;
Layers::Dense denseLayer = commonTestSetup( Layers::Dense denseLayer = commonTestSetup(
inputSize, outputSize, input, weights, biases, d_input, d_output, "relu" inputSize, outputSize, input, weights, biases, d_input, d_output, RELU
); );
denseLayer.forward(d_input, d_output); denseLayer.forward(d_input, d_output);
@@ -188,7 +187,7 @@ TEST_F(DenseLayerTest, ForwardRandomWeightMatrixSigmoid) {
Layers::Dense denseLayer = commonTestSetup( Layers::Dense denseLayer = commonTestSetup(
inputSize, outputSize, input, weights, biases, d_input, d_output, inputSize, outputSize, input, weights, biases, d_input, d_output,
"sigmoid" SIGMOID
); );
denseLayer.forward(d_input, d_output); denseLayer.forward(d_input, d_output);