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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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