Skip to content

Commit 99f6e9b

Browse files
committed
Merge branch 'cpp_bug'
2 parents 23dda53 + 2472ed7 commit 99f6e9b

File tree

1 file changed

+91
-92
lines changed

1 file changed

+91
-92
lines changed

Cpp/neural.cpp

Lines changed: 91 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -23,123 +23,122 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2323
using namespace Neural;
2424

2525
namespace {
26-
double sigmoid(double f) { return 1.0 / (1.0 + exp(-f)); }
27-
double sigmoid_prim(double f) { return f * (1.0 - f); }
28-
}
26+
double sigmoid(double f) { return 1.0 / (1.0 + exp(-f)); }
27+
double sigmoid_prim(double f) { return f * (1.0 - f); }
28+
} // namespace
2929

3030
/* network */
3131

32-
Vector Network::Predict(const Vector& input) const {
33-
Vector y_hidden = Vector(hiddenCount);
34-
Vector y_output = Vector(outputCount);
35-
return Predict(input, y_hidden, y_output);
32+
Vector Network::Predict(const Vector &input) const {
33+
Vector y_hidden = Vector(hiddenCount);
34+
Vector y_output = Vector(outputCount);
35+
return Predict(input, y_hidden, y_output);
3636
}
3737

38-
Vector Network::Predict(const Vector& input, Vector& hidden, Vector& output) const {
39-
for (std::size_t c = 0; c < hiddenCount; c++) {
40-
double sum = 0.0;
41-
for (size_t r = 0; r < input.size(); r++) {
42-
sum += input[r] * weightsHidden[r * hiddenCount + c];
43-
}
44-
45-
hidden[c] = sigmoid(sum + biasesHidden[c]);
38+
Vector Network::Predict(const Vector &input, Vector &hidden,
39+
Vector &output) const {
40+
for (std::size_t c = 0; c < hiddenCount; c++) {
41+
double sum = 0.0;
42+
for (size_t r = 0; r < input.size(); r++) {
43+
sum += input[r] * weightsHidden[r * hiddenCount + c];
4644
}
4745

48-
for (size_t c = 0; c < outputCount; c++) {
49-
double sum = 0.0;
50-
for (size_t r = 0; r < hiddenCount; r++) {
51-
sum += hidden[r] * weightsOutput[r * outputCount + c];
52-
}
46+
hidden[c] = sigmoid(sum + biasesHidden[c]);
47+
}
5348

54-
output[c] = sigmoid(sum + biasesOutput[c]);
49+
for (size_t c = 0; c < outputCount; c++) {
50+
double sum = 0.0;
51+
for (size_t r = 0; r < hiddenCount; r++) {
52+
sum += hidden[r] * weightsOutput[r * outputCount + c];
5553
}
5654

57-
return output;
55+
output[c] = sigmoid(sum + biasesOutput[c]);
56+
}
57+
58+
return output;
5859
}
5960

6061
/* trainer */
6162

62-
Trainer Trainer::Create(Neural::Network&& network, size_t hiddenCount, size_t outputCount) {
63-
Vector hidden = Vector(hiddenCount);
64-
Vector output = Vector(outputCount);
65-
Vector gradHidden = Vector(hiddenCount);
66-
Vector gradOutput = Vector(outputCount);
67-
return Trainer {
68-
network,
69-
hidden,
70-
output,
71-
gradHidden,
72-
gradOutput
73-
};
63+
Trainer Trainer::Create(Neural::Network &&network, size_t hiddenCount,
64+
size_t outputCount) {
65+
Vector hidden = Vector(hiddenCount);
66+
Vector output = Vector(outputCount);
67+
Vector gradHidden = Vector(hiddenCount);
68+
Vector gradOutput = Vector(outputCount);
69+
return Trainer{.network = network,
70+
.hidden = hidden,
71+
.output = output,
72+
.gradHidden = gradHidden,
73+
.gradOutput = gradOutput};
7474
}
7575

76-
Trainer Trainer::Create(size_t inputCount, size_t hiddenCount, size_t outputCount, std::function<double()> rand) {
77-
Vector hidden = Vector(hiddenCount);
78-
Vector output = Vector(outputCount);
79-
Vector gradHidden = Vector(hiddenCount);
80-
Vector gradOutput = Vector(outputCount);
81-
Vector weightsHidden = Vector();
82-
for (size_t i = 0; i < inputCount * hiddenCount; i++) {
83-
weightsHidden.push_back(rand() - 0.5);
84-
}
85-
86-
Vector biasesHidden = Vector(hiddenCount);
87-
Vector weightsOutput = Vector();
88-
for (size_t i = 0; i < hiddenCount * outputCount; i++) {
89-
weightsOutput.push_back(rand() - 0.5);
90-
}
91-
92-
Vector biasesOutput = Vector(outputCount);
93-
Neural::Network network = {
94-
inputCount,
95-
hiddenCount,
96-
outputCount,
97-
std::move(weightsHidden),
98-
std::move(biasesHidden),
99-
std::move(weightsOutput),
100-
std::move(biasesOutput)
101-
};
102-
return Trainer {
103-
network,
104-
hidden,
105-
output,
106-
gradHidden,
107-
gradOutput
108-
};
76+
Trainer Trainer::Create(size_t inputCount, size_t hiddenCount,
77+
size_t outputCount, std::function<double()> rand) {
78+
Vector hidden = Vector(hiddenCount);
79+
Vector output = Vector(outputCount);
80+
Vector gradHidden = Vector(hiddenCount);
81+
Vector gradOutput = Vector(outputCount);
82+
Vector weightsHidden = Vector();
83+
for (size_t i = 0; i < inputCount * hiddenCount; i++) {
84+
weightsHidden.push_back(rand() - 0.5);
85+
}
86+
87+
Vector biasesHidden = Vector(hiddenCount);
88+
Vector weightsOutput = Vector();
89+
for (size_t i = 0; i < hiddenCount * outputCount; i++) {
90+
weightsOutput.push_back(rand() - 0.5);
91+
}
92+
93+
Vector biasesOutput = Vector(outputCount);
94+
Neural::Network network = {.inputCount = inputCount,
95+
.hiddenCount = hiddenCount,
96+
.outputCount = outputCount,
97+
.weightsHidden = std::move(weightsHidden),
98+
.biasesHidden = std::move(biasesHidden),
99+
.weightsOutput = std::move(weightsOutput),
100+
.biasesOutput = std::move(biasesOutput)};
101+
return Trainer{.network = network,
102+
.hidden = hidden,
103+
.output = output,
104+
.gradHidden = gradHidden,
105+
.gradOutput = gradOutput};
109106
}
110107

111-
void Trainer::Train(const Vector& input, const Vector& y, double lr) {
112-
network.Predict(input, hidden, output);
113-
for (size_t c = 0; c < output.size(); c++) {
114-
gradOutput[c] = (output[c] - y[c]) * sigmoid_prim(output[c]);
115-
}
108+
void Trainer::Train(const Vector &input, const Vector &y, double lr) {
109+
network.Predict(input, hidden, output);
110+
for (size_t c = 0; c < output.size(); c++) {
111+
gradOutput[c] = (output[c] - y[c]) * sigmoid_prim(output[c]);
112+
}
116113

117-
for (size_t r = 0; r < network.hiddenCount; r++) {
118-
double sum = 0.0;
119-
for (size_t c = 0; c < network.outputCount; c++) {
120-
sum += gradOutput[c] * network.weightsOutput[r * network.outputCount + c];
121-
}
122-
123-
gradHidden[r] = sum * sigmoid_prim(hidden[r]);
114+
for (size_t r = 0; r < network.hiddenCount; r++) {
115+
double sum = 0.0;
116+
for (size_t c = 0; c < network.outputCount; c++) {
117+
sum += gradOutput[c] * network.weightsOutput[r * network.outputCount + c];
124118
}
125119

126-
for (size_t r = 0; r < network.hiddenCount; r++) {
127-
for (size_t c = 0; c < network.outputCount; c++) {
128-
network.weightsOutput[r * network.outputCount + c] -= lr * gradOutput[c] * hidden[r];
129-
}
130-
}
131-
132-
for (size_t r = 0; r < network.hiddenCount; r++) {
133-
for (size_t c = 0; c < network.outputCount; c++) {
134-
network.weightsHidden[r * network.hiddenCount + c] -= lr * gradHidden[c] * input[r];
135-
}
136-
}
120+
gradHidden[r] = sum * sigmoid_prim(hidden[r]);
121+
}
137122

123+
for (size_t r = 0; r < network.hiddenCount; r++) {
138124
for (size_t c = 0; c < network.outputCount; c++) {
139-
network.biasesOutput[c] -= lr * gradOutput[c];
125+
network.weightsOutput[r * network.outputCount + c] -=
126+
lr * gradOutput[c] * hidden[r];
140127
}
128+
}
141129

130+
for (size_t r = 0; r < network.inputCount; r++) {
142131
for (size_t c = 0; c < network.hiddenCount; c++) {
143-
network.biasesHidden[c] -= lr * gradHidden[c];
132+
network.weightsHidden[r * network.hiddenCount + c] -=
133+
lr * gradHidden[c] * input[r];
144134
}
135+
}
136+
137+
for (size_t c = 0; c < network.outputCount; c++) {
138+
network.biasesOutput[c] -= lr * gradOutput[c];
139+
}
140+
141+
for (size_t c = 0; c < network.hiddenCount; c++) {
142+
network.biasesHidden[c] -= lr * gradHidden[c];
143+
}
145144
}

0 commit comments

Comments
 (0)