示例#1
0
    def __str__(self):
        ui = FancyStringifier()

        output = super(OneHotEncoder, self).__str__()

        output += ui.line(field='Data') + '\n'
        output += ui.data(indent=4, field='data', value=self.data) + '\n'

        output += ui.line(indent=4, field='Dimensions') + '\n'
        output += ui.data(indent=6, field='time_axis',
                          value=self.time_axis) + '\n'
        output += ui.data(indent=6, field='data_axis',
                          value=self.data_axis) + '\n'

        output += ui.line(indent=4, field='Timing information') + '\n'
        output += ui.data(indent=6,
                          field='time_resolution',
                          value=self.time_resolution,
                          unit="sec") + '\n'

        output += ui.line(field='Duration') + '\n'
        output += ui.data(indent=6, field='Frames', value=self.length) + '\n'
        if self.time_resolution:
            output += ui.data(indent=6,
                              field='Seconds',
                              value=self._frame_to_time(frame_id=self.length),
                              unit='sec') + '\n'

        output += ui.line(indent=4, field='Labels') + '\n'
        output += ui.data(indent=6, field='label_list',
                          value=self.label_list) + '\n'

        return output
示例#2
0
    def __str__(self):
        """File information

        Returns
        -------
        str

        """
        ui = FancyStringifier()

        output = ''
        output += ui.title(text=self.__class__.__name__) + '\n'
        output += ui.data(field='Content type', value=self.content_type) + '\n'

        output += ui.line(field='Local') + '\n'
        output += ui.data(indent=4, field='filename', value=self.filename) + '\n'
        output += ui.data(indent=4, field='local_md5', value=self.local_md5) + '\n'
        output += ui.data(indent=4, field='Exists', value='Yes' if self.local_exists() else 'No') + '\n'
        output += ui.data(indent=4, field='Size', value=self.local_size_string()) + '\n'

        if self._remote_file is not None:
            output += ui.line(field='Remote') + '\n'
            output += ui.data(indent=4, field='remote_file', value=self.remote_file) + '\n'
            output += ui.data(indent=4, field='remote_md5', value=self.remote_md5) + '\n'
            output += ui.data(indent=4, field='Exists', value='Yes' if self.remote_exists() else 'No') + '\n'
            output += ui.data(indent=4, field='Size', value=self.remote_size_string()) + '\n'

        return output
示例#3
0
    def to_string(self, ui=None, indent=0):
        """Get container information in a string

        Parameters
        ----------
        ui : FancyStringifier or FancyHTMLStringifier
            Stringifier class
            Default value FancyStringifier

        indent : int
            Amount of indention used
            Default value 0

        Returns
        -------
        str

        """

        if ui is None:
            ui = FancyStringifier()

        output = ''
        output += ui.class_name(self.__class__.__name__, indent=indent) + '\n'
        output += ui.data(field='Content type',
                          value=self.content_type,
                          indent=indent) + '\n'

        output += ui.line(field='Local', indent=indent) + '\n'
        output += ui.data(
            indent=indent + 2, field='filename', value=self.filename) + '\n'
        output += ui.data(
            indent=indent + 2, field='local_md5', value=self.local_md5) + '\n'
        output += ui.data(indent=indent + 2,
                          field='Exists',
                          value='Yes' if self.local_exists() else 'No') + '\n'
        output += ui.data(indent=indent + 2,
                          field='Size',
                          value=self.local_size_string()) + '\n'

        if self._remote_file is not None:
            output += ui.line(field='Remote', indent=indent) + '\n'
            output += ui.data(indent=indent + 2,
                              field='remote_file',
                              value=self.remote_file) + '\n'
            output += ui.data(indent=indent + 2,
                              field='remote_md5',
                              value=self.remote_md5) + '\n'
            output += ui.data(
                indent=indent + 2,
                field='Exists',
                value='Yes' if self.remote_exists() else 'No') + '\n'
            output += ui.data(indent=indent + 2,
                              field='Size',
                              value=self.remote_size_string()) + '\n'

        return output
