def make_load(self, data, original): if isinstance(original, Mapping): feature_processors = {} for key, val in six.iteritems(original): feature_processors[key] = GraphConfig.from_dict(val) return FeatureProcessorsConfig(feature_processors) raise ValidationError("Feature processor is not valid for, `{}`".format(original))
def get_pipeline_config(mode): return TFRecordImagePipelineConfig( dynamic_pad=False, data_files=train_data_file if Modes.is_train(mode) else eval_data_file, meta_data_file=meta_data_filename, feature_processors=FeatureProcessorsConfig({ 'image': GraphConfig(input_layers=[['image', 0, 0]], output_layers=[['image_out', 0, 0]], layers=[ CastConfig(dtype='float32', name='image_out', inbound_nodes=[['image', 0, 0]]) ]) }))
def test_graph_config(self): config_dict = { 'input_layers': ['image'], 'output_layers': [['dense_0', 0, 0]], 'layers': [ { 'Conv2D': { 'filters': 64, 'strides': [1, 1], 'kernel_size': [2, 2], 'activation': 'relu', 'name': 'convolution_1', } }, {'Dense': {'units': 17, 'name': 'dense_0'}} ] } config = GraphConfig.from_dict(config_dict) config_to_dict = config.to_dict() assert_equal_graphs(config_dict, config_to_dict)
def from_config(cls, mode, features, labels, config): # pylint: disable=arguments-differ """Instantiates a Graph container from its config (output of `get_config()`). Arguments: mode: features: labels: config: Model config dictionary. Returns: A model instance. Raises: ValueError: In case of improperly formatted config dict. """ # set the training mode set_learning_phase(Modes.is_train(mode)) if not isinstance(config, GraphConfig): config = GraphConfig.from_dict(config) # layer instances created during # the graph reconstruction process created_layers = {} # Create an input layer based on the defined inputs and features for layer in config.input_layers: layer_name, node_index, tensor_index = cls.get_node_data(layer) if layer_name in features: created_layers[layer_name] = InputLayer( input_tensor=features[layer_name], name=layer_name) elif isinstance(labels, Mapping) and layer_name in labels: created_layers[layer_name] = InputLayer( input_tensor=labels[layer_name], name=layer_name) else: raise ConfigurationError( "Input `{}`is not found".format(layer_name)) def process_layer(layer): """Deserialize a layer, then call it on appropriate inputs. Arguments: layer_data: layer config dict. Raises: ValueError: In case of improperly formatted `layer_data` dict. """ layer_class = layer.IDENTIFIER layer_name = layer.name # Instantiate layer. if layer_class in LAYERS: created_layer = LAYERS[layer_class].from_config(layer) elif layer_class in IMAGE_PROCESSORS: created_layer = IMAGE_PROCESSORS[layer_class].from_config( layer) else: raise ValueError( "The layer `{}` is not supported.".format(layer_class)) created_layers[layer_name] = created_layer # Gather layer inputs. inbound_nodes_data = layer.inbound_nodes input_tensors = [] for input_data in inbound_nodes_data: in_layer_name, in_node_index, in_tensor_index = cls.get_node_data( input_data) if len(input_data) == 3: kwargs = {} elif len(input_data) == 4: kwargs = input_data[3] else: raise ValueError('Improperly formatted model config.') if in_layer_name not in created_layers: raise ValueError('Missing layer: ' + in_layer_name) inbound_layer = created_layers[in_layer_name] inbound_node = inbound_layer.inbound_nodes[in_node_index] input_tensors.append( inbound_node.output_tensors[in_tensor_index]) # Call layer on its inputs, thus creating the node # and building the layer if needed. if input_tensors: if len(input_tensors) == 1: created_layer(input_tensors[0], **kwargs) else: created_layer(input_tensors, **kwargs) for layer in config.layers: process_layer(layer) name = config.name input_tensors = [] output_tensors = [] for layer_data in config.input_layers: layer_name, node_index, tensor_index = cls.get_node_data( layer_data) assert layer_name in created_layers, "Layer `{}` not found".format( layer_name) layer = created_layers[layer_name] layer_output_tensors = layer.inbound_nodes[ node_index].output_tensors input_tensors.append(layer_output_tensors[tensor_index]) for layer_data in config.output_layers: layer_name, node_index, tensor_index = cls.get_node_data( layer_data) assert layer_name in created_layers layer = created_layers[layer_name] layer_output_tensors = layer.inbound_nodes[ node_index].output_tensors output_tensors.append(layer_output_tensors[tensor_index]) return cls(inputs=input_tensors, outputs=output_tensors, name=name)