'Fit.
Train model, feeding X_inputs and Y_targets to the network.
NOTE: When not feeding dicts, data assignations is made by
input/estimator layers creation order (For example, the second
input layer created will be feeded by the second value of
X_inputs list).
Examples:
```python
model.fit(X, Y) # Single input and output
model.fit({\'input1\': X}, {\'output1\': Y}) # Single input and output
model.fit([X1, X2], Y) # Mutliple inputs, Single output
# validate with X_val and [Y1_val, Y2_val]
model.fit(X, [Y1, Y2], validation_set=(X_val, [Y1_val, Y2_val]))
# 10% of training data used for validation
model.fit(X, Y, validation_set=0.1)
Arguments:
X_inputs: array, `list` of array (if multiple inputs) or `dict`
(with inputs layer name as keys). Data to feed to train
model.
Y_targets: array, `list` of array (if multiple inputs) or `dict`
(with estimators layer name as keys). Targets (Labels) to
feed to train model. Usually set as the next element of a
sequence, i.e. for x[0] => y[0] = x[1].
n_epoch: `int`. Number of epoch to run. Default: None.
validation_set: `tuple`. Represents data used for validation.
`tuple` holds data and targets (provided as same type as
X_inputs and Y_targets). Additionally, it also accepts
`float` (<1) to performs a data split over training data.
show_metric: `bool`. Display or not accuracy at every step.
batch_size: `int` or None. If `int`, overrides all network
estimators \'batch_size\' by this value.
shuffle: `bool` or None. If `bool`, overrides all network
estimators \'shuffle\' by this value.
snapshot_epoch: `bool`. If True, it will snapshot model at the end
of every epoch. (Snapshot a model will evaluate this model
on validation set, as well as create a checkpoint if
\'checkpoint_path\' specified).
snapshot_step: `int` or None. If `int`, it will snapshot model
every \'snapshot_step\' steps.
excl_trainops: `list` of `TrainOp`. A list of train ops to
exclude from training process (TrainOps can be retrieve
through `tf.get_collection_ref(tf.GraphKeys.TRAIN_OPS)`).
run_id: `str`. Give a name for this run. (Useful for Tensorboard).'

def fit(self, X_inputs, Y_targets, n_epoch=10, validation_set=None, show_metric=False, batch_size=None, shuffle=None, snapshot_epoch=True, snapshot_step=None, excl_trainops=None, run_id=None):

    if batch_size:
        for train_op in self.train_ops:
            train_op.batch_size = batch_size
    (valX, valY) = (None, None)
    if validation_set:
        if isinstance(validation_set, float):
            valX = validation_set
            valY = validation_set
        else:
            valX = validation_set[0]
            valY = validation_set[1]
    feed_dict = feed_dict_builder(X_inputs, Y_targets, self.inputs, self.targets)
    feed_dicts = [feed_dict for i in self.train_ops]
    val_feed_dicts = None
    if (not (is_none(valX) or is_none(valY))):
        if isinstance(valX, float):
            val_feed_dicts = valX
        else:
            val_feed_dict = feed_dict_builder(valX, valY, self.inputs, self.targets)
            val_feed_dicts = [val_feed_dict for i in self.train_ops]
    (dprep_dict, daug_dict) = ({}, {})
    dprep_collection = tf.get_collection(tf.GraphKeys.DATA_PREP)
    daug_collection = tf.get_collection(tf.GraphKeys.DATA_AUG)
    for i in range(len(self.inputs)):
        if (dprep_collection[i] is not None):
            dprep_dict[self.inputs[i]] = dprep_collection[i]
        if (daug_collection[i] is not None):
            daug_dict[self.inputs[i]] = daug_collection[i]
    self.trainer.fit(feed_dicts, val_feed_dicts=val_feed_dicts, n_epoch=n_epoch, show_metric=show_metric, snapshot_step=snapshot_step, snapshot_epoch=snapshot_epoch, shuffle_all=shuffle, dprep_dict=dprep_dict, daug_dict=daug_dict, excl_trainops=excl_trainops, run_id=run_id)
    self.predictor = Evaluator([self.net], session=self.trainer.session)