示例#4
0
    def to_string(self, ui=None, indent=0):
        """Get container information in a string

        Parameters
        ----------
        ui : FancyStringifier or FancyHTMLStringifier
            Stringifier class
            Default value FancyStringifier

        indent : int
            Amount of indention used
            Default value 0

        Returns
        -------
        str

        """

        if ui is None:
            ui = FancyStringifier()

        output = ''
        output += ui.class_name(self.__class__.__name__, indent=indent) + '\n'

        if hasattr(self, 'filename') and self.filename:
            output += ui.data(
                field='filename', value=self.filename, indent=indent) + '\n'

        if self._file_info is None:
            self.get_info()

        output += ui.line('Size', indent=indent) + '\n'

        output += ui.data(field='Uncompressed',
                          value=get_byte_string(self._size_uncompressed),
                          indent=indent + 2) + '\n'

        if self.format == FileFormat.ZIP:
            output += ui.data(field='Compressed',
                              value=get_byte_string(self._size_compressed),
                              indent=indent + 2) + '\n'

            output += ui.data(field='Ratio',
                              value=self._size_compressed /
                              float(self._size_uncompressed) * 100,
                              unit='%',
                              indent=indent + 2) + '\n'

        output += ui.line('Files', indent=indent) + '\n'
        output += ui.data(field='Count',
                          value=len(self._file_info),
                          indent=indent + 2) + '\n'

        return output
示例#5
0
    def to_string(self, ui=None, indent=0):
        """Get container information in a string

        Parameters
        ----------
        ui : FancyStringifier or FancyHTMLStringifier
            Stringifier class
            Default value FancyStringifier

        indent : int
            Amount of indent
            Default value 0

        Returns
        -------
        str

        """

        if ui is None:
            ui = FancyStringifier()

        output = ''
        output += ui.class_name(self.__class__.__name__, indent=indent) + '\n'

        if hasattr(self, 'filename') and self.filename:
            output += ui.data(field='filename', value=self.filename) + '\n'

        for item_id, item in enumerate(self):
            output += ui.line(field='[' + str(item_id) + ']', indent=indent) + '\n'
            output += DictContainer(item).to_string(ui=ui, indent=indent + 1) + '\n'

        return output
示例#6
0
    def to_string(self, ui=None, indent=0):
        """Get information in a string

        Parameters
        ----------
        ui : FancyStringifier or FancyHTMLStringifier
            Stringifier class
            Default value FancyStringifier

        indent : int
            Amount of indent
            Default value 0

        Returns
        -------
        str

        """

        if ui is None:
            ui = FancyStringifier()

        output = ''
        output += ui.class_name(self.__class__.__name__, indent=indent) + '\n'
        output += ui.data(field='Best model weights at epoch', value=self.best_model_epoch, indent=indent) + '\n'
        output += ui.data(field='Metric type', value=self.monitor, indent=indent+2) + '\n'
        output += ui.data(field='Metric value', value=self.best, indent=indent+2) + '\n'
        output += ui.line()

        return output
示例#7
0
    def to_string(self, ui=None, indent=0):
        """Get container information in a string

        Parameters
        ----------
        ui : FancyStringifier or FancyHTMLStringifier
            Stringifier class
            Default value FancyStringifier

        indent : int
            Amount of indention used
            Default value 0

        Returns
        -------
        str

        """

        if ui is None:
            ui = FancyStringifier()

        output = super(Sequencer, self).to_string(ui=ui, indent=indent)

        output += ui.data(field='frames', value=self.sequence_length, indent=indent) + '\n'
        output += ui.data(field='hop_length_frames', value=self.hop_length, indent=indent) + '\n'
        output += ui.data(field='padding', value=self.padding, indent=indent) + '\n'
        output += ui.data(field='required_data_amount_per_segment', value=self.required_data_amount_per_segment, indent=indent) + '\n'
        output += ui.line(field='Shifting', indent=indent) + '\n'
        output += ui.data(indent=indent + 2, field='shift', value=self.shift) + '\n'
        output += ui.data(indent=indent + 2, field='shift_border', value=self.shift_border) + '\n'

        return output
示例#8
0
    def __str__(self):
        ui = FancyStringifier()
        output = ''
        output += FancyStringifier().class_name(self.__class__.__name__) + '\n'

        if hasattr(self, 'filename') and self.filename:
            output += FancyStringifier().data(field='filename',
                                              value=self.filename) + '\n'

        output += ui.data(field='fs', value=self.fs) + '\n'
        output += ui.line(field='Frame blocking') + '\n'
        output += ui.data(indent=4,
                          field='hop_length_samples',
                          value=self.hop_length_samples) + '\n'
        output += ui.data(indent=4,
                          field='hop_length_seconds',
                          value=self.hop_length_seconds,
                          unit='sec') + '\n'

        output += ui.data(indent=4,
                          field='win_length_samples',
                          value=self.win_length_samples) + '\n'
        output += ui.data(indent=4,
                          field='win_length_seconds',
                          value=self.win_length_seconds,
                          unit='sec') + '\n'

        return output
