@@ -30,13 +30,14 @@ double sigmoid_prim(double f) { return f * (1.0 - f); }
3030/* network */
3131
3232Vector 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);
33+ Vector y_hidden (hiddenCount);
34+ Vector y_output (outputCount);
35+ Predict (input, y_hidden, y_output);
36+ return y_output;
3637}
3738
38- Vector Network::Predict (const Vector &input, Vector &hidden,
39- Vector &output) const {
39+ void Network::Predict (const Vector &input, Vector &hidden,
40+ Vector &output) const {
4041 for (std::size_t c = 0 ; c < hiddenCount; c++) {
4142 double sum = 0.0 ;
4243 for (size_t r = 0 ; r < input.size (); r++) {
@@ -54,55 +55,54 @@ Vector Network::Predict(const Vector &input, Vector &hidden,
5455
5556 output[c] = sigmoid (sum + biasesOutput[c]);
5657 }
57-
58- return output;
5958}
6059
6160/* trainer */
6261
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};
62+ Trainer Trainer::Create (Neural::Network network) {
63+ Vector hidden (network.hiddenCount );
64+ Vector output (network.outputCount );
65+ Vector gradHidden (network.hiddenCount );
66+ Vector gradOutput (network.outputCount );
67+ return Trainer{.network = std::move (network),
68+ .hidden = std::move (hidden),
69+ .output = std::move (output),
70+ .gradHidden = std::move (gradHidden),
71+ .gradOutput = std::move (gradOutput)};
7472}
7573
7674Trainer 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 ();
75+ size_t outputCount, RandFcn rand) {
76+ Vector hidden (hiddenCount);
77+ Vector output (outputCount);
78+ Vector gradHidden (hiddenCount);
79+ Vector gradOutput (outputCount);
80+ Vector weightsHidden;
81+ weightsHidden.reserve (inputCount * hiddenCount);
8382 for (size_t i = 0 ; i < inputCount * hiddenCount; i++) {
8483 weightsHidden.push_back (rand () - 0.5 );
8584 }
8685
87- Vector biasesHidden = Vector (hiddenCount);
88- Vector weightsOutput = Vector ();
86+ Vector biasesHidden (hiddenCount);
87+ Vector weightsOutput;
88+ weightsOutput.reserve (hiddenCount * outputCount);
8989 for (size_t i = 0 ; i < hiddenCount * outputCount; i++) {
9090 weightsOutput.push_back (rand () - 0.5 );
9191 }
9292
93- Vector biasesOutput = Vector (outputCount);
93+ Vector biasesOutput (outputCount);
9494 Neural::Network network = {.inputCount = inputCount,
9595 .hiddenCount = hiddenCount,
9696 .outputCount = outputCount,
9797 .weightsHidden = std::move (weightsHidden),
9898 .biasesHidden = std::move (biasesHidden),
9999 .weightsOutput = std::move (weightsOutput),
100100 .biasesOutput = std::move (biasesOutput)};
101- return Trainer{.network = network,
102- .hidden = hidden,
103- .output = output,
104- .gradHidden = gradHidden,
105- .gradOutput = gradOutput};
101+ return Trainer{.network = std::move ( network) ,
102+ .hidden = std::move ( hidden) ,
103+ .output = std::move ( output) ,
104+ .gradHidden = std::move ( gradHidden) ,
105+ .gradOutput = std::move ( gradOutput) };
106106}
107107
108108void Trainer::Train (const Vector &input, const Vector &y, double lr) {
0 commit comments