| 275 | |
| 276 | |
| 277 | class DFN(object): |
| 278 | |
| 279 | def __init__( |
| 280 | self, |
| 281 | hidden_dims_1=None, |
| 282 | hidden_dims_2=None, |
| 283 | optimizer="sgd(lr=0.01)", |
| 284 | init_w="std_normal", |
| 285 | loss=CrossEntropy() |
| 286 | ): |
| 287 | self.optimizer = optimizer |
| 288 | self.init_w = init_w |
| 289 | self.loss = loss |
| 290 | self.hidden_dims_1 = hidden_dims_1 |
| 291 | self.hidden_dims_2 = hidden_dims_2 |
| 292 | self.is_initialized = False |
| 293 | |
| 294 | def _set_params(self): |
| 295 | """ |
| 296 | 函数作用:模型初始化 |
| 297 | FC1 -> Sigmoid -> FC2 -> Softmax |
| 298 | """ |
| 299 | self.layers = OrderedDict() |
| 300 | self.layers["FC1"] = FullyConnected( |
| 301 | n_out=self.hidden_dims_1, |
| 302 | acti_fn="sigmoid", |
| 303 | init_w=self.init_w, |
| 304 | optimizer=self.optimizer |
| 305 | ) |
| 306 | self.layers["FC2"] = FullyConnected( |
| 307 | n_out=self.hidden_dims_2, |
| 308 | acti_fn="affine(slope=1, intercept=0)", |
| 309 | init_w=self.init_w, |
| 310 | optimizer=self.optimizer |
| 311 | ) |
| 312 | self.is_initialized = True |
| 313 | |
| 314 | def forward(self, X_train): |
| 315 | Xs = {} |
| 316 | out = X_train |
| 317 | for k, v in self.layers.items(): |
| 318 | Xs[k] = out |
| 319 | out = v.forward(out) |
| 320 | return out, Xs |
| 321 | |
| 322 | def backward(self, grad): |
| 323 | dXs = {} |
| 324 | out = grad |
| 325 | for k, v in reversed(list(self.layers.items())): |
| 326 | dXs[k] = out |
| 327 | out = v.backward(out) |
| 328 | return out, dXs |
| 329 | |
| 330 | def update(self): |
| 331 | """ |
| 332 | 函数作用:梯度更新 |
| 333 | """ |
| 334 | for k, v in reversed(list(self.layers.items())): |