示例#9
0
    def __str__(self):
        ui = FancyStringifier()
        output = super(ZeroCrossingRateExtractor, self).__str__()

        output += ui.line(field='ZCR') + '\n'
        output += ui.data(indent=4, field='center', value=self.center) + '\n'

        return output
示例#10
0
    def __str__(self):
        ui = FancyStringifier()
        output = super(SpectralCentroidExtractor, self).__str__()

        output += ui.line(field='SpectralCentroid') + '\n'
        output += ui.data(indent=4, field='center', value=self.center) + '\n'

        return output
示例#11
0
    def __str__(self):
        ui = FancyStringifier()
        output = super(MfccDeltaExtractor, self).__str__()

        output += ui.line(field='Delta') + '\n'
        output += ui.data(indent=4, field='width', value=self.width) + '\n'

        return output
示例#12
0
    def __str__(self):
        ui = FancyStringifier()
        output = super(RMSEnergyExtractor, self).__str__()

        output += ui.line(field='RMSEnergy') + '\n'
        output += ui.data(indent=4, field='center', value=self.center) + '\n'

        return output
示例#13
0
    def __str__(self):
        ui = FancyStringifier()
        output = ui.class_name(self.__class__.__name__) + '\n'
        output += ui.line(field='Meta') + '\n'
        if self.filename:
            output += ui.data(indent=4, field='filename',
                              value=self.filename) + '\n'

        if self.label:
            output += ui.data(indent=4, field='label', value=self.label) + '\n'

        if self.probability is not None:
            output += ui.data(
                indent=4, field='probability', value=self.probability) + '\n'

        output += ui.line(field='Item') + '\n'
        output += ui.data(indent=4, field='id', value=self.id) + '\n'
        return output
示例#14
0
    def to_string(self, ui=None, indent=0):
        """Get container information in a string

        Parameters
        ----------
        ui : FancyStringifier or FancyHTMLStringifier
            Stringifier class
            Default value FancyStringifier

        indent : int
            Amount of indention used
            Default value 0

        Returns
        -------
        str

        """

        if ui is None:
            ui = FancyStringifier()

        output = super(EventRollEncoder, self).to_string(ui=ui, indent=indent)

        output += ui.line(field='Data', indent=indent) + '\n'
        output += ui.data(indent=indent + 2, field='data', value=self.data) + '\n'

        output += ui.line(indent=indent + 2, field='Dimensions') + '\n'
        output += ui.data(indent=indent + 4, field='time_axis', value=self.time_axis) + '\n'
        output += ui.data(indent=indent + 4, field='data_axis', value=self.data_axis) + '\n'

        output += ui.line(indent=indent + 2, field='Timing information') + '\n'
        output += ui.data(indent=indent + 4, field='time_resolution', value=self.time_resolution, unit="sec") + '\n'

        output += ui.line(field='Duration', indent=indent) + '\n'
        output += ui.data(indent=indent + 4, field='Frames', value=self.length) + '\n'
        if self.time_resolution:
            output += ui.data(indent=indent + 4, field='Seconds', value=self._frame_to_time(frame_id=self.length), unit='sec') + '\n'

        output += ui.line(indent=indent + 2, field='Labels') + '\n'
        output += ui.data(indent=indent + 4, field='Label list', value=self.label_list) + '\n'
        output += ui.data(indent=indent + 4, field='label_field', value=self.label) + '\n'

        return output
示例#15
0
    def to_string(self, ui=None, indent=0):
        """Get container information in a string

        Parameters
        ----------
        ui : FancyStringifier or FancyHTMLStringifier
            Stringifier class
            Default value FancyStringifier

        indent : int
            Amount of indent
            Default value 0

        Returns
        -------
        str

        """

        if ui is None:
            ui = FancyStringifier()

        output = ''
        output += ui.class_name(self.__class__.__name__, indent=indent) + '\n'
        output += ui.line(field='Meta', indent=indent) + '\n'
        if self.filename:
            output += ui.data(indent=indent + 2,
                              field='filename',
                              value=self.filename) + '\n'

        if self.label:
            output += ui.data(
                indent=indent + 2, field='label', value=self.label) + '\n'

        if self.probability is not None:
            output += ui.data(indent=indent + 2,
                              field='probability',
                              value=self.probability) + '\n'

        output += ui.line(field='Item', indent=indent) + '\n'
        output += ui.data(indent=indent + 2, field='id', value=self.id) + '\n'
        return output
