| ## @package layer_model_instantiator |
| # Module caffe2.python.layer_model_instantiator |
| |
| |
| |
| |
| |
| from caffe2.python import core, schema |
| from caffe2.python.layers.layers import InstantiationContext |
| from caffe2.python.layers.tags import Tags |
| |
| |
| def _filter_layers(layers, include_tags): |
| if include_tags is None: |
| return layers |
| include_tags = set(include_tags) |
| return [l for l in layers if not include_tags.isdisjoint(l.tags)] |
| |
| |
| def shrink_output_schema(net, out_schema): |
| if len(out_schema.field_names()) <= 1: |
| return out_schema |
| exists = [net.BlobIsDefined(blob) for blob in out_schema.field_blobs()] |
| return schema.from_column_list( |
| [ |
| col_name for ok, col_name in |
| zip(exists, out_schema.field_names()) if ok |
| ], |
| [ |
| col_type for ok, col_type in |
| zip(exists, out_schema.field_types()) if ok |
| ], |
| [ |
| col_blob for ok, col_blob in |
| zip(exists, out_schema.field_blobs()) if ok |
| ], |
| [ |
| col_meta for ok, col_meta in |
| zip(exists, out_schema.field_metadata()) if ok |
| ] |
| ) |
| |
| |
| def generate_predict_net(model, include_tags=None): |
| predict_net = core.Net('predict_net') |
| |
| for layer in _filter_layers(model.layers, include_tags): |
| if Tags.EXCLUDE_FROM_PREDICTION not in layer.tags: |
| layer.add_operators( |
| predict_net, context=InstantiationContext.PREDICTION) |
| |
| predict_net.set_input_record(model.input_feature_schema.clone()) |
| output_schema = shrink_output_schema( |
| predict_net, model.output_schema.clone() |
| ) |
| predict_net.set_output_record(output_schema) |
| return predict_net |
| |
| |
| def generate_eval_net(model, include_tags=None): |
| eval_net = core.Net('eval_net') |
| |
| for layer in _filter_layers(model.layers, include_tags): |
| if Tags.EXCLUDE_FROM_EVAL not in layer.tags: |
| layer.add_operators(eval_net, context=InstantiationContext.EVAL) |
| |
| input_schema = model.input_feature_schema + model.trainer_extra_schema |
| eval_net.set_input_record(input_schema) |
| output_schema = shrink_output_schema( |
| eval_net, model.output_schema + model.metrics_schema |
| ) |
| eval_net.set_output_record(output_schema) |
| return eval_net |
| |
| |
| def _generate_training_net_only(model, include_tags=None): |
| train_net = core.Net('train_net') |
| train_init_net = model.create_init_net('train_init_net') |
| |
| for layer in _filter_layers(model.layers, include_tags): |
| if Tags.EXCLUDE_FROM_TRAIN not in layer.tags: |
| layer.add_operators(train_net, train_init_net) |
| |
| input_schema = model.input_feature_schema + model.trainer_extra_schema |
| train_net.set_input_record(input_schema) |
| output_schema = shrink_output_schema( |
| train_net, model.output_schema + model.metrics_schema |
| ) |
| train_net.set_output_record(output_schema) |
| return train_init_net, train_net |
| |
| |
| def generate_training_nets_forward_only(model, include_tags=None): |
| train_init_net, train_net = _generate_training_net_only(model, include_tags) |
| return train_init_net, train_net |
| |
| |
| def generate_training_nets(model, include_tags=None): |
| train_init_net, train_net = _generate_training_net_only(model, include_tags) |
| |
| model.apply_regularizers_on_loss(train_net, train_init_net) |
| if not model.has_loss(): |
| return train_init_net, train_net |
| loss = model.loss |
| grad_map = train_net.AddGradientOperators(loss.field_blobs()) |
| model.apply_post_grad_net_modifiers(train_net, train_init_net, grad_map, |
| modify_output_record=True) |
| model.apply_optimizers(train_net, train_init_net, grad_map) |
| model.apply_regularizers_after_optimizer(train_net, train_init_net, grad_map) |
| model.apply_final_net_modifiers(train_net, train_init_net, grad_map, |
| modify_output_record=True) |
| |
| return train_init_net, train_net |