| 129 | } |
| 130 | |
| 131 | fn feedforward(&self, x: &[f64]) -> (Vec<Vec<f64>>, Vec<Vec<f64>>) { |
| 132 | |
| 133 | assert!(self.layers.len() >= 2, "At least two layers are required."); |
| 134 | assert!(x.len() == self.input_size(), "Dimension of input vector does not match."); |
| 135 | |
| 136 | let mut av = vec![x.to_vec()]; // inputs for the next layer (=sigmoid applied to outputs + bias unit) |
| 137 | let mut zv = vec![x.to_vec()]; // outputs of previous layer without sigmoid |
| 138 | let n = self.layers() - 2; |
| 139 | |
| 140 | for (idx, theta) in self.params.iter().enumerate() { |
| 141 | let net = theta.mul_vec(&av.last().unwrap()); |
| 142 | if idx < n { |
| 143 | av.push([1.0].append(&net.sigmoid())); |
| 144 | } else { |
| 145 | av.push(net.sigmoid()); |
| 146 | } |
| 147 | zv.push(net); |
| 148 | } |
| 149 | (av, zv) |
| 150 | } |
| 151 | |
| 152 | fn backprop(&self, output: &[f64], target: &[f64], av_zv: &(Vec<Vec<f64>>, Vec<Vec<f64>>)) -> Vec<Vec<f64>> { |
| 153 | |