示例#16
0
    def __str__(self):
        ui = FancyStringifier()

        output = super(DataBuffer, self).__str__()

        output += ui.data(field='size', value=self.size) + '\n'
        output += ui.data(field='index', value=self.index) + '\n'
        output += ui.line(field='Buffer') + '\n'
        output += ui.data(indent=4, field='data_buffer', value=self.data_buffer) + '\n'
        output += ui.data(indent=4, field='meta_buffer', value=self.meta_buffer) + '\n'

        return output
示例#17
0
    def __str__(self):
        ui = FancyStringifier()
        output = super(SpectralFeatureExtractor, self).__str__()

        output += ui.line(field='Spectrogram') + '\n'
        output += ui.data(indent=4,
                          field='spectrogram_type',
                          value=self.spectrogram_type) + '\n'
        output += ui.data(indent=4, field='n_fft', value=self.n_fft) + '\n'
        output += ui.data(
            indent=4, field='window_type', value=self.window_type) + '\n'

        return output
示例#18
0
    def __str__(self):
        ui = FancyStringifier()

        output = ''
        output += FancyStringifier().class_name(self.__class__.__name__) + '\n'

        if hasattr(self, 'filename') and self.filename:
            output += FancyStringifier().data(field='filename',
                                              value=self.filename) + '\n'

        if self._file_info is None:
            self.get_info()

        output += ui.line('Size', indent=2) + '\n'

        output += FancyStringifier().data(field='Uncompressed',
                                          value=get_byte_string(
                                              self._size_uncompressed),
                                          indent=4) + '\n'

        if self.format == FileFormat.ZIP:
            output += FancyStringifier().data(field='Compressed',
                                              value=get_byte_string(
                                                  self._size_compressed),
                                              indent=4) + '\n'

            output += FancyStringifier().data(
                field='Ratio',
                value=self._size_compressed / float(self._size_uncompressed) *
                100,
                unit='%',
                indent=4) + '\n'

        output += ui.line('Files', indent=2) + '\n'
        output += FancyStringifier().data(
            field='Count', value=len(self._file_info), indent=4) + '\n'

        return output
示例#19
0
    def __str__(self):
        ui = FancyStringifier()

        output = ''
        output += FancyStringifier().class_name(self.__class__.__name__) + '\n'

        if hasattr(self, 'filename') and self.filename:
            output += FancyStringifier().data(field='filename',
                                              value=self.filename) + '\n'

        for item_id, item in enumerate(self):
            output += ui.line('[' + str(item_id) + ']', indent=0) + '\n'
            output += ui.line(str(DictContainer(item)), indent=3) + '\n'

        return output
示例#20
0
    def __str__(self):
        ui = FancyStringifier()
        output = super(MfccStaticExtractor, self).__str__()

        output += ui.line(field='MFCC') + '\n'
        output += ui.data(indent=4, field='n_mels', value=self.n_mels) + '\n'
        output += ui.data(indent=4, field='fmin', value=self.fmin) + '\n'
        output += ui.data(indent=4, field='fmax', value=self.fmax) + '\n'
        output += ui.data(indent=4,
                          field='normalize_mel_bands',
                          value=self.normalize_mel_bands) + '\n'
        output += ui.data(indent=4, field='htk', value=self.htk) + '\n'
        output += ui.data(indent=4, field='n_mfcc', value=self.n_mfcc) + '\n'

        return output
示例#21
0
        def __str__(self):
            ui = FancyStringifier()
            output = ''
            output += ui.class_name(self.__class__.__name__) + '\n'

            output += ui.data(
                indent=2, field='Batch size', value=self.batch_size) + '\n'

            output += ui.data(
                indent=2, field='Epoch size', value=len(self),
                unit='batches') + '\n'

            shape = self.data_shape
            axis = self.data_axis

            output += ui.data(field='Data item shape', value=shape) + '\n'

            output += ui.data(
                indent=4, field='Time', value=shape[axis['time_axis']]) + '\n'

            output += ui.data(
                indent=4, field='Data', value=shape[axis['data_axis']]) + '\n'

            if 'sequence_axis' in axis:
                output += ui.data(indent=4,
                                  field='Sequence',
                                  value=shape[axis['sequence_axis']]) + '\n'

            output += ui.data(indent=4, field='Axis', value=axis) + '\n'

            if self.buffer_size is not None:
                output += ui.line(field='Buffer') + '\n'
                output += ui.data(indent=4,
                                  field='buffer_size',
                                  value=self.buffer_size,
                                  unit='items') + '\n'
                output += ui.data(indent=4,
                                  field='buffer usage',
                                  value=self.data_buffer.count,
                                  unit='items') + '\n'
                output += ui.data(
                    indent=4,
                    field='buffer usage',
                    value=(self.data_buffer.count / float(self.buffer_size)) *
                    100,
                    unit='%') + '\n'

            return output
