| 257 | |
| 258 | template <typename Dtype> |
| 259 | void Net<Dtype>::FilterNet(const NetParameter& param, |
| 260 | NetParameter* param_filtered) { |
| 261 | NetState net_state(param.state()); |
| 262 | param_filtered->CopyFrom(param); |
| 263 | param_filtered->clear_layer(); |
| 264 | for (int i = 0; i < param.layer_size(); ++i) { |
| 265 | const LayerParameter& layer_param = param.layer(i); |
| 266 | const string& layer_name = layer_param.name(); |
| 267 | CHECK(layer_param.include_size() == 0 || layer_param.exclude_size() == 0) |
| 268 | << "Specify either include rules or exclude rules; not both."; |
| 269 | // If no include rules are specified, the layer is included by default and |
| 270 | // only excluded if it meets one of the exclude rules. |
| 271 | bool layer_included = (layer_param.include_size() == 0); |
| 272 | for (int j = 0; layer_included && j < layer_param.exclude_size(); ++j) { |
| 273 | if (StateMeetsRule(net_state, layer_param.exclude(j), layer_name)) { |
| 274 | layer_included = false; |
| 275 | } |
| 276 | } |
| 277 | for (int j = 0; !layer_included && j < layer_param.include_size(); ++j) { |
| 278 | if (StateMeetsRule(net_state, layer_param.include(j), layer_name)) { |
| 279 | layer_included = true; |
| 280 | } |
| 281 | } |
| 282 | if (layer_included) { |
| 283 | param_filtered->add_layer()->CopyFrom(layer_param); |
| 284 | } |
| 285 | } |
| 286 | } |
| 287 | |
| 288 | template <typename Dtype> |
| 289 | bool Net<Dtype>::StateMeetsRule(const NetState& state, |