@@ -23,124 +23,122 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2323using namespace Neural ;
2424
2525namespace {
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- }
116-
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- }
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+ }
122113
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- }
120+ gradHidden[r] = sum * sigmoid_prim (hidden[r]);
121+ }
131122
132- for (size_t r = 0 ; r < network.inputCount ; r++) {
133- for (size_t c = 0 ; c < network.hiddenCount ; c++) {
134- network.weightsHidden [r * network.hiddenCount + c] -=
135- lr * gradHidden[c] * input[r];
136- }
123+ for (size_t r = 0 ; r < network.hiddenCount ; r++) {
124+ for (size_t c = 0 ; c < network.outputCount ; c++) {
125+ network.weightsOutput [r * network.outputCount + c] -=
126+ lr * gradOutput[c] * hidden[r];
137127 }
128+ }
138129
130+ for (size_t r = 0 ; r < network.hiddenCount ; r++) {
139131 for (size_t c = 0 ; c < network.outputCount ; c++) {
140- network.biasesOutput [c] -= lr * gradOutput[c];
132+ network.weightsHidden [r * network.hiddenCount + c] -=
133+ lr * gradHidden[c] * input[r];
141134 }
135+ }
142136
143- for (size_t c = 0 ; c < network.hiddenCount ; c++) {
144- network.biasesHidden [c] -= lr * gradHidden[c];
145- }
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+ }
146144}
0 commit comments