示例#22
0
    def __str__(self):
        ui = FancyStringifier()

        output = super(Sequencer, self).__str__()
        output += ui.data(field='frames', value=self.frames) + '\n'
        output += ui.data(field='hop_length_frames',
                          value=self.hop_length_frames) + '\n'
        output += ui.data(field='padding', value=self.padding) + '\n'
        output += ui.data(field='required_data_amount_per_segment',
                          value=self.required_data_amount_per_segment) + '\n'
        output += ui.line(field='Shifting') + '\n'
        output += ui.data(indent=4, field='shift', value=self.shift) + '\n'
        output += ui.data(
            indent=4, field='shift_border', value=self.shift_border) + '\n'

        return output
示例#23
0
    def to_string(self, ui=None, indent=0):
        """Get container information in a string

        Parameters
        ----------
        ui : FancyStringifier or FancyHTMLStringifier
            Stringifier class
            Default value FancyStringifier

        indent : int
            Amount of indention used
            Default value 0

        Returns
        -------
        str

        """

        if ui is None:
            ui = FancyStringifier()

        output = super(RepositoryNormalizer, self).to_string(ui=ui, indent=indent)

        output += ui.data(
            indent=indent + 2,
            field='Labels',
            value=list(self.normalizers.keys())
        ) + '\n'

        output += ui.line(field='Content') + '\n'
        for label, label_data in iteritems(self.normalizers):
            if label_data:
                output += ui.data(
                    indent=indent + 2,
                    field='['+str(label)+']',
                    value=label_data
                ) + '\n'

        output += '\n'
        return output
示例#24
0
    def to_string(self, ui=None, indent=0):
        """Get container information in a string

        Parameters
        ----------
        ui : FancyStringifier or FancyHTMLStringifier
            Stringifier class
            Default value FancyStringifier

        indent : int
            Amount of indention used
            Default value 0

        Returns
        -------
        str

        """

        if ui is None:
            ui = FancyStringifier()

        output = super(DataBuffer, self).to_string(ui=ui, indent=indent)

        output += ui.data(field='size', value=self.size, indent=indent) + '\n'
        output += ui.data(field='index', value=self.index,
                          indent=indent) + '\n'
        output += ui.line(field='Buffer', indent=indent) + '\n'
        output += ui.data(indent=indent + 2,
                          field='data_buffer',
                          value=self.data_buffer) + '\n'
        output += ui.data(indent=indent + 2,
                          field='meta_buffer',
                          value=self.meta_buffer) + '\n'

        return output
示例#25
0
        def to_string(self, ui=None, indent=0):
            """Get container information in a string

            Parameters
            ----------
            ui : FancyStringifier or FancyHTMLStringifier
                Stringifier class
                Default value FancyStringifier

            indent : int
                Amount of indention used
                Default value 0

            Returns
            -------
            str

            """

            if ui is None:
                ui = FancyStringifier()

            output = ''
            output += ui.class_name(self.__class__.__name__,
                                    indent=indent) + '\n'

            output += ui.data(indent=indent,
                              field='Batch size',
                              value=self.batch_size) + '\n'

            output += ui.data(indent=indent,
                              field='Epoch size',
                              value=len(self),
                              unit='batches') + '\n'

            shape = self.data_shape
            axis = self.data_axis

            output += ui.data(
                field='Data item shape', value=shape, indent=indent) + '\n'

            output += ui.data(indent=indent + 2,
                              field='Time',
                              value=shape[axis['time_axis']]) + '\n'

            output += ui.data(indent=indent + 2,
                              field='Data',
                              value=shape[axis['data_axis']]) + '\n'

            if 'sequence_axis' in axis:
                output += ui.data(indent=indent + 2,
                                  field='Sequence',
                                  value=shape[axis['sequence_axis']]) + '\n'

            output += ui.data(indent=indent + 2, field='Axis',
                              value=axis) + '\n'

            if self.buffer_size is not None:
                output += ui.line(field='Buffer', indent=indent) + '\n'
                output += ui.data(indent=indent + 2,
                                  field='buffer_size',
                                  value=self.buffer_size,
                                  unit='items') + '\n'
                output += ui.data(indent=indent + 2,
                                  field='buffer usage',
                                  value=self.data_buffer.count,
                                  unit='items') + '\n'
                output += ui.data(
                    indent=indent + 2,
                    field='buffer usage',
                    value=(self.data_buffer.count / float(self.buffer_size)) *
                    100,
                    unit='%') + '\n'

            return output
