    def __init__(self, model_structure=None, **kwargs):
        """Create an instance of `HParams` from keyword arguments.

        The keyword arguments specify name-values pairs for the hyperparameters.
        The parameter types are inferred from the type of the values passed.

        The parameter names are added as attributes of `HParams` object, so they
        can be accessed directly with the dot notation `hparams._name_`.

        Example:

        ```python
        # Define 3 hyperparameters: 'learning_rate' is a float parameter,
        # 'num_hidden_units' an integer parameter, and 'activation' a string
        # parameter.
        hparams = tf.HParams(
            learning_rate=0.1, num_hidden_units=100, activation='relu')

        hparams.activation ==> 'relu'
        ```

        Note that a few names are reserved and cannot be used as hyperparameter
        names.  If you use one of the reserved name the constructor raises a
        `ValueError`.

        Args:
          model_structure: An instance of ModelStructure, defining the feature
            crosses to be used in the Trial.
          **kwargs: Key-value pairs where the key is the hyperparameter name and
            the value is the value for the parameter.

        Raises:
          ValueError: If both `hparam_def` and initialization values are provided,
            or if one of the arguments is invalid.

        """
        # Register the hyperparameters and their type in _hparam_types.
        # This simplifies the implementation of parse().
        # _hparam_types maps the parameter name to a tuple (type, bool).
        # The type value is the type of the parameter for scalar hyperparameters,
        # or the type of the list elements for multidimensional hyperparameters.
        # The bool value is True if the value is a list, False otherwise.
        self._hparam_types = {}
        self._model_structure = model_structure
        for name, value in six.iteritems(kwargs):
            self.add_hparam(name, value)
Create an instance of `HParams` from keyword arguments.

The keyword arguments specify name-values pairs for the hyperparameters.
The parameter types are inferred from the type of the values passed.

The parameter names are added as attributes of `HParams` object, so they
can be accessed directly with the dot notation `hparams._name_`.

Example:

```python
# Define 3 hyperparameters: 'learning_rate' is a float parameter,
# 'num_hidden_units' an integer parameter, and 'activation' a string
# parameter.
hparams = tf.HParams(
learning_rate=0.1, num_hidden_units=100, activation='relu')

hparams.activation ==> 'relu'
```

Note that a few names are reserved and cannot be used as hyperparameter
names.  If you use one of the reserved name the constructor raises a
`ValueError`.

Args:
model_structure: An instance of ModelStructure, defining the feature
crosses to be used in the Trial.
**kwargs: Key-value pairs where the key is the hyperparameter name and
the value is the value for the parameter.

Raises:
ValueError: If both `hparam_def` and initialization values are provided,
or if one of the arguments is invalid.
utils/hparam.py