Skip to content

Commit 5f81eef

Browse files
save dulu
mampus yang baca implementasinya ck, ga make abstraction, cuma make pointerfunction awwkkwk
1 parent 9e4f122 commit 5f81eef

File tree

1 file changed

+77
-16
lines changed

1 file changed

+77
-16
lines changed

NN/FFN/basicFFN/include/ffn.hxx

Lines changed: 77 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
Copyright (C) 2025 M. Reza Dwi Prasetiawan
44
55
This project contains various experiments and explorations in C++,
6-
including topics such as number systems, neural networks, and
6+
including topics such as number systems, neural networks, and
77
visualizations of prime number patterns.
88
99
This program is free software: you can redistribute it and/or modify
@@ -20,29 +20,90 @@
2020
along with this program. If not, see <https://www.gnu.org/licenses/>.
2121
*/
2222

23-
2423
#pragma once
2524

25+
#include <cstddef>
26+
#include <random>
2627
#include <type_traits>
27-
28-
#define INPUT_SIZE 1
29-
#define HIDDEN1_SIZE 256
30-
#define HIDDEN2_SIZE 256
31-
#define OUTPUT_SIZE 1
32-
3328
namespace NN {
3429

35-
template <typename FP,
30+
enum ACTIVATION_TYPE { RELU, SIGMOID, TANH };
31+
32+
// peelu dimasukan ke typename karena semua array di dalamnya statis
33+
template <typename FP, size_t inputSize, size_t hidden1Size, size_t hidden2Size,
34+
size_t outputSize,
3635
typename = std::enable_if_t<std::is_floating_point_v<FP>, FP>>
37-
class BaseFFN {
38-
FP wIn[INPUT_SIZE][HIDDEN1_SIZE], wHid1[HIDDEN1_SIZE][HIDDEN2_SIZE],
39-
wHid2[HIDDEN2_SIZE][OUTPUT_SIZE];
40-
FP bIn[INPUT_SIZE], bHid1[HIDDEN1_SIZE], b[OUTPUT_SIZE];
41-
void init_wb() {}
36+
class FFN {
37+
ACTIVATION_TYPE act_t;
38+
FP wIn[inputSize][hidden1Size], wHid1[hidden1Size][hidden2Size],
39+
wHid2[hidden2Size][outputSize];
40+
FP bIn[hidden1Size], bHid1[hidden2Size], bHid2[outputSize];
41+
FP resIn[hidden1Size], resHid1[hidden2Size], res[outputSize];
42+
bool xavier = false;
43+
44+
template <size_t inSize, size_t outSize>
45+
void init_layer(FP k, FP (&w)[inSize][outSize], FP (&b)[inSize]) {
46+
std::random_device rd;
47+
std::mt19937 gen(rd);
48+
std::normal_distribution<FP> dis(0, std::sqrt(k));
49+
50+
for (size_t i = 0; i < outSize; ++i) {
51+
for (size_t j = 0; j < inSize; ++j) w[j][i] = dis(gen);
52+
b[i] = 1e-6;
53+
}
54+
}
55+
56+
void init_wb() {
57+
FP k0 = inputSize, k1 = hidden1Size, k2 = hidden2Size;
58+
if (xavier) {
59+
k0 += hidden1Size;
60+
k1 += hidden2Size;
61+
k2 += outputSize;
62+
}
63+
init_layer<inputSize, hidden1Size>(k0, wIn, bIn);
64+
init_layer<hidden1Size, hidden2Size>(k1, wHid1, bHid1);
65+
init_layer<hidden2Size, outputSize>(k2, wHid2, bHid2);
66+
}
67+
68+
static FP ReLU(FP x) { return x > 0 ? x : 1e-6; }
69+
static FP ReLU_deriv(FP y) { return y > 0 ? 1 : 1e-6; }
70+
static FP sigmoid(FP x) { return 1 / (1 + std::exp(-x)); }
71+
static FP sigmoid_deriv(FP y) { return y * (1 - y); }
72+
static FP tanh(FP x) { return std::tanh(x); }
73+
static FP tanh_deriv(FP y) { return 1 - y * y; }
74+
75+
template <size_t inSize, size_t outSize, bool hidden>
76+
void forward_layer(FP (&w)[inSize][outSize], FP (&b)[outSize],
77+
FP (&in)[inputSize], FP (&res)[outSize],
78+
FP (*actFunc)(FP x)) {
79+
for (size_t i = 0; i < outSize; ++i) {
80+
for (size_t j = 0; j < inSize; ++j)
81+
res[i] += hidden ? actFunc(in[i] * w[j][i]) : w[j][i] * res[j][i];
82+
res[i] += b[i];
83+
}
84+
}
4285

4386
public:
44-
BaseFFN() { init_wb(); }
45-
FP (&forward())[OUTPUT_SIZE] {}
87+
FFN(ACTIVATION_TYPE act_t = ACTIVATION_TYPE::RELU) : act_t(act_t) {
88+
init_wb();
89+
}
90+
FP (&forward(FP (&data)[inputSize]))[outputSize] {
91+
// reset layer data first
92+
resIn = {};
93+
resHid1 = {};
94+
res = {};
95+
auto actFuncFromType = [](ACTIVATION_TYPE act_t) {
96+
switch (act_t) {
97+
case ACTIVATION_TYPE::RELU: return ReLU;
98+
case ACTIVATION_TYPE::SIGMOID: return sigmoid;
99+
case ACTIVATION_TYPE::TANH: return tanh;
100+
}
101+
};
102+
forward_layer(wIn, bIn, data, resIn, actFuncFromType(act_t));
103+
forward_layer(wHid1, bHid1, resIn, resHid1, actFuncFromType(act_t));
104+
forward_layer(wHid2, bHid2, resHid1, res, actFuncFromType(act_t));
105+
return res;
106+
}
46107
};
47108

48109
} // namespace NN

0 commit comments

Comments
 (0)