示例#26
0
class ProgressLoggerCallback(BaseCallback):
    """Keras callback to show metrics in logging interface. Implements Keras Callback API.

    This callback is very similar to standard ``ProgbarLogger`` Keras callback, however it adds support for logging
    interface, and external metrics (metrics calculated outside Keras training process).

    """
    def __init__(self,
                 manual_update=False,
                 epochs=None,
                 external_metric_labels=None,
                 metric=None,
                 loss=None,
                 manual_update_interval=1,
                 output_type='logging',
                 **kwargs):
        """Constructor

        Parameters
        ----------
        epochs : int
            Total amount of epochs
            Default value None

        metric : str
            Metric name
            Default value None

        manual_update : bool
            Manually update callback, use this to when injecting external metrics
            Default value False

        manual_update_interval : int
            Epoch interval for manual update, used anticipate updates
            Default value 1

        output_type : str
            Output type, either 'logging' or 'console'
            Default value 'logging'

        external_metric_labels : dict or OrderedDict
            Dictionary with {'metric_label': 'metric_name'}
            Default value None

        """

        kwargs.update({
            'manual_update': manual_update,
            'epochs': epochs,
            'external_metric_labels': external_metric_labels,
        })

        super(ProgressLoggerCallback, self).__init__(**kwargs)

        if isinstance(metric, str):
            self.metric = metric

        elif callable(metric):
            self.metric = metric.__name__

        self.loss = loss

        self.manual_update_interval = manual_update_interval

        self.output_type = output_type

        self.timer = Timer()
        self.ui = FancyStringifier()

        if self.output_type == 'logging':
            self.output_target = FancyLogger()

        elif self.output_type == 'console':
            self.output_target = FancyPrinter()

        self.seen = 0
        self.log_values = []

        self.most_recent_values = collections.OrderedDict()
        self.most_recent_values['l_tra'] = None
        self.most_recent_values['l_val'] = None
        self.most_recent_values['m_tra'] = None
        self.most_recent_values['m_val'] = None

        self.data = {
            'l_tra': numpy.empty((self.epochs, )),
            'l_val': numpy.empty((self.epochs, )),
            'm_tra': numpy.empty((self.epochs, )),
            'm_val': numpy.empty((self.epochs, )),
        }
        self.data['l_tra'][:] = numpy.nan
        self.data['l_val'][:] = numpy.nan
        self.data['m_tra'][:] = numpy.nan
        self.data['m_val'][:] = numpy.nan

        for metric_label in self.external_metric_labels:
            self.data[metric_label] = numpy.empty((self.epochs, ))
            self.data[metric_label][:] = numpy.nan

        self.header_shown = False
        self.last_update_epoch = 0

        self.target = None

    def on_train_begin(self, logs=None):
        if self.epochs is None:
            self.epochs = self.params['epochs']

        if not self.header_shown:
            output = ''
            output += self.ui.line('Training') + '\n'

            if self.external_metric_labels:
                output += self.ui.row(
                    '',
                    'Loss',
                    'Metric',
                    'Ext. metrics',
                    '',
                    widths=[
                        10, 26, 26,
                        len(self.external_metric_labels) * 15, 17
                    ]) + '\n'

                header2 = ['', self.loss, self.metric]
                header3 = ['Epoch', 'Train', 'Val', 'Train', 'Val']
                widths = [10, 13, 13, 13, 13]
                sep = ['-', '-', '-', '-', '-']
                for metric_label, metric_name in iteritems(
                        self.external_metric_labels):
                    header2.append('')
                    header3.append(metric_name)
                    widths.append(15)
                    sep.append('-')

                header2.append('')
                header3.append('time')
                widths.append(17)
                sep.append('-')

                output += self.ui.row(*header2) + '\n'
                output += self.ui.row(*header3, widths=widths) + '\n'
                output += self.ui.row(*sep)

            else:
                output += self.ui.row(
                    '', 'Loss', 'Metric', '', widths=[10, 26, 26, 17]) + '\n'
                output += self.ui.row('', self.loss, self.metric, '') + '\n'
                output += self.ui.row('Epoch',
                                      'Train',
                                      'Val',
                                      'Train',
                                      'Val',
                                      'Time',
                                      widths=[10, 13, 13, 13, 13, 17]) + '\n'
                output += self.ui.row('-', '-', '-', '-', '-', '-')

            self.output_target.line(output)

            # Show header only once
            self.header_shown = True

    def on_epoch_begin(self, epoch, logs=None):
        self.epoch = epoch + 1

        if 'steps' in self.params:
            self.target = self.params['steps']

        elif 'samples' in self.params:
            self.target = self.params['samples']

        self.seen = 0
        self.timer.start()

    def on_batch_begin(self, batch, logs=None):
        if self.target and self.seen < self.target:
            self.log_values = []

    def on_batch_end(self, batch, logs=None):
        logs = logs or {}
        batch_size = logs.get('size', 0)
        self.seen += batch_size

        for k in self.params['metrics']:
            if k in logs:
                self.log_values.append((k, logs[k]))

    def on_epoch_end(self, epoch, logs=None):
        self.timer.stop()
        self.epoch = epoch

        logs = logs or {}

        # Reset values
        self.most_recent_values['l_tra'] = None
        self.most_recent_values['l_val'] = None
        self.most_recent_values['m_tra'] = None
        self.most_recent_values['m_val'] = None

        # Collect values
        for k in self.params['metrics']:
            if k in logs:
                self.log_values.append((k, logs[k]))
                if k == 'loss':
                    self.data['l_tra'][self.epoch] = logs[k]
                    self.most_recent_values['l_tra'] = '{:4.3f}'.format(
                        logs[k])

                elif k == 'val_loss':
                    self.data['l_val'][self.epoch] = logs[k]
                    self.most_recent_values['l_val'] = '{:4.3f}'.format(
                        logs[k])

                elif self.metric and k.endswith(self.metric):
                    if k.startswith('val_'):
                        self.data['m_val'][self.epoch] = logs[k]
                        self.most_recent_values['m_val'] = '{:4.3f}'.format(
                            logs[k])

                    else:
                        self.data['m_tra'][self.epoch] = logs[k]
                        self.most_recent_values['m_tra'] = '{:4.3f}'.format(
                            logs[k])

        for metric_label in self.external_metric_labels:
            if metric_label in self.external_metric:
                metric_name = self.external_metric_labels[metric_label]
                value = self.external_metric[metric_label]
                if metric_name.endswith('f_measure') or metric_name.endswith(
                        'f_score'):
                    self.most_recent_values[metric_label] = '{:3.1f}'.format(
                        value * 100)
                else:
                    self.most_recent_values[metric_label] = '{:4.3f}'.format(
                        value)

        if (not self.manual_update
                or (self.epoch - self.last_update_epoch > 0 and
                    (self.epoch + 1) % self.manual_update_interval)):

            # Update logged progress
            self.update_progress_log()

    def update(self):
        """Update

        """
        self.update_progress_log()
        self.last_update_epoch = self.epoch

    def update_progress_log(self):
        """Update progress to logging interface

        """

        if self.epoch - self.last_update_epoch:
            data = [
                self.epoch, self.data['l_tra'][self.epoch],
                self.data['l_val'][self.epoch]
                if 'l_val' in self.most_recent_values else '-',
                self.data['m_tra'][self.epoch], self.data['m_val'][self.epoch]
                if self.most_recent_values['m_val'] else '-'
            ]
            types = ['int', 'float4', 'float4', 'float4', 'float4']
            for metric_label in self.external_metric_labels:
                if metric_label in self.external_metric:
                    value = self.data[metric_label][self.epoch]

                    if numpy.isnan(value):
                        value = ' ' * 10
                    else:
                        if self.external_metric_labels[metric_label].endswith(
                                'f_measure') or self.external_metric_labels[
                                    metric_label].endswith('f_score'):
                            value = float(value) * 100
                            types.append('float2')

                        else:
                            value = float(value)
                            types.append('float4')

                    data.append(value)
                else:
                    data.append('')

            data.append(self.timer.get_string())
            types.append('str')

            output = self.ui.row(*data, types=types)

            self.output_target.line(output)

    def add_external_metric(self, metric_id):
        """Add external metric to be monitored

        Parameters
        ----------
        metric_id : str
            Metric name

        """

        if metric_id not in self.external_metric_labels:
            self.external_metric_labels[metric_id] = metric_id

        if metric_id not in self.data:
            self.data[metric_id] = numpy.empty((self.epochs, ))
            self.data[metric_id][:] = numpy.nan

    def set_external_metric_value(self, metric_label, metric_value):
        """Add external metric value

        Parameters
        ----------
        metric_label : str
            Metric label

        metric_value : numeric
            Metric value

        """

        self.external_metric[metric_label] = metric_value
        self.data[metric_label][self.epoch] = metric_value
示例#27
0
def model_summary_string(keras_model, mode='keras'):
    """Model summary in a formatted string, similar to Keras model summary function.

    Parameters
    ----------
    keras_model : keras model
        Keras model

    mode : str
        Summary mode ['extended', 'keras']. In case 'keras', standard Keras summary is returned.
        Default value keras

    Returns
    -------
    str
        Model summary

    """

    ui = FancyStringifier()
    output = ''
    output += ui.line('Model summary') + '\n'

    if mode == 'extended':
        layer_name_map = {
            'BatchNormalization': 'BatchNorm',
        }
        import keras
        from distutils.version import LooseVersion
        import keras.backend as keras_backend

        output += ui.row('Layer type',
                         'Output',
                         'Param',
                         'Name',
                         'Connected to',
                         'Activ.',
                         'Init',
                         widths=[15, 25, 10, 20, 25, 10, 10],
                         indent=4) + '\n'
        output += ui.row('-', '-', '-', '-', '-', '-', '-') + '\n'

        for layer in keras_model.layers:
            connections = []
            if LooseVersion(keras.__version__) >= LooseVersion('2.1.3'):
                for node_index, node in enumerate(layer._inbound_nodes):
                    for i in range(len(node.inbound_layers)):
                        inbound_layer = node.inbound_layers[i].name
                        inbound_node_index = node.node_indices[i]
                        inbound_tensor_index = node.tensor_indices[i]
                        connections.append(inbound_layer + '[' +
                                           str(inbound_node_index) + '][' +
                                           str(inbound_tensor_index) + ']')

            else:
                for node_index, node in enumerate(layer.inbound_nodes):
                    for i in range(len(node.inbound_layers)):
                        inbound_layer = node.inbound_layers[i].name
                        inbound_node_index = node.node_indices[i]
                        inbound_tensor_index = node.tensor_indices[i]
                        connections.append(inbound_layer + '[' +
                                           str(inbound_node_index) + '][' +
                                           str(inbound_tensor_index) + ']')

            config = DictContainer(layer.get_config())
            layer_name = layer.__class__.__name__
            if layer_name in layer_name_map:
                layer_name = layer_name_map[layer_name]

            if config.get_path(
                    'kernel_initializer.class_name') == 'VarianceScaling':
                init = str(
                    config.get_path('kernel_initializer.config.distribution',
                                    '---'))

            elif config.get_path(
                    'kernel_initializer.class_name') == 'RandomUniform':
                init = 'uniform'

            else:
                init = '---'

            output += ui.row(
                layer_name, str(layer.output_shape), str(layer.count_params()),
                str(layer.name),
                str(connections[0]) if len(connections) > 0 else '---',
                str(config.get('activation', '---')), init) + '\n'

        trainable_count = int(
            numpy.sum([
                keras_backend.count_params(p)
                for p in set(keras_model.trainable_weights)
            ]))

        non_trainable_count = int(
            numpy.sum([
                keras_backend.count_params(p)
                for p in set(keras_model.non_trainable_weights)
            ]))

        output += ui.line('') + '\n'
        output += ui.line(
            'Parameters',
            indent=4,
        ) + '\n'
        output += ui.data(indent=6,
                          field='Total',
                          value=trainable_count + non_trainable_count) + '\n'
        output += ui.data(indent=6, field='Trainable',
                          value=trainable_count) + '\n'
        output += ui.data(
            indent=6, field='Non-Trainable', value=non_trainable_count) + '\n'

    else:
        output_buffer = []
        keras_model.summary(print_fn=output_buffer.append)
        for line in output_buffer:
            output += ui.line(line, indent=4) + '\n'

    output += ui.line('') + '\n'

    output += ui.data(
        indent=4, field='Input shape', value=keras_model.input_shape) + '\n'
    output += ui.data(
        indent=4, field='Output shape', value=keras_model.output_shape) + '\n'

    return output