From 89c3d85a284c4564c58a8b813fdee61cffd7e083 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ghielmetti?= Date: Mon, 8 Mar 2021 10:49:34 +0100 Subject: [PATCH 001/102] Added QConv2DBatchnorm support. --- hls4ml/converters/keras/convolution.py | 5 +- hls4ml/converters/keras/core.py | 2 +- hls4ml/converters/keras/qkeras_layers.py | 24 +- hls4ml/model/hls_layers.py | 209 ++- hls4ml/templates/vivado_template.py | 83 +- hls4ml/utils/config.py | 2 +- notebooks/callbacks.py | 115 ++ notebooks/part1_getting_started.ipynb | 1165 +++++++++++++++++ notebooks/part2_advanced_config.ipynb | 973 ++++++++++++++ notebooks/part3_compression.ipynb | 1100 ++++++++++++++++ notebooks/part4_quantization.ipynb | 1082 +++++++++++++++ qconv2dbatchnorm_test/test_conv2dbatchnorm.py | 175 +++ 12 files changed, 4850 insertions(+), 85 deletions(-) create mode 100644 notebooks/callbacks.py create mode 100644 notebooks/part1_getting_started.ipynb create mode 100644 notebooks/part2_advanced_config.ipynb create mode 100644 notebooks/part3_compression.ipynb create mode 100644 notebooks/part4_quantization.ipynb create mode 100644 qconv2dbatchnorm_test/test_conv2dbatchnorm.py diff --git a/hls4ml/converters/keras/convolution.py b/hls4ml/converters/keras/convolution.py index 3d038489b8..78cf55907a 100644 --- a/hls4ml/converters/keras/convolution.py +++ b/hls4ml/converters/keras/convolution.py @@ -84,5 +84,8 @@ def parse_conv2d_layer(keras_layer, input_names, input_shapes, data_reader, conf output_shape = [input_shapes[0][0], layer['n_filt'], layer['out_height'], layer['out_width']] else: output_shape = [input_shapes[0][0], layer['out_height'], layer['out_width'], layer['n_filt']] - + if layer['class_name'] == 'QConv2DBatchnorm': + intermediate_shape = list() + intermediate_shape.append(output_shape) + output_shape = intermediate_shape return layer, output_shape diff --git a/hls4ml/converters/keras/core.py b/hls4ml/converters/keras/core.py index 68f0b59d09..9db324129f 100644 --- a/hls4ml/converters/keras/core.py +++ b/hls4ml/converters/keras/core.py @@ -103,7 +103,7 @@ def parse_activation_layer(keras_layer, input_names, input_shapes, data_reader, @keras_handler('BatchNormalization') def parse_batchnorm_layer(keras_layer, input_names, input_shapes, data_reader, config): - assert('BatchNormalization' in keras_layer['class_name']) + assert('batchnorm' in keras_layer['class_name'].lower()) layer = parse_default_keras_layer(keras_layer, input_names) diff --git a/hls4ml/converters/keras/qkeras_layers.py b/hls4ml/converters/keras/qkeras_layers.py index b024656ad2..1e220e89db 100644 --- a/hls4ml/converters/keras/qkeras_layers.py +++ b/hls4ml/converters/keras/qkeras_layers.py @@ -12,8 +12,8 @@ @keras_handler('QDense') def parse_qdense_layer(keras_layer, input_names, input_shapes, data_reader, config): - - + + layer, output_shape = parse_dense_layer(keras_layer, input_names, input_shapes, data_reader, config) layer['weight_quantizer'] = get_quantizer_from_config(keras_layer, 'kernel') @@ -28,10 +28,10 @@ def parse_qdense_layer(keras_layer, input_names, input_shapes, data_reader, conf @keras_handler('QConv1D', 'QConv2D') def parse_qconv_layer(keras_layer, input_names, input_shapes, data_reader, config): assert('QConv' in keras_layer['class_name']) - - if int(keras_layer['class_name'][-2]) == 1: + + if "1D" in keras_layer['class_name']: layer, output_shape = parse_conv1d_layer(keras_layer, input_names, input_shapes, data_reader, config) - elif int(keras_layer['class_name'][-2]) == 2: + elif "2D" in keras_layer['class_name']: layer, output_shape = parse_conv2d_layer(keras_layer, input_names, input_shapes, data_reader, config) layer['weight_quantizer'] = get_quantizer_from_config(keras_layer, 'kernel') @@ -39,7 +39,7 @@ def parse_qconv_layer(keras_layer, input_names, input_shapes, data_reader, confi layer['bias_quantizer'] = get_quantizer_from_config(keras_layer, 'bias') else: layer['bias_quantizer'] = None - + return layer, output_shape @@ -47,7 +47,7 @@ def parse_qconv_layer(keras_layer, input_names, input_shapes, data_reader, confi def parse_qactivation_layer(keras_layer, input_names, input_shapes, data_reader, config): assert(keras_layer['class_name'] == 'QActivation') supported_activations = ['quantized_relu', 'quantized_tanh', 'binary_tanh', 'ternary_tanh', 'quantized_bits', 'binary', 'ternary'] - + layer = parse_default_keras_layer(keras_layer, input_names) activation_config = keras_layer['config']['activation'] @@ -77,7 +77,7 @@ def parse_qactivation_layer(keras_layer, input_names, input_shapes, data_reader, activation_config['config']['integer'] = 2 else: activation_config['class_name'] = 'unknown' - + if activation_config['class_name'] not in supported_activations: raise Exception('Unsupported QKeras activation: {}'.format(activation_config['class_name'])) @@ -90,7 +90,7 @@ def parse_qactivation_layer(keras_layer, input_names, input_shapes, data_reader, @keras_handler('QBatchNormalization') def parse_qbatchnorm_layer(keras_layer, input_names, input_shapes, data_reader, config): - + layer, output_shape = parse_batchnorm_layer(keras_layer, input_names, input_shapes, data_reader, config) layer['mean_quantizer'] = get_quantizer_from_config(keras_layer, 'mean') @@ -100,3 +100,9 @@ def parse_qbatchnorm_layer(keras_layer, input_names, input_shapes, data_reader, return layer, output_shape + +@keras_handler('QConv2DBatchnorm') +def parse_qconv2dbatchnorm_layer(keras_layer, input_names, input_shapes, data_reader, config): + conv_layer, intermediate_shape = parse_qconv_layer(keras_layer, input_names, input_shapes, data_reader, config) + batch_layer, out_shape = parse_batchnorm_layer(keras_layer, input_names, intermediate_shape, data_reader, config) + return {**conv_layer, **batch_layer}, out_shape diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index 194b140278..1f82235ba5 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -6,6 +6,9 @@ import numpy as np from collections import OrderedDict +from tensorflow.python.ops import math_ops + + class Quantizer(object): def __init__(self, bits, hls_type): self.bits = bits @@ -448,15 +451,17 @@ def make_stream_variable(self, shape, dim_names, var_name='layer{index}_out', ty return StreamVariable(shape, dim_names, var_name=var_name, type_name=type_name, precision=precision, n_pack=pack_factor, depth=depth, index=self.index) - def add_weights(self, quantizer=None, compression=False): - data = self.model.get_weights_data(self.name, 'kernel') + def add_weights(self, quantizer=None, compression=False, data=None): + if data is None: + data = self.model.get_weights_data(self.name, 'kernel') self.add_weights_variable(name='weight', var_name='w{index}', data=data, quantizer=quantizer, compression=compression) - def add_bias(self, quantizer=None): - data = self.model.get_weights_data(self.name, 'bias') + def add_bias(self, quantizer=None, data=None): precision = None type_name = None + if data is None: + data = self.model.get_weights_data(self.name, 'bias') if data is None: data = np.zeros(self.get_output_variable().shape[-1]) precision = IntegerPrecisionType(width=1, signed=False) @@ -838,7 +843,114 @@ def initialize(self): self.set_attr('strategy', 'resource') if self.model.config.backend.name == 'Vivado': self.model.config.backend.set_closest_reuse_factor(self) - self.weights['weight'].data = np.transpose(self.weights['weight'].data, axes=[3, 2, 0, 1]) #(H,W,C,F) => (F,C,H,W) + self.weights['weight'].data = np.transpose(self.weights['weight'].data, + axes=[3, 2, 0, 1]) # (H,W,C,F) => (F,C,H,W) + else: + self.set_attr('strategy', 'latency') + + def function_cpp(self): + params = self._default_function_params() + params['data_format'] = 'cf' if self.get_attr('data_format') == 'channels_first' else 'cl' + params['w'] = self.get_weights('weight').name + params['b'] = self.get_weights('bias').name + + return [self._function_template.format(**params)] + + def config_cpp(self): + params = self._default_config_params() + if self.get_attr('data_format') == 'channels_last': + params['in_height'] = self.get_input_variable().dim_names[0] + params['in_width'] = self.get_input_variable().dim_names[1] + params['n_chan'] = self.get_input_variable().dim_names[2] + params['out_height'] = self.get_output_variable().dim_names[0] + params['out_width'] = self.get_output_variable().dim_names[1] + params['n_filt'] = self.get_output_variable().dim_names[2] + else: + params['n_chan'] = self.get_input_variable().dim_names[0] + params['in_height'] = self.get_input_variable().dim_names[1] + params['in_width'] = self.get_input_variable().dim_names[2] + params['n_filt'] = self.get_output_variable().dim_names[0] + params['out_height'] = self.get_output_variable().dim_names[1] + params['out_width'] = self.get_output_variable().dim_names[2] + params['dilation'] = self.get_attr('dilation', 1) + params['nzeros'] = self.get_weights('weight').nzeros + + if self.model.config.get_config_value('IOType') == 'io_stream': + min_h, min_w, instructions = self.model.config.backend.compute_conv2d_instructions( + self.get_input_variable().shape[0], + self.get_input_variable().shape[1], + self.get_input_variable().shape[2], + params['filt_height'], + params['stride_height']) + instructions_str = ','.join(str(i) for i in instructions) + params['min_height'] = min_h + params['min_width'] = min_w + params['instructions'] = instructions_str + else: + params['min_height'] = params['in_height'] + params['min_width'] = params['in_width'] + params['instructions'] = '0' + + params['config_t'] = 'config{}_mult'.format(self.index) + conv_config = self._config_template[0].format(**params) + + mult_params = self._default_config_params() + mult_params['n_in'] = self.get_attr('n_chan') * self.get_attr('filt_height') * self.get_attr('filt_width') + mult_params['n_out'] = self.get_attr('n_filt') + mult_params['product_type'] = self.model.config.backend.product_type(self.get_input_variable().type.precision, + self.get_weights('weight').type.precision) + mult_config = self._config_template[1].format(**mult_params) + + return mult_config + '\n' + conv_config + + +class Conv2DBatchnorm(Layer): + def _get_folded_weights(self): + """ + Function to get the batchnorm folded weights. + This function converts the weights by folding batchnorm parameters into + the weight of QConv2D. The high-level equation: + W_fold = gamma * W / sqrt(variance + epsilon) + bias_fold = gamma * (bias - moving_mean) / sqrt(variance + epsilon) + beta + """ + kernel = self.model.get_weights_data(self.name, 'kernel') + bias = self.model.get_weights_data(self.name, 'bias') + + # get batchnorm weights and moving stats + gamma = self.model.get_weights_data(self.name, 'gamma') + beta = self.model.get_weights_data(self.name, 'beta') + moving_mean = self.model.get_weights_data(self.name, 'moving_mean') + moving_variance = self.model.get_weights_data(self.name, 'moving_variance') + # get the inversion factor so that we replace division by multiplication + inv = math_ops.rsqrt(moving_variance + self.get_attr('epsilon')) + if gamma is not None: + inv *= gamma + + # wrap conv kernel and bias with bn parameters + folded_kernel = inv * kernel + folded_bias = inv * (bias - moving_mean) + beta + + return [folded_kernel, folded_bias] + + def initialize(self): + if self.get_attr('data_format') == 'channels_last': + shape = [self.attributes['out_height'], self.attributes['out_width'], self.attributes['n_filt']] + dims = ['OUT_HEIGHT_{}'.format(self.index), 'OUT_WIDTH_{}'.format(self.index), + 'N_FILT_{}'.format(self.index)] + else: + shape = [self.attributes['n_filt'], self.attributes['out_height'], self.attributes['out_width']] + dims = ['N_FILT_{}'.format(self.index), 'OUT_HEIGHT_{}'.format(self.index), + 'OUT_WIDTH_{}'.format(self.index)] + folded_kernel, folded_bias = self._get_folded_weights() + self.add_output_variable(shape, dims) + self.add_weights(quantizer=self.get_attr('weight_quantizer'), data=folded_kernel) + self.add_bias(quantizer=self.get_attr('bias_quantizer'), data=folded_bias) + if self.model.config.is_resource_strategy(self): + self.set_attr('strategy', 'resource') + if self.model.config.backend.name == 'Vivado': + self.model.config.backend.set_closest_reuse_factor(self) + self.weights['weight'].data = np.transpose(self.weights['weight'].data, + axes=[3, 2, 0, 1]) # (H,W,C,F) => (F,C,H,W) else: self.set_attr('strategy', 'latency') @@ -1726,50 +1838,51 @@ def _get_transforms_config(self, params): params['sublayer_configs'] = '\n'.join(sublayer_configs) layer_map = { - 'Input' : Input, - 'InputLayer' : Input, - 'Activation' : Activation, - 'QActivation' : Activation, - 'LeakyReLU' : ParametrizedActivation, - 'ThresholdedReLU' : ParametrizedActivation, - 'ELU' : ParametrizedActivation, - 'PReLU' : PReLU, - 'Softmax' : Softmax, - 'Reshape' : Reshape, - 'Dense' : Dense, - 'BinaryDense' : Dense, - 'TernaryDense' : Dense, - 'QDense' : Dense, - 'Conv1D' : Conv1D, - 'QConv1D' : Conv1D, - 'Conv2D' : Conv2D, - 'BinaryConv2D' : Conv2D, - 'QConv2D' : Conv2D, - 'SeparableConv1D' : SeparableConv1D, - 'SeparableConv2D' : SeparableConv2D, - 'DepthwiseConv2D' : DepthwiseConv2D, - 'BatchNormalization' : BatchNormalization, - 'QBatchNormalization' : BatchNormalization, - 'MaxPooling1D' : Pooling1D, - 'AveragePooling1D' : Pooling1D, - 'MaxPooling2D' : Pooling2D, - 'AveragePooling2D' : Pooling2D, - 'GlobalMaxPooling1D' : GlobalPooling1D, - 'GlobalAveragePooling1D' : GlobalPooling1D, - 'GlobalMaxPooling2D' : GlobalPooling2D, - 'GlobalAveragePooling2D' : GlobalPooling2D, - 'ZeroPadding1D' : ZeroPadding1D, - 'ZeroPadding2D' : ZeroPadding2D, - 'Merge' : Merge, - 'Dot' : Dot, - 'Concatenate' : Concatenate, - 'Resize' : Resize, - 'UpSampling2D' : Resize, - 'Transpose' : Transpose, - 'GarNet' : GarNet, - 'GarNetStack' : GarNetStack, + 'Input': Input, + 'InputLayer': Input, + 'Activation': Activation, + 'QActivation': Activation, + 'LeakyReLU': ParametrizedActivation, + 'ThresholdedReLU': ParametrizedActivation, + 'ELU': ParametrizedActivation, + 'PReLU': PReLU, + 'Softmax': Softmax, + 'Reshape': Reshape, + 'Dense': Dense, + 'BinaryDense': Dense, + 'TernaryDense': Dense, + 'QDense': Dense, + 'Conv1D': Conv1D, + 'QConv1D': Conv1D, + 'Conv2D': Conv2D, + 'BinaryConv2D': Conv2D, + 'QConv2D': Conv2D, + 'SeparableConv1D': SeparableConv1D, + 'SeparableConv2D': SeparableConv2D, + 'DepthwiseConv2D': DepthwiseConv2D, + 'BatchNormalization': BatchNormalization, + 'QBatchNormalization': BatchNormalization, + 'QConv2DBatchnorm': Conv2DBatchnorm, + 'MaxPooling1D': Pooling1D, + 'AveragePooling1D': Pooling1D, + 'MaxPooling2D': Pooling2D, + 'AveragePooling2D': Pooling2D, + 'GlobalMaxPooling1D': GlobalPooling1D, + 'GlobalAveragePooling1D': GlobalPooling1D, + 'GlobalMaxPooling2D': GlobalPooling2D, + 'GlobalAveragePooling2D': GlobalPooling2D, + 'ZeroPadding1D': ZeroPadding1D, + 'ZeroPadding2D': ZeroPadding2D, + 'Merge': Merge, + 'Dot': Dot, + 'Concatenate': Concatenate, + 'Resize': Resize, + 'UpSampling2D': Resize, + 'Transpose': Transpose, + 'GarNet': GarNet, + 'GarNetStack': GarNetStack, # TensorFlow-specific layers: - 'BiasAdd' : BiasAdd, + 'BiasAdd': BiasAdd, } def register_layer(name, clazz): diff --git a/hls4ml/templates/vivado_template.py b/hls4ml/templates/vivado_template.py index e94108a6e1..530c0f0184 100644 --- a/hls4ml/templates/vivado_template.py +++ b/hls4ml/templates/vivado_template.py @@ -101,6 +101,36 @@ }}; const ap_uint config{index}::pixels[] = {{{instructions}}};\n""" +conv2dbatchnorm_config_template = """struct config{index} : nnet::conv2d_config {{ + static const unsigned pad_top = {pad_top}; + static const unsigned pad_bottom = {pad_bottom}; + static const unsigned pad_left = {pad_left}; + static const unsigned pad_right = {pad_right}; + static const unsigned in_height = {in_height}; + static const unsigned in_width = {in_width}; + static const unsigned n_chan = {n_chan}; + static const unsigned filt_height = {filt_height}; + static const unsigned filt_width = {filt_width}; + static const unsigned kernel_size = filt_height * filt_width; + static const unsigned n_filt = {n_filt}; + static const unsigned stride_height = {stride_height}; + static const unsigned stride_width = {stride_width}; + static const unsigned out_height = {out_height}; + static const unsigned out_width = {out_width}; + static const unsigned reuse_factor = {reuse}; + static const unsigned n_zeros = {nzeros}; + static const bool store_weights_in_bram = false; + static const unsigned strategy = nnet::{strategy}; + static const unsigned min_height = {min_height}; + static const unsigned min_width = {min_width}; + static const ap_uint pixels[min_height * min_width]; + typedef {accum_t} accum_t; + typedef {bias_t} bias_t; + typedef {weight_t} weight_t; + typedef {config_t} mult_config; +}}; +const ap_uint config{index}::pixels[] = {{{instructions}}};\n""" + sepconv_config_template = """struct config{index} {{ typedef {depthwise_config} depthwise_config; typedef {pointwise_config} pointwise_config; @@ -336,6 +366,7 @@ batchnorm_function_template = 'nnet::normalize<{input_t}, {output_t}, {config}>({input}, {output}, {scale}, {bias});' conv1d_function_template = 'nnet::conv_1d_{data_format}<{input_t}, {output_t}, {config}>({input}, {output}, {w}, {b});' conv2d_function_template = 'nnet::conv_2d_{data_format}<{input_t}, {output_t}, {config}>({input}, {output}, {w}, {b});' +conv2dbatchnorm_function_template = 'nnet::conv_2d_{data_format}<{input_t}, {output_t}, {config}>({input}, {output}, {w}, {b});' sepconv1d_function_template = 'nnet::separable_conv_1d_{data_format}<{input_t}, {output_t}, {config}>({input}, {output}, {d}, {p}, {z}, {b});' sepconv2d_function_template = 'nnet::separable_conv_2d_{data_format}<{input_t}, {output_t}, {config}>({input}, {output}, {d}, {p}, {z}, {b});' depthconv2d_function_template = 'nnet::depthwise_conv_2d_{data_format}<{input_t}, {output_t}, {config}>({input}, {output}, {w}, {b});' @@ -357,6 +388,7 @@ batchnorm_include_list = ['nnet_utils/nnet_batchnorm.h', 'nnet_utils/nnet_batchnorm_stream.h'] conv1d_include_list = ['nnet_utils/nnet_conv1d.h', 'nnet_utils/nnet_conv1d_stream.h'] conv2d_include_list = ['nnet_utils/nnet_conv2d.h', 'nnet_utils/nnet_conv2d_stream.h'] +conv2dbatchnorm_include_list = ['nnet_utils/nnet_conv2d.h', 'nnet_utils/nnet_conv2d_stream.h'] sepconv1d_include_list = ['nnet_utils/nnet_conv1d.h', 'nnet_utils/nnet_sepconv1d_stream.h'] sepconv2d_include_list = ['nnet_utils/nnet_conv2d.h', 'nnet_utils/nnet_sepconv2d_stream.h'] activ_include_list = ['nnet_utils/nnet_activation.h', 'nnet_utils/nnet_activation_stream.h'] @@ -370,31 +402,32 @@ class VivadoBackend(Backend): def __init__(self): super(VivadoBackend, self).__init__('Vivado') - self.register_templates('Dense', dense_function_template, dense_config_template, dense_include_list) - self.register_templates('BinaryDense' , dense_function_template, dense_config_template, dense_include_list) - self.register_templates('BatchNormalization' , batchnorm_function_template, batchnorm_config_template, batchnorm_include_list) - self.register_templates('Conv1D' , conv1d_function_template, [conv1d_config_template, conv_mult_config_template], conv1d_include_list) - self.register_templates('Conv2D' , conv2d_function_template, [conv2d_config_template, conv_mult_config_template], conv2d_include_list) - self.register_templates('SeparableConv1D' , sepconv1d_function_template, [sepconv_config_template, conv1d_config_template, conv1d_config_template, conv_mult_config_template, conv_mult_config_template], sepconv1d_include_list) - self.register_templates('SeparableConv2D' , sepconv2d_function_template, [sepconv_config_template, conv2d_config_template, conv2d_config_template, conv_mult_config_template, conv_mult_config_template], sepconv2d_include_list) - self.register_templates('DepthwiseConv2D' , depthconv2d_function_template, [conv2d_config_template, conv_mult_config_template], sepconv2d_include_list) - self.register_templates('Activation' , activ_function_template, activ_config_template, activ_include_list) - self.register_templates('ParametrizedActivation' , param_activ_function_template, activ_config_template, activ_include_list) - self.register_templates('PReLU' , param_activ_function_template, activ_config_template, activ_include_list) - self.register_templates('Softmax' , activ_function_template, softmax_config_template, activ_include_list) - self.register_templates('Pooling1D' , pooling1d_function_template, pooling1d_config_template, pooling_include_list) - self.register_templates('Pooling2D' , pooling2d_function_template, pooling2d_config_template, pooling_include_list) - self.register_templates('GlobalPooling1D' , global_pooling1d_function_template, global_pooling1d_config_template, pooling_include_list) - self.register_templates('GlobalPooling2D' , global_pooling2d_function_template, global_pooling2d_config_template, pooling_include_list) - self.register_templates('ZeroPadding1D' , zeropad1d_function_template, zeropad1d_config_template, padding_include_list) - self.register_templates('ZeroPadding2D' , zeropad2d_function_template, zeropad2d_config_template, padding_include_list) - self.register_templates('Merge' , merge_function_template, merge_config_template, merge_include_list) - self.register_templates('Concatenate' , merge_function_template, concat_config_template, merge_include_list) - self.register_templates('Dot' , merge_function_template, dot_config_template, merge_include_list) - self.register_templates('Resize' , resize_function_template, resize_config_template, resize_include_list) - self.register_templates('Transpose' , transpose_function_template, transpose_config_template, transpose_include_list) - self.register_templates('GarNet' , garnet_function_template, garnet_config_template, garnet_include_list) - self.register_templates('GarNetStack' , garnet_stack_function_template,garnet_stack_config_template, garnet_include_list) + self.register_templates('Dense', dense_function_template, dense_config_template, dense_include_list) + self.register_templates('BinaryDense' , dense_function_template, dense_config_template, dense_include_list) + self.register_templates('BatchNormalization' , batchnorm_function_template, batchnorm_config_template, batchnorm_include_list) + self.register_templates('Conv1D' , conv1d_function_template, [conv1d_config_template, conv_mult_config_template], conv1d_include_list) + self.register_templates('Conv2D' , conv2d_function_template, [conv2d_config_template, conv_mult_config_template], conv2d_include_list) + self.register_templates('Conv2DBatchnorm' , conv2dbatchnorm_function_template, [conv2dbatchnorm_config_template, conv_mult_config_template], conv2dbatchnorm_include_list) + self.register_templates('SeparableConv1D' , sepconv1d_function_template, [sepconv_config_template, conv1d_config_template, conv1d_config_template, conv_mult_config_template, conv_mult_config_template], sepconv1d_include_list) + self.register_templates('SeparableConv2D' , sepconv2d_function_template, [sepconv_config_template, conv2d_config_template, conv2d_config_template, conv_mult_config_template, conv_mult_config_template], sepconv2d_include_list) + self.register_templates('DepthwiseConv2D' , depthconv2d_function_template, [conv2d_config_template, conv_mult_config_template], sepconv2d_include_list) + self.register_templates('Activation' , activ_function_template, activ_config_template, activ_include_list) + self.register_templates('ParametrizedActivation' , param_activ_function_template, activ_config_template, activ_include_list) + self.register_templates('PReLU' , param_activ_function_template, activ_config_template, activ_include_list) + self.register_templates('Softmax' , activ_function_template, softmax_config_template, activ_include_list) + self.register_templates('Pooling1D' , pooling1d_function_template, pooling1d_config_template, pooling_include_list) + self.register_templates('Pooling2D' , pooling2d_function_template, pooling2d_config_template, pooling_include_list) + self.register_templates('GlobalPooling1D' , global_pooling1d_function_template,global_pooling1d_config_template, pooling_include_list) + self.register_templates('GlobalPooling2D' , global_pooling2d_function_template,global_pooling2d_config_template, pooling_include_list) + self.register_templates('ZeroPadding1D' , zeropad1d_function_template, zeropad1d_config_template, padding_include_list) + self.register_templates('ZeroPadding2D' , zeropad2d_function_template, zeropad2d_config_template, padding_include_list) + self.register_templates('Merge' , merge_function_template, merge_config_template, merge_include_list) + self.register_templates('Concatenate' , merge_function_template, concat_config_template, merge_include_list) + self.register_templates('Dot' , merge_function_template, dot_config_template, merge_include_list) + self.register_templates('Resize' , resize_function_template, resize_config_template, resize_include_list) + self.register_templates('Transpose' , transpose_function_template, transpose_config_template, transpose_include_list) + self.register_templates('GarNet' , garnet_function_template, garnet_config_template, garnet_include_list) + self.register_templates('GarNetStack' , garnet_stack_function_template, garnet_stack_config_template, garnet_include_list) def get_valid_reuse_factors(self, layer): n_in = 0 diff --git a/hls4ml/utils/config.py b/hls4ml/utils/config.py index 0ac6437d94..117f24a3a2 100644 --- a/hls4ml/utils/config.py +++ b/hls4ml/utils/config.py @@ -76,7 +76,7 @@ def config_from_keras_model(model, granularity='model', default_precision='ap_fi norm_layers = ['BatchNormalization'] activation_layers = ['Activation', 'LeakyReLU', 'ThresholdedReLU', 'ELU', 'PReLU', 'Softmax', 'ReLU'] merge_layers = ['Add', 'Subtract', 'Multiply', 'Average', 'Maximum', 'Minimum', 'Concatenate', 'Dot'] - qkeras_layers = ['QDense', 'QActivation', 'QConv1D', 'QConv2D', 'QBatchNormalization'] + qkeras_layers = ['QDense', 'QActivation', 'QConv1D', 'QConv2D', 'QBatchNormalization', 'QConv2DBatchnorm'] #Define layers to skip for conversion to HLS skip_layers = ['Dropout', 'Flatten'] #All supported layers diff --git a/notebooks/callbacks.py b/notebooks/callbacks.py new file mode 100644 index 0000000000..2361ccc8ea --- /dev/null +++ b/notebooks/callbacks.py @@ -0,0 +1,115 @@ +''' +Created on 7 Apr 2017 + +@author: jkiesele +''' +from __future__ import print_function + +from tensorflow.keras.callbacks import Callback, EarlyStopping, History, ModelCheckpoint, TensorBoard, ReduceLROnPlateau +# loss per epoch +from time import time +from pdb import set_trace +import json + + +class newline_callbacks_begin(Callback): + + def __init__(self, outputDir): + self.outputDir = outputDir + self.loss = [] + self.val_loss = [] + self.full_logs = [] + + def on_epoch_end(self, epoch, epoch_logs={}): + import os + lossfile = os.path.join(self.outputDir, 'losses.log') + print('\n***callbacks***\nsaving losses to ' + lossfile) + self.loss.append(epoch_logs.get('loss')) + self.val_loss.append(epoch_logs.get('val_loss')) + f = open(lossfile, 'w') + for i in range(len(self.loss)): + f.write(str(self.loss[i])) + f.write(" ") + f.write(str(self.val_loss[i])) + f.write("\n") + f.close() + normed = {} + for vv in epoch_logs: + normed[vv] = float(epoch_logs[vv]) + self.full_logs.append(normed) + lossfile = os.path.join(self.outputDir, 'full_info.log') + with open(lossfile, 'w') as out: + out.write(json.dumps(self.full_logs)) + + +class newline_callbacks_end(Callback): + def on_epoch_end(self, epoch, epoch_logs={}): + print('\n***callbacks end***\n') + + +class Losstimer(Callback): + def __init__(self, every=5): + self.points = [] + self.every = every + + def on_train_begin(self, logs): + self.start = time() + + def on_batch_end(self, batch, logs): + if (batch % self.every) != 0: return + elapsed = time() - self.start + cop = {} + for i, j in logs.items(): + cop[i] = float(j) + cop['elapsed'] = elapsed + self.points.append(cop) + + +class all_callbacks(object): + def __init__(self, + stop_patience=10, + lr_factor=0.5, + lr_patience=1, + lr_epsilon=0.001, + lr_cooldown=4, + lr_minimum=1e-5, + outputDir=''): + self.nl_begin = newline_callbacks_begin(outputDir) + self.nl_end = newline_callbacks_end() + + self.stopping = EarlyStopping(monitor='val_loss', + patience=stop_patience, + verbose=1, mode='min') + + self.reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=lr_factor, patience=lr_patience, + mode='min', verbose=1, epsilon=lr_epsilon, + cooldown=lr_cooldown, min_lr=lr_minimum) + + self.modelbestcheck = ModelCheckpoint(outputDir + "/KERAS_check_best_model.h5", + monitor='val_loss', verbose=1, + save_best_only=True) + + self.modelbestcheckweights = ModelCheckpoint(outputDir + "/KERAS_check_best_model_weights.h5", + monitor='val_loss', verbose=1, + save_best_only=True, save_weights_only=True) + + self.modelcheckperiod = ModelCheckpoint(outputDir + "/KERAS_check_model_epoch{epoch:02d}.h5", verbose=1, + period=10) + + self.modelcheck = ModelCheckpoint(outputDir + "/KERAS_check_model_last.h5", verbose=1) + + self.modelcheckweights = ModelCheckpoint(outputDir + "/KERAS_check_model_last_weights.h5", verbose=1, + save_weights_only=True) + + self.tb = TensorBoard(log_dir=outputDir + '/logs') + + self.history = History() + self.timer = Losstimer() + + self.callbacks = [ + self.nl_begin, + self.modelbestcheck, self.modelbestcheckweights, self.modelcheck, self.modelcheckweights, + self.modelcheckperiod, + self.reduce_lr, self.stopping, self.nl_end, self.tb, self.history, + self.timer + ] diff --git a/notebooks/part1_getting_started.ipynb b/notebooks/part1_getting_started.ipynb new file mode 100644 index 0000000000..f9155c6f13 --- /dev/null +++ b/notebooks/part1_getting_started.ipynb @@ -0,0 +1,1165 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Part 1: Getting started" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.utils import to_categorical\n", + "from sklearn.datasets import fetch_openml\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import LabelEncoder, StandardScaler\n", + "import numpy as np\n", + "%matplotlib inline\n", + "seed = 0\n", + "np.random.seed(seed)\n", + "import tensorflow as tf\n", + "tf.random.set_seed(seed)\n", + "import os\n", + "os.environ['PATH'] = '/tools/Xilinx/Vivado/2019.2/bin:' + os.environ['PATH']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fetch the jet tagging dataset from Open ML" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "data = fetch_openml('hls4ml_lhc_jets_hlf')\n", + "X, y = data['data'], data['target']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Let's print some information about the dataset\n", + "Print the feature names and the dataset shape" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['zlogz', 'c1_b0_mmdt', 'c1_b1_mmdt', 'c1_b2_mmdt', 'c2_b1_mmdt', 'c2_b2_mmdt', 'd2_b1_mmdt', 'd2_b2_mmdt', 'd2_a1_b1_mmdt', 'd2_a1_b2_mmdt', 'm2_b1_mmdt', 'm2_b2_mmdt', 'n2_b1_mmdt', 'n2_b2_mmdt', 'mass_mmdt', 'multiplicity']\n", + "(830000, 16) (830000,)\n", + " zlogz c1_b0_mmdt c1_b1_mmdt c1_b2_mmdt c2_b1_mmdt c2_b2_mmdt \\\n", + "0 -2.935125 0.383155 0.005126 0.000084 0.009070 0.000179 \n", + "1 -1.927335 0.270699 0.001585 0.000011 0.003232 0.000029 \n", + "2 -3.112147 0.458171 0.097914 0.028588 0.124278 0.038487 \n", + "3 -2.666515 0.437068 0.049122 0.007978 0.047477 0.004802 \n", + "4 -2.484843 0.428981 0.041786 0.006110 0.023066 0.001123 \n", + "\n", + " d2_b1_mmdt d2_b2_mmdt d2_a1_b1_mmdt d2_a1_b2_mmdt m2_b1_mmdt \\\n", + "0 1.769445 2.123898 1.769445 0.308185 0.135687 \n", + "1 2.038834 2.563099 2.038834 0.211886 0.063729 \n", + "2 1.269254 1.346238 1.269254 0.246488 0.115636 \n", + "3 0.966505 0.601864 0.966505 0.160756 0.082196 \n", + "4 0.552002 0.183821 0.552002 0.084338 0.048006 \n", + "\n", + " m2_b2_mmdt n2_b1_mmdt n2_b2_mmdt mass_mmdt multiplicity \n", + "0 0.083278 0.412136 0.299058 8.926882 75.0 \n", + "1 0.036310 0.310217 0.226661 3.886512 31.0 \n", + "2 0.079094 0.357559 0.289220 162.144669 61.0 \n", + "3 0.033311 0.238871 0.094516 91.258934 39.0 \n", + "4 0.014450 0.141906 0.036665 79.725777 35.0 \n", + "0 g\n", + "1 w\n", + "2 t\n", + "3 z\n", + "4 w\n", + "Name: class, dtype: category\n", + "Categories (5, object): ['g', 'q', 'w', 'z', 't']\n" + ] + } + ], + "source": [ + "print(data['feature_names'])\n", + "print(X.shape, y.shape)\n", + "print(X[:5])\n", + "print(y[:5])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you saw above, the `y` target is an array of strings, e.g. \\['g', 'w',...\\] etc.\n", + "We need to make this a \"One Hot\" encoding for the training.\n", + "Then, split the dataset into training and validation sets" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1. 0. 0. 0. 0.]\n", + " [0. 0. 0. 1. 0.]\n", + " [0. 0. 1. 0. 0.]\n", + " [0. 0. 0. 0. 1.]\n", + " [0. 0. 0. 1. 0.]]\n" + ] + } + ], + "source": [ + "le = LabelEncoder()\n", + "y = le.fit_transform(y)\n", + "y = to_categorical(y, 5)\n", + "X_train_val, X_test, y_train_val, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", + "print(y[:5])" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "scaler = StandardScaler()\n", + "X_train_val = scaler.fit_transform(X_train_val)\n", + "X_test = scaler.transform(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "np.save('X_train_val.npy', X_train_val)\n", + "np.save('X_test.npy', X_test)\n", + "np.save('y_train_val.npy', y_train_val)\n", + "np.save('y_test.npy', y_test)\n", + "np.save('classes.npy', le.classes_)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Now construct a model\n", + "We'll use 3 hidden layers with 64, then 32, then 32 neurons. Each layer will use `relu` activation.\n", + "Add an output layer with 5 neurons (one for each class), then finish with Softmax activation." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.layers import Dense, Activation, BatchNormalization\n", + "from tensorflow.keras.optimizers import Adam\n", + "from tensorflow.keras.regularizers import l1\n", + "from callbacks import all_callbacks" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "model = Sequential()\n", + "model.add(Dense(64, input_shape=(16,), name='fc1', kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", + "model.add(Activation(activation='relu', name='relu1'))\n", + "model.add(Dense(32, name='fc2', kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", + "model.add(Activation(activation='relu', name='relu2'))\n", + "model.add(Dense(32, name='fc3', kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", + "model.add(Activation(activation='relu', name='relu3'))\n", + "model.add(Dense(5, name='output', kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", + "model.add(Activation(activation='softmax', name='softmax'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Train the model\n", + "We'll use Adam optimizer with categorical crossentropy loss.\n", + "The callbacks will decay the learning rate and save the model into a directory 'model_1'\n", + "The model isn't very complex, so this should just take a few minutes even on the CPU.\n", + "If you've restarted the notebook kernel after training once, set `train = False` to load the trained model." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:`epsilon` argument is deprecated and will be removed, use `min_delta` instead.\n", + "WARNING:tensorflow:`period` argument is deprecated. Please use `save_freq` to specify the frequency in number of batches seen.\n", + "Epoch 1/30\n", + " 3/487 [..............................] - ETA: 1:16 - loss: 1.6385 - accuracy: 0.2988\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bWARNING:tensorflow:Callback method `on_train_batch_begin` is slow compared to the batch time (batch time: 0.0016s vs `on_train_batch_begin` time: 0.0228s). Check your callbacks.\n", + "WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.0016s vs `on_train_batch_end` time: 0.0295s). Check your callbacks.\n", + "487/487 [==============================] - 2s 3ms/step - loss: 1.4710 - accuracy: 0.4208 - val_loss: 1.1251 - val_accuracy: 0.6363\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00001: val_loss improved from inf to 1.12515, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00001: val_loss improved from inf to 1.12515, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00001: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00001: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 2/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 1.0855 - accuracy: 0.6526 - val_loss: 1.0071 - val_accuracy: 0.6900\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00002: val_loss improved from 1.12515 to 1.00706, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00002: val_loss improved from 1.12515 to 1.00706, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00002: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00002: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 3/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.9876 - accuracy: 0.6948 - val_loss: 0.9450 - val_accuracy: 0.7098\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00003: val_loss improved from 1.00706 to 0.94500, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00003: val_loss improved from 1.00706 to 0.94500, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00003: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00003: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 4/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.9303 - accuracy: 0.7120 - val_loss: 0.9005 - val_accuracy: 0.7187\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00004: val_loss improved from 0.94500 to 0.90048, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00004: val_loss improved from 0.94500 to 0.90048, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00004: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00004: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 5/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.8871 - accuracy: 0.7203 - val_loss: 0.8725 - val_accuracy: 0.7242\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00005: val_loss improved from 0.90048 to 0.87249, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00005: val_loss improved from 0.90048 to 0.87249, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00005: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00005: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 6/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.8628 - accuracy: 0.7253 - val_loss: 0.8548 - val_accuracy: 0.7273\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00006: val_loss improved from 0.87249 to 0.85481, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00006: val_loss improved from 0.87249 to 0.85481, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00006: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00006: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 7/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.8474 - accuracy: 0.7288 - val_loss: 0.8419 - val_accuracy: 0.7306\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00007: val_loss improved from 0.85481 to 0.84187, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00007: val_loss improved from 0.85481 to 0.84187, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00007: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00007: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 8/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.8350 - accuracy: 0.7312 - val_loss: 0.8322 - val_accuracy: 0.7325\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00008: val_loss improved from 0.84187 to 0.83221, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00008: val_loss improved from 0.84187 to 0.83221, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00008: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00008: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 9/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.8249 - accuracy: 0.7341 - val_loss: 0.8237 - val_accuracy: 0.7347\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00009: val_loss improved from 0.83221 to 0.82370, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00009: val_loss improved from 0.83221 to 0.82370, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00009: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00009: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 10/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.8164 - accuracy: 0.7361 - val_loss: 0.8161 - val_accuracy: 0.7368\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00010: val_loss improved from 0.82370 to 0.81606, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00010: val_loss improved from 0.82370 to 0.81606, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00010: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00010: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "Epoch 00010: saving model to model_1/KERAS_check_model_epoch10.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 11/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.8095 - accuracy: 0.7384 - val_loss: 0.8099 - val_accuracy: 0.7381\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00011: val_loss improved from 0.81606 to 0.80993, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00011: val_loss improved from 0.81606 to 0.80993, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00011: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00011: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 12/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.8027 - accuracy: 0.7404 - val_loss: 0.8039 - val_accuracy: 0.7401\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00012: val_loss improved from 0.80993 to 0.80386, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00012: val_loss improved from 0.80993 to 0.80386, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00012: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00012: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 13/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7990 - accuracy: 0.7407 - val_loss: 0.7988 - val_accuracy: 0.7415\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00013: val_loss improved from 0.80386 to 0.79877, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00013: val_loss improved from 0.80386 to 0.79877, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00013: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00013: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 14/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7939 - accuracy: 0.7429 - val_loss: 0.7947 - val_accuracy: 0.7424\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00014: val_loss improved from 0.79877 to 0.79470, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00014: val_loss improved from 0.79877 to 0.79470, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00014: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00014: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 15/30\n", + "487/487 [==============================] - 1s 3ms/step - loss: 0.7910 - accuracy: 0.7428 - val_loss: 0.7909 - val_accuracy: 0.7435\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00015: val_loss improved from 0.79470 to 0.79094, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00015: val_loss improved from 0.79470 to 0.79094, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00015: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00015: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 16/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7854 - accuracy: 0.7443 - val_loss: 0.7876 - val_accuracy: 0.7440\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00016: val_loss improved from 0.79094 to 0.78761, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00016: val_loss improved from 0.79094 to 0.78761, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00016: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00016: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 17/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7829 - accuracy: 0.7460 - val_loss: 0.7849 - val_accuracy: 0.7452\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00017: val_loss improved from 0.78761 to 0.78491, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00017: val_loss improved from 0.78761 to 0.78491, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00017: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00017: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 18/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7800 - accuracy: 0.7465 - val_loss: 0.7819 - val_accuracy: 0.7462\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00018: val_loss improved from 0.78491 to 0.78187, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00018: val_loss improved from 0.78491 to 0.78187, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00018: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00018: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 19/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7792 - accuracy: 0.7465 - val_loss: 0.7797 - val_accuracy: 0.7464\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00019: val_loss improved from 0.78187 to 0.77973, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00019: val_loss improved from 0.78187 to 0.77973, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00019: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00019: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 20/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7735 - accuracy: 0.7487 - val_loss: 0.7773 - val_accuracy: 0.7472\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00020: val_loss improved from 0.77973 to 0.77729, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00020: val_loss improved from 0.77973 to 0.77729, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00020: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00020: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "Epoch 00020: saving model to model_1/KERAS_check_model_epoch20.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 21/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7721 - accuracy: 0.7481 - val_loss: 0.7752 - val_accuracy: 0.7478\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00021: val_loss improved from 0.77729 to 0.77517, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00021: val_loss improved from 0.77729 to 0.77517, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00021: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00021: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 22/30\n", + "487/487 [==============================] - 1s 3ms/step - loss: 0.7722 - accuracy: 0.7485 - val_loss: 0.7734 - val_accuracy: 0.7484\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00022: val_loss improved from 0.77517 to 0.77345, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00022: val_loss improved from 0.77517 to 0.77345, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00022: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00022: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 23/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7684 - accuracy: 0.7492 - val_loss: 0.7716 - val_accuracy: 0.7487\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00023: val_loss improved from 0.77345 to 0.77156, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00023: val_loss improved from 0.77345 to 0.77156, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00023: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00023: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 24/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7663 - accuracy: 0.7497 - val_loss: 0.7696 - val_accuracy: 0.7493\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00024: val_loss improved from 0.77156 to 0.76961, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00024: val_loss improved from 0.77156 to 0.76961, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00024: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00024: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 25/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7625 - accuracy: 0.7509 - val_loss: 0.7680 - val_accuracy: 0.7493\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00025: val_loss improved from 0.76961 to 0.76797, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00025: val_loss improved from 0.76961 to 0.76797, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00025: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00025: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 26/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7623 - accuracy: 0.7504 - val_loss: 0.7664 - val_accuracy: 0.7500\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00026: val_loss improved from 0.76797 to 0.76638, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00026: val_loss improved from 0.76797 to 0.76638, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00026: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00026: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 27/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7579 - accuracy: 0.7526 - val_loss: 0.7648 - val_accuracy: 0.7501\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00027: val_loss improved from 0.76638 to 0.76477, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00027: val_loss improved from 0.76638 to 0.76477, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00027: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00027: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 28/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7565 - accuracy: 0.7523 - val_loss: 0.7636 - val_accuracy: 0.7508\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00028: val_loss improved from 0.76477 to 0.76365, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00028: val_loss improved from 0.76477 to 0.76365, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00028: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00028: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 29/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7588 - accuracy: 0.7514 - val_loss: 0.7618 - val_accuracy: 0.7511\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00029: val_loss improved from 0.76365 to 0.76181, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00029: val_loss improved from 0.76365 to 0.76181, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00029: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00029: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "Epoch 30/30\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7571 - accuracy: 0.7517 - val_loss: 0.7603 - val_accuracy: 0.7514\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "\n", + "***callbacks***\n", + "saving losses to model_1/losses.log\n", + "\n", + "Epoch 00030: val_loss improved from 0.76181 to 0.76032, saving model to model_1/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00030: val_loss improved from 0.76181 to 0.76032, saving model to model_1/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00030: saving model to model_1/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00030: saving model to model_1/KERAS_check_model_last_weights.h5\n", + "\n", + "Epoch 00030: saving model to model_1/KERAS_check_model_epoch30.h5\n", + "\n", + "***callbacks end***\n", + "\n" + ] + } + ], + "source": [ + "train = True\n", + "if train:\n", + " adam = Adam(lr=0.0001)\n", + " model.compile(optimizer=adam, loss=['categorical_crossentropy'], metrics=['accuracy'])\n", + " callbacks = all_callbacks(stop_patience = 1000,\n", + " lr_factor = 0.5,\n", + " lr_patience = 10,\n", + " lr_epsilon = 0.000001,\n", + " lr_cooldown = 2,\n", + " lr_minimum = 0.0000001,\n", + " outputDir = 'model_1')\n", + " model.fit(X_train_val, y_train_val, batch_size=1024,\n", + " epochs=30, validation_split=0.25, shuffle=True,\n", + " callbacks = callbacks.callbacks)\n", + "else:\n", + " from tensorflow.keras.models import load_model\n", + " model = load_model('model_1/KERAS_check_best_model.h5')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Check performance\n", + "Check the accuracy and make a ROC curve" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy: 0.7502530120481927\n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import plotting\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.metrics import accuracy_score\n", + "y_keras = model.predict(X_test)\n", + "print(\"Accuracy: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_keras, axis=1))))\n", + "plt.figure(figsize=(9,9))\n", + "_ = plotting.makeRoc(y_test, y_keras, le.classes_)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Convert the model to FPGA firmware with hls4ml\n", + "Now we will go through the steps to convert the model we trained to a low-latency optimized FPGA firmware with hls4ml.\n", + "First, we will evaluate its classification performance to make sure we haven't lost accuracy using the fixed-point data types. \n", + "Then we will synthesize the model with Vivado HLS and check the metrics of latency and FPGA resource usage.\n", + "\n", + "## Make an hls4ml config & model\n", + "The hls4ml Neural Network inference library is controlled through a configuration dictionary.\n", + "In this example we'll use the most simple variation, later exercises will look at more advanced configuration." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Interpreting Sequential\n", + "Topology:\n", + "Layer name: fc1_input, layer type: Input\n", + "Layer name: fc1, layer type: Dense\n", + " -> Activation (linear), layer name: fc1\n", + "Layer name: relu1, layer type: Activation\n", + "Layer name: fc2, layer type: Dense\n", + " -> Activation (linear), layer name: fc2\n", + "Layer name: relu2, layer type: Activation\n", + "Layer name: fc3, layer type: Dense\n", + " -> Activation (linear), layer name: fc3\n", + "Layer name: relu3, layer type: Activation\n", + "Layer name: output, layer type: Dense\n", + " -> Activation (linear), layer name: output\n", + "Layer name: softmax, layer type: Activation\n", + "-----------------------------------\n", + "Configuration\n", + "Model\n", + " Precision: ap_fixed<16,6>\n", + " ReuseFactor: 1\n", + " Strategy: Latency\n", + "-----------------------------------\n", + "Interpreting Sequential\n", + "Topology:\n", + "Layer name: fc1_input, layer type: InputLayer, current shape: [[None, 16]]\n", + "Layer name: fc1, layer type: Dense, current shape: [[None, 16]]\n", + "Layer name: relu1, layer type: Activation, current shape: [[None, 64]]\n", + "Layer name: fc2, layer type: Dense, current shape: [[None, 64]]\n", + "Layer name: relu2, layer type: Activation, current shape: [[None, 32]]\n", + "Layer name: fc3, layer type: Dense, current shape: [[None, 32]]\n", + "Layer name: relu3, layer type: Activation, current shape: [[None, 32]]\n", + "Layer name: output, layer type: Dense, current shape: [[None, 32]]\n", + "Layer name: softmax, layer type: Softmax, current shape: [[None, 5]]\n", + "Creating HLS model\n" + ] + } + ], + "source": [ + "import hls4ml\n", + "config = hls4ml.utils.config_from_keras_model(model, granularity='model')\n", + "print(\"-----------------------------------\")\n", + "print(\"Configuration\")\n", + "plotting.print_dict(config)\n", + "print(\"-----------------------------------\")\n", + "hls_model = hls4ml.converters.convert_from_keras_model(model,\n", + " hls_config=config,\n", + " output_dir='model_1/hls4ml_prj',\n", + " fpga_part='xcu250-figd2104-2L-e')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's visualise what we created. The model architecture is shown, annotated with the shape and data types" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": "" + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hls4ml.utils.plot_model(hls_model, show_shapes=True, show_precision=True, to_file=None)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Compile, predict\n", + "Now we need to check that this model performance is still good. We compile the hls_model, and then use `hls_model.predict` to execute the FPGA firmware with bit-accurate emulation on the CPU." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Writing HLS project\n", + "Done\n" + ] + } + ], + "source": [ + "hls_model.compile()\n", + "y_hls = hls_model.predict(np.ascontiguousarray(X_test))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Compare\n", + "That was easy! Now let's see how the performance compares to Keras:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Keras Accuracy: 0.7502530120481927\n", + "hls4ml Accuracy: 0.7503373493975903\n" + ] + }, + { + "data": { + "text/plain": "" + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": "
", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "print(\"Keras Accuracy: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_keras, axis=1))))\n", + "print(\"hls4ml Accuracy: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_hls, axis=1))))\n", + "\n", + "fig, ax = plt.subplots(figsize=(9, 9))\n", + "_ = plotting.makeRoc(y_test, y_keras, le.classes_)\n", + "plt.gca().set_prop_cycle(None) # reset the colors\n", + "_ = plotting.makeRoc(y_test, y_hls, le.classes_, linestyle='--')\n", + "\n", + "from matplotlib.lines import Line2D\n", + "lines = [Line2D([0], [0], ls='-'),\n", + " Line2D([0], [0], ls='--')]\n", + "from matplotlib.legend import Legend\n", + "leg = Legend(ax, lines, labels=['keras', 'hls4ml'],\n", + " loc='lower right', frameon=False)\n", + "ax.add_artist(leg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Synthesize\n", + "Now we'll actually use Vivado HLS to synthesize the model. We can run the build using a method of our `hls_model` object.\n", + "After running this step, we can integrate the generated IP into a workflow to compile for a specific FPGA board.\n", + "In this case, we'll just review the reports that Vivado HLS generates, checking the latency and resource usage.\n", + "\n", + "**This can take several minutes.**\n", + "\n", + "While the C-Synthesis is running, we can monitor the progress looking at the log file by opening a terminal from the notebook home, and executing:\n", + "\n", + "`tail -f model_1/hls4ml_prj/vivado_hls.log`" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": "{'EstimatedClockPeriod': '4.046',\n 'BestLatency': '10',\n 'WorstLatency': '10',\n 'IntervalMin': '1',\n 'IntervalMax': '1',\n 'BRAM_18K': '4',\n 'DSP48E': '2777',\n 'FF': '13315',\n 'LUT': '109274',\n 'URAM': '0',\n 'AvailableBRAM_18K': '5376',\n 'AvailableDSP48E': '12288',\n 'AvailableFF': '3456000',\n 'AvailableLUT': '1728000',\n 'AvailableURAM': '1280'}" + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hls_model.build(csim=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Check the reports\n", + "Print out the reports generated by Vivado HLS. Pay attention to the Latency and the 'Utilization Estimates' sections" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 1 solution(s) in model_1/hls4ml_prj//myproject_prj.\n", + "Reports for solution \"solution1\":\n", + "\n", + "C simulation report not found.\n", + "SYNTHESIS REPORT:\n", + "================================================================\n", + "== Vivado HLS Report for 'myproject'\n", + "================================================================\n", + "* Date: Tue Mar 2 09:31:37 2021\n", + "\n", + "* Version: 2019.2 (Build 2704478 on Wed Nov 06 22:10:23 MST 2019)\n", + "* Project: myproject_prj\n", + "* Solution: solution1\n", + "* Product family: virtexuplus\n", + "* Target device: xcu250-figd2104-2L-e\n", + "\n", + "\n", + "================================================================\n", + "== Performance Estimates\n", + "================================================================\n", + "+ Timing: \n", + " * Summary: \n", + " +--------+---------+----------+------------+\n", + " | Clock | Target | Estimated| Uncertainty|\n", + " +--------+---------+----------+------------+\n", + " |ap_clk | 5.00 ns | 3.883 ns | 0.62 ns |\n", + " +--------+---------+----------+------------+\n", + "\n", + "+ Latency: \n", + " * Summary: \n", + " +---------+---------+-----------+-----------+-----+-----+----------+\n", + " | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", + " | min | max | min | max | min | max | Type |\n", + " +---------+---------+-----------+-----------+-----+-----+----------+\n", + " | 9| 9| 45.000 ns | 45.000 ns | 1| 1| function |\n", + " +---------+---------+-----------+-----------+-----+-----+----------+\n", + "\n", + " + Detail: \n", + " * Instance: \n", + " +----------------------------------+-----------------------+---------+---------+----------+----------+-----+-----+----------+\n", + " | | | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", + " | Instance | Module | min | max | min | max | min | max | Type |\n", + " +----------------------------------+-----------------------+---------+---------+----------+----------+-----+-----+----------+\n", + " |grp_dense_latency_0_0_0_1_fu_215 |dense_latency_0_0_0_1 | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", + " |grp_dense_latency_0_0_0_s_fu_283 |dense_latency_0_0_0_s | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", + " |grp_dense_latency_0_0_0_2_fu_319 |dense_latency_0_0_0_2 | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", + " |grp_dense_latency_0_0_0_3_fu_325 |dense_latency_0_0_0_3 | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", + " |call_ret1_relu_1_fu_361 |relu_1 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " |call_ret3_relu_fu_429 |relu | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " |call_ret5_relu_2_fu_465 |relu_2 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " +----------------------------------+-----------------------+---------+---------+----------+----------+-----+-----+----------+\n", + "\n", + " * Loop: \n", + " N/A\n", + "\n", + "\n", + "\n", + "================================================================\n", + "== Utilization Estimates\n", + "================================================================\n", + "* Summary: \n", + "+---------------------+---------+-------+---------+---------+------+\n", + "| Name | BRAM_18K| DSP48E| FF | LUT | URAM |\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|DSP | -| 5| -| -| -|\n", + "|Expression | -| -| 0| 78| -|\n", + "|FIFO | -| -| -| -| -|\n", + "|Instance | -| 3906| 24516| 78553| -|\n", + "|Memory | 4| -| 0| 0| -|\n", + "|Multiplexer | -| -| -| 36| -|\n", + "|Register | -| -| 2405| -| -|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Total | 4| 3911| 26921| 78667| 0|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Available SLR | 1344| 3072| 864000| 432000| 320|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Utilization SLR (%) | ~0 | 127| 3| 18| 0|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Available | 5376| 12288| 3456000| 1728000| 1280|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Utilization (%) | ~0 | 31| ~0 | 4| 0|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "\n", + "+ Detail: \n", + " * Instance: \n", + " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", + " | Instance | Module | BRAM_18K| DSP48E| FF | LUT | URAM|\n", + " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", + " |grp_dense_latency_0_0_0_1_fu_215 |dense_latency_0_0_0_1 | 0| 1859| 11265| 35856| 0|\n", + " |grp_dense_latency_0_0_0_2_fu_319 |dense_latency_0_0_0_2 | 0| 982| 6145| 18240| 0|\n", + " |grp_dense_latency_0_0_0_3_fu_325 |dense_latency_0_0_0_3 | 0| 157| 961| 2825| 0|\n", + " |grp_dense_latency_0_0_0_s_fu_283 |dense_latency_0_0_0_s | 0| 908| 6145| 18048| 0|\n", + " |call_ret3_relu_fu_429 |relu | 0| 0| 0| 896| 0|\n", + " |call_ret1_relu_1_fu_361 |relu_1 | 0| 0| 0| 1792| 0|\n", + " |call_ret5_relu_2_fu_465 |relu_2 | 0| 0| 0| 896| 0|\n", + " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", + " |Total | | 0| 3906| 24516| 78553| 0|\n", + " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", + "\n" + ] + } + ], + "source": [ + "hls4ml.report.read_vivado_report('model_1/hls4ml_prj/')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## Exercise\n", + "Since `ReuseFactor = 1` we expect each multiplication used in the inference of our neural network to use 1 DSP. Is this what we see? (Note that the Softmax layer should use 5 DSPs, or 1 per class)\n", + "Calculate how many multiplications are performed for the inference of this network...\n", + "(We'll discuss the outcome)\n", + "#### Tentative solution\n", + "```\n", + " ________________________________________\n", + "| DSP usage | |\n", + "|-------------------------------------- |\n", + "| Expected: | 16x64+64x32+32x32+5 = 4101 |\n", + "|-------------------------------------- |\n", + "| Obtained: | 3911 |\n", + "| _______________________________________\n", + "```\n", + "Some DSPs are removed; why? Something that is constant is moved to LUTs (like tables for activation functions)?\n", + "Casting to ap_fixed types maybe can lead to sort of \"unintended\" pruning?" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/notebooks/part2_advanced_config.ipynb b/notebooks/part2_advanced_config.ipynb new file mode 100644 index 0000000000..f64d512a0f --- /dev/null +++ b/notebooks/part2_advanced_config.ipynb @@ -0,0 +1,973 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Part 2: Advanced Configuration" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.utils import to_categorical\n", + "from sklearn.datasets import fetch_openml\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import LabelEncoder, StandardScaler\n", + "from sklearn.metrics import accuracy_score\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "import plotting\n", + "import os\n", + "os.environ['PATH'] = '/tools/Xilinx/Vivado/2019.2/bin:' + os.environ['PATH']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "X_train_val = np.load('X_train_val.npy')\n", + "X_test = np.load('X_test.npy')\n", + "y_train_val = np.load('y_train_val.npy')\n", + "y_test = np.load('y_test.npy')\n", + "classes = np.load('classes.npy', allow_pickle=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load the model\n", + "Load the model trained in 'part1_getting_started'. **Make sure you've run through that walkthrough first!**" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.models import load_model\n", + "model = load_model('model_1/KERAS_check_best_model.h5')\n", + "y_keras = model.predict(X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Make an hls4ml config & model\n", + "This time, we'll create a config with finer granularity. When we print the config dictionary, you'll notice that an entry is created for each named Layer of the model. See for the first layer, for example:\n", + "```LayerName:\n", + " fc1:\n", + " Precision:\n", + " weight: ap_fixed<16,6>\n", + " bias: ap_fixed<16,6>\n", + " result: ap_fixed<16,6>\n", + " ReuseFactor: 1\n", + "```\n", + "Taken 'out of the box' this config will set all the parameters to the same settings as in part 1, but we can use it as a template to start modifying things. " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Interpreting Sequential\n", + "Topology:\n", + "Layer name: fc1_input, layer type: Input\n", + "Layer name: fc1, layer type: Dense\n", + " -> Activation (linear), layer name: fc1\n", + "Layer name: relu1, layer type: Activation\n", + "Layer name: fc2, layer type: Dense\n", + " -> Activation (linear), layer name: fc2\n", + "Layer name: relu2, layer type: Activation\n", + "Layer name: fc3, layer type: Dense\n", + " -> Activation (linear), layer name: fc3\n", + "Layer name: relu3, layer type: Activation\n", + "Layer name: output, layer type: Dense\n", + " -> Activation (linear), layer name: output\n", + "Layer name: softmax, layer type: Activation\n", + "-----------------------------------\n", + "LayerName\n", + " fc1_input\n", + " Precision\n", + " result: ap_fixed<16,6>\n", + " fc1\n", + " Precision\n", + " weight: ap_fixed<16,6>\n", + " bias: ap_fixed<16,6>\n", + " result: ap_fixed<16,6>\n", + " ReuseFactor: 1\n", + " fc1_linear\n", + " Precision: ap_fixed<16,6>\n", + " ReuseFactor: 1\n", + " table_size: 1024\n", + " table_t: ap_fixed<18,8>\n", + " relu1\n", + " Precision: ap_fixed<16,6>\n", + " ReuseFactor: 1\n", + " table_size: 1024\n", + " table_t: ap_fixed<18,8>\n", + " fc2\n", + " Precision\n", + " weight: ap_fixed<16,6>\n", + " bias: ap_fixed<16,6>\n", + " result: ap_fixed<16,6>\n", + " ReuseFactor: 1\n", + " fc2_linear\n", + " Precision: ap_fixed<16,6>\n", + " ReuseFactor: 1\n", + " table_size: 1024\n", + " table_t: ap_fixed<18,8>\n", + " relu2\n", + " Precision: ap_fixed<16,6>\n", + " ReuseFactor: 1\n", + " table_size: 1024\n", + " table_t: ap_fixed<18,8>\n", + " fc3\n", + " Precision\n", + " weight: ap_fixed<16,6>\n", + " bias: ap_fixed<16,6>\n", + " result: ap_fixed<16,6>\n", + " ReuseFactor: 1\n", + " fc3_linear\n", + " Precision: ap_fixed<16,6>\n", + " ReuseFactor: 1\n", + " table_size: 1024\n", + " table_t: ap_fixed<18,8>\n", + " relu3\n", + " Precision: ap_fixed<16,6>\n", + " ReuseFactor: 1\n", + " table_size: 1024\n", + " table_t: ap_fixed<18,8>\n", + " output\n", + " Precision\n", + " weight: ap_fixed<16,6>\n", + " bias: ap_fixed<16,6>\n", + " result: ap_fixed<16,6>\n", + " ReuseFactor: 1\n", + " output_linear\n", + " Precision: ap_fixed<16,6>\n", + " ReuseFactor: 1\n", + " table_size: 1024\n", + " table_t: ap_fixed<18,8>\n", + " softmax\n", + " Precision: ap_fixed<16,6>\n", + " ReuseFactor: 1\n", + " table_size: 1024\n", + " exp_table_t: ap_fixed<18,8,AP_RND,AP_SAT>\n", + " inv_table_t: ap_fixed<18,8,AP_RND,AP_SAT>\n", + "-----------------------------------\n" + ] + } + ], + "source": [ + "import hls4ml\n", + "config = hls4ml.utils.config_from_keras_model(model, granularity='name')\n", + "print(\"-----------------------------------\")\n", + "plotting.print_dict(config)\n", + "print(\"-----------------------------------\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Profiling\n", + "As you can see, we can choose the precision of _everything_ in our Neural Network. This is a powerful way to tune the performance, but it's also complicated. The tools in `hls4ml.model.profiling` can help you choose the right precision for your model. (That said, training your model with quantization built in can get around this problem, and that is introduced in Part 4. So, don't go too far down the rabbit hole of tuning your data types without first trying out quantization aware training with QKeras.)\n", + "\n", + "The first thing to try is to numerically profile your model. This method plots the distribution of the weights (and biases) as a box and whisker plot. The grey boxes show the values which can be represented with the data types used in the `hls_model`. Generally, you need the box to overlap completely with the whisker 'to the right' (large values) otherwise you'll get saturation & wrap-around issues. It can be okay for the box not to overlap completely 'to the left' (small values), but finding how small you can go is a matter of trial-and-error.\n", + "\n", + "Providing data, in this case just using the first 1000 examples for speed, will show the same distributions captured at the output of each layer." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Interpreting Sequential\n", + "Topology:\n", + "Layer name: fc1_input, layer type: InputLayer, current shape: [[None, 16]]\n", + "Layer name: fc1, layer type: Dense, current shape: [[None, 16]]\n", + "Layer name: relu1, layer type: Activation, current shape: [[None, 64]]\n", + "Layer name: fc2, layer type: Dense, current shape: [[None, 64]]\n", + "Layer name: relu2, layer type: Activation, current shape: [[None, 32]]\n", + "Layer name: fc3, layer type: Dense, current shape: [[None, 32]]\n", + "Layer name: relu3, layer type: Activation, current shape: [[None, 32]]\n", + "Layer name: output, layer type: Dense, current shape: [[None, 32]]\n", + "Layer name: softmax, layer type: Softmax, current shape: [[None, 5]]\n", + "Creating HLS model\n", + "Profiling weights\n", + "Profiling activations\n", + " fc1\n", + " relu1\n", + " fc2\n", + " relu2\n", + " fc3\n", + " relu3\n", + " output\n", + " softmax\n" + ] + }, + { + "data": { + "text/plain": [ + "(
,
)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "hls_model = hls4ml.converters.convert_from_keras_model(model,\n", + " hls_config=config,\n", + " output_dir='model_1/hls4ml_prj_2',\n", + " fpga_part='xcu250-figd2104-2L-e')\n", + "hls4ml.model.profiling.numerical(keras_model=model, hls_model=hls_model, X=X_test[:1000])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Customize\n", + "Let's just try setting the precision of the first layer weights to something more narrow than 16 bits. Using fewer bits can save resources in the FPGA. After inspecting the profiling plot above, let's try 8 bits with 1 integer bit.\n", + "\n", + "Then create a new `HLSModel`, and display the profiling with the new config. This time, just display the weight profile by not providing any data '`X`'. Then create the `HLSModel` and display the architecture. Notice the box around the weights of the first layer reflects the different precision." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Interpreting Sequential\n", + "Topology:\n", + "Layer name: fc1_input, layer type: InputLayer, current shape: [[None, 16]]\n", + "Layer name: fc1, layer type: Dense, current shape: [[None, 16]]\n", + "Layer name: relu1, layer type: Activation, current shape: [[None, 64]]\n", + "Layer name: fc2, layer type: Dense, current shape: [[None, 64]]\n", + "Layer name: relu2, layer type: Activation, current shape: [[None, 32]]\n", + "Layer name: fc3, layer type: Dense, current shape: [[None, 32]]\n", + "Layer name: relu3, layer type: Activation, current shape: [[None, 32]]\n", + "Layer name: output, layer type: Dense, current shape: [[None, 32]]\n", + "Layer name: softmax, layer type: Softmax, current shape: [[None, 5]]\n", + "Creating HLS model\n", + "Profiling weights\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "config['LayerName']['fc1']['Precision']['weight'] = 'ap_fixed<8,2>'\n", + "hls_model = hls4ml.converters.convert_from_keras_model(model,\n", + " hls_config=config,\n", + " output_dir='model_1/hls4ml_prj_2',\n", + " fpga_part='xcu250-figd2104-2L-e')\n", + "hls4ml.model.profiling.numerical(keras_model=model, hls_model=hls_model)\n", + "hls4ml.utils.plot_model(hls_model, show_shapes=True, show_precision=True, to_file=None)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Trace\n", + "When we start using customised precision throughout the model, it can be useful to collect the output from each layer to find out when things have gone wrong. We enable this trace collection by setting `Trace = True` for each layer whose output we want to collect." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Interpreting Sequential\n", + "Topology:\n", + "Layer name: fc1_input, layer type: InputLayer, current shape: [[None, 16]]\n", + "Layer name: fc1, layer type: Dense, current shape: [[None, 16]]\n", + "Layer name: relu1, layer type: Activation, current shape: [[None, 64]]\n", + "Layer name: fc2, layer type: Dense, current shape: [[None, 64]]\n", + "Layer name: relu2, layer type: Activation, current shape: [[None, 32]]\n", + "Layer name: fc3, layer type: Dense, current shape: [[None, 32]]\n", + "Layer name: relu3, layer type: Activation, current shape: [[None, 32]]\n", + "Layer name: output, layer type: Dense, current shape: [[None, 32]]\n", + "Layer name: softmax, layer type: Softmax, current shape: [[None, 5]]\n", + "Creating HLS model\n" + ] + } + ], + "source": [ + "for layer in config['LayerName'].keys():\n", + " config['LayerName'][layer]['Trace'] = True\n", + "hls_model = hls4ml.converters.convert_from_keras_model(model,\n", + " hls_config=config,\n", + " output_dir='model_1/hls4ml_prj_2',\n", + " fpga_part='xcu250-figd2104-2L-e')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Compile, trace, predict\n", + "Now we need to check that this model performance is still good after reducing the precision. We compile the `hls_model`, and now use the `hls_model.trace` method to collect the model output, and also the output for all the layers we enabled tracing for. This returns a dictionary with keys corresponding to the layer names of the model. Stored at that key is the array of values output by that layer, sampled from the provided data.\n", + "A helper function `get_ymodel_keras` will return the same dictionary for the Keras model.\n", + "\n", + "We'll just run the `trace` for the first 1000 examples, since it takes a bit longer and uses more memory than just running `predict`. " + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Writing HLS project\n", + "Done\n", + "Recompiling myproject with tracing\n", + "Writing HLS project\n", + "Done\n", + "Processing fc1 in Keras model...\n", + "Processing relu1 in Keras model...\n", + "Processing fc2 in Keras model...\n", + "Processing relu2 in Keras model...\n", + "Processing fc3 in Keras model...\n", + "Processing relu3 in Keras model...\n", + "Processing output in Keras model...\n", + "Processing softmax in Keras model...\n", + "Done taking outputs for Keras model.\n" + ] + }, + { + "ename": "Exception", + "evalue": "Array must be c_contiguous, try using numpy.ascontiguousarray(x)", + "output_type": "error", + "traceback": [ + "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[0;31mException\u001B[0m Traceback (most recent call last)", + "\u001B[0;32m\u001B[0m in \u001B[0;36m\u001B[0;34m\u001B[0m\n\u001B[1;32m 2\u001B[0m \u001B[0mhls4ml_pred\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mhls4ml_trace\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mhls_model\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mtrace\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mnp\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mascontiguousarray\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mX_test\u001B[0m\u001B[0;34m[\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;36m1000\u001B[0m\u001B[0;34m]\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 3\u001B[0m \u001B[0mkeras_trace\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mhls4ml\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mmodel\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mprofiling\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mget_ymodel_keras\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mmodel\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mX_test\u001B[0m\u001B[0;34m[\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;36m1000\u001B[0m\u001B[0;34m]\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m----> 4\u001B[0;31m \u001B[0my_hls\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mhls_model\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mpredict\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mX_test\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m", + "\u001B[0;32m/usr/local/anaconda3/envs/hls4ml-tutorial-0.4.0/lib/python3.7/site-packages/hls4ml/model/hls_model.py\u001B[0m in \u001B[0;36mpredict\u001B[0;34m(self, x)\u001B[0m\n\u001B[1;32m 440\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 441\u001B[0m \u001B[0;32mdef\u001B[0m \u001B[0mpredict\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mself\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mx\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m--> 442\u001B[0;31m \u001B[0mtop_function\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mctype\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mself\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0m_get_top_function\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mx\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 443\u001B[0m \u001B[0mn_samples\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mself\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0m_compute_n_samples\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mx\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 444\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n", + "\u001B[0;32m/usr/local/anaconda3/envs/hls4ml-tutorial-0.4.0/lib/python3.7/site-packages/hls4ml/model/hls_model.py\u001B[0m in \u001B[0;36m_get_top_function\u001B[0;34m(self, x)\u001B[0m\n\u001B[1;32m 413\u001B[0m \u001B[0;32mraise\u001B[0m \u001B[0mException\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m'Expected numpy.ndarray, but got {}'\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mformat\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mtype\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mx\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 414\u001B[0m \u001B[0;32mif\u001B[0m \u001B[0;32mnot\u001B[0m \u001B[0mx\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mflags\u001B[0m\u001B[0;34m[\u001B[0m\u001B[0;34m'C_CONTIGUOUS'\u001B[0m\u001B[0;34m]\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m--> 415\u001B[0;31m \u001B[0;32mraise\u001B[0m \u001B[0mException\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m'Array must be c_contiguous, try using numpy.ascontiguousarray(x)'\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 416\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 417\u001B[0m \u001B[0;32mif\u001B[0m \u001B[0mx\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mdtype\u001B[0m \u001B[0;32min\u001B[0m \u001B[0;34m[\u001B[0m\u001B[0mnp\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0msingle\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mnp\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mfloat32\u001B[0m\u001B[0;34m]\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n", + "\u001B[0;31mException\u001B[0m: Array must be c_contiguous, try using numpy.ascontiguousarray(x)" + ] + } + ], + "source": [ + "hls_model.compile()\n", + "hls4ml_pred, hls4ml_trace = hls_model.trace(np.ascontiguousarray(X_test[:1000]))\n", + "keras_trace = hls4ml.model.profiling.get_ymodel_keras(model, X_test[:1000])\n", + "y_hls = hls_model.predict(X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inspect\n", + "Now we can print out, make plots, or do any other more detailed analysis on the output of each layer to make sure we haven't made the performance worse. And if we have, we can quickly find out where. Let's just print the output of the first layer, for the first sample, for both the Keras and hls4ml models." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Keras layer 'fc1', first sample:\n", + "tf.Tensor(\n", + "[ 1.3298949 -0.2273792 -2.0345597 -1.2124288 0.74129164 1.363094\n", + " 2.6127422 2.1302752 0.21171883 -1.0895215 0.05829001 -0.26720256\n", + " 1.507444 0.62107986 -0.6999786 0.69951785 0.23473763 0.49169973\n", + " 0.6744242 0.80380046 1.0611422 0.43186942 0.5371661 -1.0782578\n", + " -1.1119338 0.58070505 -0.5819302 -2.1471696 0.85888755 0.06874409\n", + " 1.8492386 0.6351749 0.12423055 0.7581076 1.3591877 1.3394173\n", + " 0.7297581 -2.35184 -0.4690978 -0.06473738 -0.3725239 0.19004951\n", + " -1.1871346 -0.7982826 1.518335 -1.594072 1.346335 1.924911\n", + " -1.5910498 -1.767949 0.57423884 -2.1299162 -1.5479293 1.7082984\n", + " 1.2846634 0.5533352 -1.1855457 -1.4779193 0.8521671 0.9319416\n", + " -1.5019095 0.7208327 -1.2629596 -1.0844446 ], shape=(64,), dtype=float32)\n", + "hls4ml layer 'fc1', first sample:\n", + "[ 1.31152344 -0.23535156 -2.05273438 -1.23339844 0.70605469 1.32617188\n", + " 2.5546875 2.07519531 0.14550781 -1.125 0.03710938 -0.30371094\n", + " 1.45703125 0.57421875 -0.75585938 0.66210938 0.20507812 0.42675781\n", + " 0.60839844 0.7578125 1.0390625 0.38964844 0.50390625 -1.11035156\n", + " -1.12890625 0.53613281 -0.63671875 -2.16894531 0.83007812 0.03027344\n", + " 1.82519531 0.61816406 0.11621094 0.72460938 1.33886719 1.34082031\n", + " 0.70800781 -2.37988281 -0.5234375 -0.09179688 -0.39941406 0.1796875\n", + " -1.2265625 -0.81738281 1.47167969 -1.63671875 1.29589844 1.85839844\n", + " -1.62695312 -1.81738281 0.53710938 -2.171875 -1.57910156 1.66503906\n", + " 1.24414062 0.53027344 -1.23535156 -1.47265625 0.79394531 0.89453125\n", + " -1.54882812 0.67578125 -1.30371094 -1.12207031]\n" + ] + } + ], + "source": [ + "print(\"Keras layer 'fc1', first sample:\")\n", + "print(keras_trace['fc1'][0])\n", + "print(\"hls4ml layer 'fc1', first sample:\")\n", + "print(hls4ml_trace['fc1'][0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Compare\n", + "Let's see if we lost performance by using 8 bits for the weights of the first layer by inspecting the accuracy and ROC curve." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Keras Accuracy: 0.7502650602409638\n", + "hls4ml Accuracy: 0.7494819277108433\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "print(\"Keras Accuracy: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_keras, axis=1))))\n", + "print(\"hls4ml Accuracy: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_hls, axis=1))))\n", + "\n", + "fig, ax = plt.subplots(figsize=(9, 9))\n", + "_ = plotting.makeRoc(y_test, y_keras, classes)\n", + "plt.gca().set_prop_cycle(None) # reset the colors\n", + "_ = plotting.makeRoc(y_test, y_hls, classes, linestyle='--')\n", + "\n", + "from matplotlib.lines import Line2D\n", + "lines = [Line2D([0], [0], ls='-'),\n", + " Line2D([0], [0], ls='--')]\n", + "from matplotlib.legend import Legend\n", + "leg = Legend(ax, lines, labels=['keras', 'hls4ml'],\n", + " loc='lower right', frameon=False)\n", + "ax.add_artist(leg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Profiling & Trace Summary\n", + "We lost a small amount of accuracy compared to when we used `ap_fixed<16,6>`, but in many cases this difference will be small enough to be worth the resource saving. You can choose how aggressive to go with quantization, but it's always sensible to make the profiling plots even with the default configuration. Layer-level `trace` is very useful for finding when you reduced the bitwidth too far, or when the default configuration is no good for your model.\n", + "\n", + "With this 'post training quantization', around 8-bits width generally seems to be the limit to how low you can go before suffering significant performance loss. In Part 4, we'll look at using 'training aware quantization' with QKeras to go much lower without losing much performance.\n", + "\n", + "## ReuseFactor\n", + "Now let's look at the other configuration parameter: `ReuseFactor`.\n", + "Recall that `ReuseFactor` is our mechanism for tuning the parallelism:" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![reuse.png](attachment:images/reuse.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So now let's make a new configuration for this model, and set the `ReuseFactor` to `2` for every layer:\n", + "we'll compile the model, then evaulate its performance. (Note, by creating a new config with `granularity=Model`, we're implicitly resetting the precision to `ap_fixed<16,6>` throughout.) Changing the `ReuseFactor` should not change the classification results, but let's just verify that by inspecting the accuracy and ROC curve again!\n", + "Then we'll build the model." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Interpreting Sequential\n", + "Topology:\n", + "Layer name: fc1_input, layer type: Input\n", + "Layer name: fc1, layer type: Dense\n", + " -> Activation (linear), layer name: fc1\n", + "Layer name: relu1, layer type: Activation\n", + "Layer name: fc2, layer type: Dense\n", + " -> Activation (linear), layer name: fc2\n", + "Layer name: relu2, layer type: Activation\n", + "Layer name: fc3, layer type: Dense\n", + " -> Activation (linear), layer name: fc3\n", + "Layer name: relu3, layer type: Activation\n", + "Layer name: output, layer type: Dense\n", + " -> Activation (linear), layer name: output\n", + "Layer name: softmax, layer type: Activation\n", + "-----------------------------------\n", + "{'Model': {'Precision': 'ap_fixed<16,6>', 'ReuseFactor': 1, 'Strategy': 'Latency'}}\n", + "-----------------------------------\n", + "Interpreting Sequential\n", + "Topology:\n", + "Layer name: fc1_input, layer type: InputLayer, current shape: [[None, 16]]\n", + "Layer name: fc1, layer type: Dense, current shape: [[None, 16]]\n", + "Layer name: relu1, layer type: Activation, current shape: [[None, 64]]\n", + "Layer name: fc2, layer type: Dense, current shape: [[None, 64]]\n", + "Layer name: relu2, layer type: Activation, current shape: [[None, 32]]\n", + "Layer name: fc3, layer type: Dense, current shape: [[None, 32]]\n", + "Layer name: relu3, layer type: Activation, current shape: [[None, 32]]\n", + "Layer name: output, layer type: Dense, current shape: [[None, 32]]\n", + "Layer name: softmax, layer type: Softmax, current shape: [[None, 5]]\n", + "Creating HLS model\n", + "Writing HLS project\n", + "Done\n" + ] + }, + { + "ename": "Exception", + "evalue": "Array must be c_contiguous, try using numpy.ascontiguousarray(x)", + "output_type": "error", + "traceback": [ + "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[0;31mException\u001B[0m Traceback (most recent call last)", + "\u001B[0;32m\u001B[0m in \u001B[0;36m\u001B[0;34m\u001B[0m\n\u001B[1;32m 10\u001B[0m fpga_part='xcu250-figd2104-2L-e')\n\u001B[1;32m 11\u001B[0m \u001B[0mhls_model\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mcompile\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m---> 12\u001B[0;31m \u001B[0my_hls\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mhls_model\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mpredict\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mX_test\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 13\u001B[0m \u001B[0mprint\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m\"Keras Accuracy: {}\"\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mformat\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0maccuracy_score\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mnp\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0margmax\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0my_test\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0maxis\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0;36m1\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mnp\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0margmax\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0my_keras\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0maxis\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0;36m1\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 14\u001B[0m \u001B[0mprint\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m\"hls4ml Accuracy: {}\"\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mformat\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0maccuracy_score\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mnp\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0margmax\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0my_test\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0maxis\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0;36m1\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mnp\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0margmax\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0my_hls\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0maxis\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0;36m1\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n", + "\u001B[0;32m/usr/local/anaconda3/envs/hls4ml-tutorial-0.4.0/lib/python3.7/site-packages/hls4ml/model/hls_model.py\u001B[0m in \u001B[0;36mpredict\u001B[0;34m(self, x)\u001B[0m\n\u001B[1;32m 440\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 441\u001B[0m \u001B[0;32mdef\u001B[0m \u001B[0mpredict\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mself\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mx\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m--> 442\u001B[0;31m \u001B[0mtop_function\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mctype\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mself\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0m_get_top_function\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mx\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 443\u001B[0m \u001B[0mn_samples\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mself\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0m_compute_n_samples\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mx\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 444\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n", + "\u001B[0;32m/usr/local/anaconda3/envs/hls4ml-tutorial-0.4.0/lib/python3.7/site-packages/hls4ml/model/hls_model.py\u001B[0m in \u001B[0;36m_get_top_function\u001B[0;34m(self, x)\u001B[0m\n\u001B[1;32m 413\u001B[0m \u001B[0;32mraise\u001B[0m \u001B[0mException\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m'Expected numpy.ndarray, but got {}'\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mformat\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mtype\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mx\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 414\u001B[0m \u001B[0;32mif\u001B[0m \u001B[0;32mnot\u001B[0m \u001B[0mx\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mflags\u001B[0m\u001B[0;34m[\u001B[0m\u001B[0;34m'C_CONTIGUOUS'\u001B[0m\u001B[0;34m]\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m--> 415\u001B[0;31m \u001B[0;32mraise\u001B[0m \u001B[0mException\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m'Array must be c_contiguous, try using numpy.ascontiguousarray(x)'\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 416\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 417\u001B[0m \u001B[0;32mif\u001B[0m \u001B[0mx\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mdtype\u001B[0m \u001B[0;32min\u001B[0m \u001B[0;34m[\u001B[0m\u001B[0mnp\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0msingle\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mnp\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mfloat32\u001B[0m\u001B[0;34m]\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n", + "\u001B[0;31mException\u001B[0m: Array must be c_contiguous, try using numpy.ascontiguousarray(x)" + ] + } + ], + "source": [ + "config = hls4ml.utils.config_from_keras_model(model, granularity='Model')\n", + "print(\"-----------------------------------\")\n", + "print(config)\n", + "print(\"-----------------------------------\")\n", + "# Set the ReuseFactor to 2 throughout\n", + "config['Model']['ReuseFactor'] = 2\n", + "hls_model = hls4ml.converters.convert_from_keras_model(model,\n", + " hls_config=config,\n", + " output_dir='model_1/hls4ml_prj_2',\n", + " fpga_part='xcu250-figd2104-2L-e')\n", + "hls_model.compile()\n", + "y_hls = hls_model.predict(X_test)\n", + "print(\"Keras Accuracy: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_keras, axis=1))))\n", + "print(\"hls4ml Accuracy: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_hls, axis=1))))\n", + "plt.figure(figsize=(9, 9))\n", + "_ = plotting.makeRoc(y_test, y_keras, classes)\n", + "plt.gca().set_prop_cycle(None) # reset the colors\n", + "_ = plotting.makeRoc(y_test, y_hls, classes, linestyle='--')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now build the model\n", + "\n", + "**This can take several minutes.**\n", + "\n", + "While the C-Synthesis is running, we can monitor the progress looking at the log file by opening a terminal from the notebook home, and executing:\n", + "\n", + "`tail -f model_1/hls4ml_prj_2/vivado_hls.log`" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "hls_model.build(csim=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And now print the report, compare this to the report from Exercise 1" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 1 solution(s) in model_1/hls4ml_prj_2/myproject_prj.\n", + "Reports for solution \"solution1\":\n", + "\n", + "C simulation report not found.\n", + "SYNTHESIS REPORT:\n", + "================================================================\n", + "== Vivado HLS Report for 'myproject'\n", + "================================================================\n", + "* Date: Tue Mar 2 12:30:29 2021\n", + "\n", + "* Version: 2019.2 (Build 2704478 on Wed Nov 06 22:10:23 MST 2019)\n", + "* Project: myproject_prj\n", + "* Solution: solution1\n", + "* Product family: virtexuplus\n", + "* Target device: xcu250-figd2104-2L-e\n", + "\n", + "\n", + "================================================================\n", + "== Performance Estimates\n", + "================================================================\n", + "+ Timing: \n", + " * Summary: \n", + " +--------+---------+----------+------------+\n", + " | Clock | Target | Estimated| Uncertainty|\n", + " +--------+---------+----------+------------+\n", + " |ap_clk | 5.00 ns | 4.486 ns | 0.62 ns |\n", + " +--------+---------+----------+------------+\n", + "\n", + "+ Latency: \n", + " * Summary: \n", + " +---------+---------+-----------+-----------+-----+-----+----------+\n", + " | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", + " | min | max | min | max | min | max | Type |\n", + " +---------+---------+-----------+-----------+-----+-----+----------+\n", + " | 15| 15| 75.000 ns | 75.000 ns | 2| 2| function |\n", + " +---------+---------+-----------+-----------+-----+-----+----------+\n", + "\n", + " + Detail: \n", + " * Instance: \n", + " +----------------------------------+-----------------------+---------+---------+-----------+-----------+-----+-----+----------+\n", + " | | | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", + " | Instance | Module | min | max | min | max | min | max | Type |\n", + " +----------------------------------+-----------------------+---------+---------+-----------+-----------+-----+-----+----------+\n", + " |grp_dense_latency_0_0_0_1_fu_207 |dense_latency_0_0_0_1 | 2| 2| 10.000 ns | 10.000 ns | 2| 2| function |\n", + " |grp_dense_latency_0_0_0_s_fu_275 |dense_latency_0_0_0_s | 2| 2| 10.000 ns | 10.000 ns | 2| 2| function |\n", + " |grp_dense_latency_0_0_0_2_fu_311 |dense_latency_0_0_0_2 | 2| 2| 10.000 ns | 10.000 ns | 2| 2| function |\n", + " |grp_dense_latency_0_0_0_3_fu_317 |dense_latency_0_0_0_3 | 2| 2| 10.000 ns | 10.000 ns | 2| 2| function |\n", + " |call_ret1_relu_1_fu_353 |relu_1 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " |call_ret3_relu_fu_421 |relu | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " |call_ret5_relu_2_fu_457 |relu_2 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " +----------------------------------+-----------------------+---------+---------+-----------+-----------+-----+-----+----------+\n", + "\n", + " * Loop: \n", + " N/A\n", + "\n", + "\n", + "\n", + "================================================================\n", + "== Utilization Estimates\n", + "================================================================\n", + "* Summary: \n", + "+---------------------+---------+-------+---------+---------+------+\n", + "| Name | BRAM_18K| DSP48E| FF | LUT | URAM |\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|DSP | -| 5| -| -| -|\n", + "|Expression | -| -| 0| 78| -|\n", + "|FIFO | -| -| -| -| -|\n", + "|Instance | -| 2128| 28160| 117637| -|\n", + "|Memory | 3| -| 0| 0| -|\n", + "|Multiplexer | -| -| -| 90| -|\n", + "|Register | -| -| 2454| -| -|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Total | 3| 2133| 30614| 117805| 0|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Available SLR | 1344| 3072| 864000| 432000| 320|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Utilization SLR (%) | ~0 | 69| 3| 27| 0|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Available | 5376| 12288| 3456000| 1728000| 1280|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Utilization (%) | ~0 | 17| ~0 | 6| 0|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "\n", + "+ Detail: \n", + " * Instance: \n", + " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", + " | Instance | Module | BRAM_18K| DSP48E| FF | LUT | URAM|\n", + " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", + " |grp_dense_latency_0_0_0_1_fu_207 |dense_latency_0_0_0_1 | 0| 1024| 12676| 52707| 0|\n", + " |grp_dense_latency_0_0_0_2_fu_311 |dense_latency_0_0_0_2 | 0| 512| 6548| 29373| 0|\n", + " |grp_dense_latency_0_0_0_3_fu_317 |dense_latency_0_0_0_3 | 0| 80| 1300| 4994| 0|\n", + " |grp_dense_latency_0_0_0_s_fu_275 |dense_latency_0_0_0_s | 0| 512| 7636| 26979| 0|\n", + " |call_ret3_relu_fu_421 |relu | 0| 0| 0| 896| 0|\n", + " |call_ret1_relu_1_fu_353 |relu_1 | 0| 0| 0| 1792| 0|\n", + " |call_ret5_relu_2_fu_457 |relu_2 | 0| 0| 0| 896| 0|\n", + " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", + " |Total | | 0| 2128| 28160| 117637| 0|\n", + " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", + "\n" + ] + } + ], + "source": [ + "hls4ml.report.read_vivado_report('model_1/hls4ml_prj_2')" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 1 solution(s) in model_1/hls4ml_prj/myproject_prj.\n", + "Reports for solution \"solution1\":\n", + "\n", + "C simulation report not found.\n", + "SYNTHESIS REPORT:\n", + "================================================================\n", + "== Vivado HLS Report for 'myproject'\n", + "================================================================\n", + "* Date: Tue Mar 2 09:31:37 2021\n", + "\n", + "* Version: 2019.2 (Build 2704478 on Wed Nov 06 22:10:23 MST 2019)\n", + "* Project: myproject_prj\n", + "* Solution: solution1\n", + "* Product family: virtexuplus\n", + "* Target device: xcu250-figd2104-2L-e\n", + "\n", + "\n", + "================================================================\n", + "== Performance Estimates\n", + "================================================================\n", + "+ Timing: \n", + " * Summary: \n", + " +--------+---------+----------+------------+\n", + " | Clock | Target | Estimated| Uncertainty|\n", + " +--------+---------+----------+------------+\n", + " |ap_clk | 5.00 ns | 3.883 ns | 0.62 ns |\n", + " +--------+---------+----------+------------+\n", + "\n", + "+ Latency: \n", + " * Summary: \n", + " +---------+---------+-----------+-----------+-----+-----+----------+\n", + " | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", + " | min | max | min | max | min | max | Type |\n", + " +---------+---------+-----------+-----------+-----+-----+----------+\n", + " | 9| 9| 45.000 ns | 45.000 ns | 1| 1| function |\n", + " +---------+---------+-----------+-----------+-----+-----+----------+\n", + "\n", + " + Detail: \n", + " * Instance: \n", + " +----------------------------------+-----------------------+---------+---------+----------+----------+-----+-----+----------+\n", + " | | | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", + " | Instance | Module | min | max | min | max | min | max | Type |\n", + " +----------------------------------+-----------------------+---------+---------+----------+----------+-----+-----+----------+\n", + " |grp_dense_latency_0_0_0_1_fu_215 |dense_latency_0_0_0_1 | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", + " |grp_dense_latency_0_0_0_s_fu_283 |dense_latency_0_0_0_s | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", + " |grp_dense_latency_0_0_0_2_fu_319 |dense_latency_0_0_0_2 | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", + " |grp_dense_latency_0_0_0_3_fu_325 |dense_latency_0_0_0_3 | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", + " |call_ret1_relu_1_fu_361 |relu_1 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " |call_ret3_relu_fu_429 |relu | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " |call_ret5_relu_2_fu_465 |relu_2 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " +----------------------------------+-----------------------+---------+---------+----------+----------+-----+-----+----------+\n", + "\n", + " * Loop: \n", + " N/A\n", + "\n", + "\n", + "\n", + "================================================================\n", + "== Utilization Estimates\n", + "================================================================\n", + "* Summary: \n", + "+---------------------+---------+-------+---------+---------+------+\n", + "| Name | BRAM_18K| DSP48E| FF | LUT | URAM |\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|DSP | -| 5| -| -| -|\n", + "|Expression | -| -| 0| 78| -|\n", + "|FIFO | -| -| -| -| -|\n", + "|Instance | -| 3906| 24516| 78553| -|\n", + "|Memory | 4| -| 0| 0| -|\n", + "|Multiplexer | -| -| -| 36| -|\n", + "|Register | -| -| 2405| -| -|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Total | 4| 3911| 26921| 78667| 0|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Available SLR | 1344| 3072| 864000| 432000| 320|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Utilization SLR (%) | ~0 | 127| 3| 18| 0|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Available | 5376| 12288| 3456000| 1728000| 1280|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Utilization (%) | ~0 | 31| ~0 | 4| 0|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "\n", + "+ Detail: \n", + " * Instance: \n", + " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", + " | Instance | Module | BRAM_18K| DSP48E| FF | LUT | URAM|\n", + " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", + " |grp_dense_latency_0_0_0_1_fu_215 |dense_latency_0_0_0_1 | 0| 1859| 11265| 35856| 0|\n", + " |grp_dense_latency_0_0_0_2_fu_319 |dense_latency_0_0_0_2 | 0| 982| 6145| 18240| 0|\n", + " |grp_dense_latency_0_0_0_3_fu_325 |dense_latency_0_0_0_3 | 0| 157| 961| 2825| 0|\n", + " |grp_dense_latency_0_0_0_s_fu_283 |dense_latency_0_0_0_s | 0| 908| 6145| 18048| 0|\n", + " |call_ret3_relu_fu_429 |relu | 0| 0| 0| 896| 0|\n", + " |call_ret1_relu_1_fu_361 |relu_1 | 0| 0| 0| 1792| 0|\n", + " |call_ret5_relu_2_fu_465 |relu_2 | 0| 0| 0| 896| 0|\n", + " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", + " |Total | | 0| 3906| 24516| 78553| 0|\n", + " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", + "\n" + ] + } + ], + "source": [ + "hls4ml.report.read_vivado_report('model_1/hls4ml_prj')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercise\n", + "- Recall the outcome of the exercise of part 1 where we estimated how many DSPs our network should use.\n", + "How does this change now we've used `ReuseFactor = 2` for the network? Does the expectation match the report this time?\n", + "#### Tentative solution\n", + "\n", + "\n", + "```\n", + " ____________________________________________\n", + "| DSP usage | |\n", + "|------------------------------------------- |\n", + "| Expected: | (16x64+64x32+32x32+5)/2 = 2051 |\n", + "|------------------------------------------- |\n", + "| Obtained: | 2133 |\n", + "| ___________________________________________\n", + "```\n", + "\n", + "82 more DSP than expected; why?" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/notebooks/part3_compression.ipynb b/notebooks/part3_compression.ipynb new file mode 100644 index 0000000000..70830bb328 --- /dev/null +++ b/notebooks/part3_compression.ipynb @@ -0,0 +1,1100 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Part 3: Compression" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.utils import to_categorical\n", + "from sklearn.datasets import fetch_openml\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import LabelEncoder, StandardScaler\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "seed = 0\n", + "np.random.seed(seed)\n", + "import tensorflow as tf\n", + "tf.random.set_seed(seed)\n", + "import os\n", + "os.environ['PATH'] = '/tools/Xilinx/Vivado/2019.2/bin:' + os.environ['PATH']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fetch the jet tagging dataset from Open ML" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "X_train_val = np.load('X_train_val.npy')\n", + "X_test = np.load('X_test.npy')\n", + "y_train_val = np.load('y_train_val.npy')\n", + "y_test = np.load('y_test.npy')\n", + "classes = np.load('classes.npy', allow_pickle=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Now construct a model\n", + "We'll use the same architecture as in part 1: 3 hidden layers with 64, then 32, then 32 neurons. Each layer will use `relu` activation.\n", + "Add an output layer with 5 neurons (one for each class), then finish with Softmax activation." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.layers import Dense, Activation, BatchNormalization\n", + "from tensorflow.keras.optimizers import Adam\n", + "from tensorflow.keras.regularizers import l1\n", + "from callbacks import all_callbacks" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "model = Sequential()\n", + "model.add(Dense(64, input_shape=(16,), name='fc1', kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", + "model.add(Activation(activation='relu', name='relu1'))\n", + "model.add(Dense(32, name='fc2', kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", + "model.add(Activation(activation='relu', name='relu2'))\n", + "model.add(Dense(32, name='fc3', kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", + "model.add(Activation(activation='relu', name='relu3'))\n", + "model.add(Dense(5, name='output', kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", + "model.add(Activation(activation='softmax', name='softmax'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Train sparse\n", + "This time we'll use the Tensorflow model optimization sparsity to train a sparse model (forcing many weights to '0'). In this instance, the target sparsity is 75%" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow_model_optimization.python.core.sparsity.keras import prune, pruning_callbacks, pruning_schedule\n", + "from tensorflow_model_optimization.sparsity.keras import strip_pruning\n", + "pruning_params = {\"pruning_schedule\" : pruning_schedule.ConstantSparsity(0.75, begin_step=2000, frequency=100)}\n", + "model = prune.prune_low_magnitude(model, **pruning_params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Train the model\n", + "We'll use the same settings as the model for part 1: Adam optimizer with categorical crossentropy loss.\n", + "The callbacks will decay the learning rate and save the model into a directory 'model_2'\n", + "The model isn't very complex, so this should just take a few minutes even on the CPU.\n", + "If you've restarted the notebook kernel after training once, set `train = False` to load the trained model rather than training again." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:`epsilon` argument is deprecated and will be removed, use `min_delta` instead.\n", + "WARNING:tensorflow:`period` argument is deprecated. Please use `save_freq` to specify the frequency in number of batches seen.\n", + "Epoch 1/30\n", + " 1/487 [..............................] - ETA: 0s - loss: 1.6388 - accuracy: 0.3027WARNING:tensorflow:From /usr/local/anaconda3/envs/hls4ml-tutorial-0.4.0/lib/python3.7/site-packages/tensorflow/python/ops/summary_ops_v2.py:1277: stop (from tensorflow.python.eager.profiler) is deprecated and will be removed after 2020-07-01.\n", + "Instructions for updating:\n", + "use `tf.profiler.experimental.stop` instead.\n", + "WARNING:tensorflow:Callbacks method `on_train_batch_end` is slow compared to the batch time (batch time: 0.0022s vs `on_train_batch_end` time: 0.0072s). Check your callbacks.\n", + "485/487 [============================>.] - ETA: 0s - loss: 1.3297 - accuracy: 0.5158\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00001: val_loss improved from inf to 1.12515, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00001: val_loss improved from inf to 1.12515, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00001: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00001: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 3ms/step - loss: 1.3290 - accuracy: 0.5161 - val_loss: 1.1252 - val_accuracy: 0.6363\n", + "Epoch 2/30\n", + "467/487 [===========================>..] - ETA: 0s - loss: 1.0573 - accuracy: 0.6658\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00002: val_loss improved from 1.12515 to 1.00706, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00002: val_loss improved from 1.12515 to 1.00706, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00002: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00002: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 1.0550 - accuracy: 0.6668 - val_loss: 1.0071 - val_accuracy: 0.6900\n", + "Epoch 3/30\n", + "466/487 [===========================>..] - ETA: 0s - loss: 0.9725 - accuracy: 0.7001\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00003: val_loss improved from 1.00706 to 0.94499, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00003: val_loss improved from 1.00706 to 0.94499, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00003: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00003: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.9712 - accuracy: 0.7004 - val_loss: 0.9450 - val_accuracy: 0.7098\n", + "Epoch 4/30\n", + "468/487 [===========================>..] - ETA: 0s - loss: 0.9186 - accuracy: 0.7144\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00004: val_loss improved from 0.94499 to 0.90047, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00004: val_loss improved from 0.94499 to 0.90047, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00004: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00004: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.9183 - accuracy: 0.7143 - val_loss: 0.9005 - val_accuracy: 0.7187\n", + "Epoch 5/30\n", + "463/487 [===========================>..] - ETA: 0s - loss: 1.0783 - accuracy: 0.6400\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00005: val_loss did not improve from 0.90047\n", + "\n", + "Epoch 00005: val_loss did not improve from 0.90047\n", + "\n", + "Epoch 00005: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00005: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 1.0746 - accuracy: 0.6415 - val_loss: 0.9991 - val_accuracy: 0.6721\n", + "Epoch 6/30\n", + "469/487 [===========================>..] - ETA: 0s - loss: 0.9623 - accuracy: 0.6859\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00006: val_loss did not improve from 0.90047\n", + "\n", + "Epoch 00006: val_loss did not improve from 0.90047\n", + "\n", + "Epoch 00006: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00006: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.9615 - accuracy: 0.6863 - val_loss: 0.9364 - val_accuracy: 0.6952\n", + "Epoch 7/30\n", + "466/487 [===========================>..] - ETA: 0s - loss: 0.9164 - accuracy: 0.7012\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00007: val_loss did not improve from 0.90047\n", + "\n", + "Epoch 00007: val_loss did not improve from 0.90047\n", + "\n", + "Epoch 00007: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00007: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.9158 - accuracy: 0.7015 - val_loss: 0.9022 - val_accuracy: 0.7051\n", + "Epoch 8/30\n", + "471/487 [============================>.] - ETA: 0s - loss: 0.8874 - accuracy: 0.7098\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00008: val_loss improved from 0.90047 to 0.87750, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00008: val_loss improved from 0.90047 to 0.87750, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00008: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00008: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.8865 - accuracy: 0.7101 - val_loss: 0.8775 - val_accuracy: 0.7122\n", + "Epoch 9/30\n", + "479/487 [============================>.] - ETA: 0s - loss: 0.8659 - accuracy: 0.7155\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00009: val_loss improved from 0.87750 to 0.86038, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00009: val_loss improved from 0.87750 to 0.86038, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00009: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00009: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.8655 - accuracy: 0.7156 - val_loss: 0.8604 - val_accuracy: 0.7173\n", + "Epoch 10/30\n", + "485/487 [============================>.] - ETA: 0s - loss: 0.8508 - accuracy: 0.7192\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00010: val_loss improved from 0.86038 to 0.84774, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00010: val_loss improved from 0.86038 to 0.84774, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00010: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00010: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "Epoch 00010: saving model to model_2/KERAS_check_model_epoch10.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.8506 - accuracy: 0.7192 - val_loss: 0.8477 - val_accuracy: 0.7208\n", + "Epoch 11/30\n", + "462/487 [===========================>..] - ETA: 0s - loss: 0.8394 - accuracy: 0.7218\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00011: val_loss improved from 0.84774 to 0.83780, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00011: val_loss improved from 0.84774 to 0.83780, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00011: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00011: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.8392 - accuracy: 0.7220 - val_loss: 0.8378 - val_accuracy: 0.7228\n", + "Epoch 12/30\n", + "465/487 [===========================>..] - ETA: 0s - loss: 0.8300 - accuracy: 0.7243\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00012: val_loss improved from 0.83780 to 0.82950, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00012: val_loss improved from 0.83780 to 0.82950, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00012: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00012: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.8299 - accuracy: 0.7243 - val_loss: 0.8295 - val_accuracy: 0.7256\n", + "Epoch 13/30\n", + "472/487 [============================>.] - ETA: 0s - loss: 0.8224 - accuracy: 0.7262\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00013: val_loss improved from 0.82950 to 0.82221, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00013: val_loss improved from 0.82950 to 0.82221, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00013: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00013: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.8220 - accuracy: 0.7263 - val_loss: 0.8222 - val_accuracy: 0.7270\n", + "Epoch 14/30\n", + "468/487 [===========================>..] - ETA: 0s - loss: 0.8152 - accuracy: 0.7281\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00014: val_loss improved from 0.82221 to 0.81563, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00014: val_loss improved from 0.82221 to 0.81563, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00014: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00014: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.8149 - accuracy: 0.7282 - val_loss: 0.8156 - val_accuracy: 0.7286\n", + "Epoch 15/30\n", + "484/487 [============================>.] - ETA: 0s - loss: 0.8087 - accuracy: 0.7299\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00015: val_loss improved from 0.81563 to 0.80983, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00015: val_loss improved from 0.81563 to 0.80983, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00015: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00015: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.8086 - accuracy: 0.7299 - val_loss: 0.8098 - val_accuracy: 0.7301\n", + "Epoch 16/30\n", + "471/487 [============================>.] - ETA: 0s - loss: 0.8029 - accuracy: 0.7315\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00016: val_loss improved from 0.80983 to 0.80445, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00016: val_loss improved from 0.80983 to 0.80445, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00016: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00016: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.8030 - accuracy: 0.7314 - val_loss: 0.8045 - val_accuracy: 0.7315\n", + "Epoch 17/30\n", + "482/487 [============================>.] - ETA: 0s - loss: 0.7977 - accuracy: 0.7326\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00017: val_loss improved from 0.80445 to 0.79966, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00017: val_loss improved from 0.80445 to 0.79966, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00017: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00017: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7977 - accuracy: 0.7326 - val_loss: 0.7997 - val_accuracy: 0.7324\n", + "Epoch 18/30\n", + "475/487 [============================>.] - ETA: 0s - loss: 0.7927 - accuracy: 0.7339\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00018: val_loss improved from 0.79966 to 0.79519, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00018: val_loss improved from 0.79966 to 0.79519, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00018: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00018: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7930 - accuracy: 0.7338 - val_loss: 0.7952 - val_accuracy: 0.7338\n", + "Epoch 19/30\n", + "467/487 [===========================>..] - ETA: 0s - loss: 0.7892 - accuracy: 0.7348\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00019: val_loss improved from 0.79519 to 0.79118, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00019: val_loss improved from 0.79519 to 0.79118, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00019: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00019: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7886 - accuracy: 0.7350 - val_loss: 0.7912 - val_accuracy: 0.7346\n", + "Epoch 20/30\n", + "478/487 [============================>.] - ETA: 0s - loss: 0.7845 - accuracy: 0.7359\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00020: val_loss improved from 0.79118 to 0.78713, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00020: val_loss improved from 0.79118 to 0.78713, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00020: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00020: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "Epoch 00020: saving model to model_2/KERAS_check_model_epoch20.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7845 - accuracy: 0.7360 - val_loss: 0.7871 - val_accuracy: 0.7357\n", + "Epoch 21/30\n", + "465/487 [===========================>..] - ETA: 0s - loss: 0.7809 - accuracy: 0.7371\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00021: val_loss improved from 0.78713 to 0.78348, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00021: val_loss improved from 0.78713 to 0.78348, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00021: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00021: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7807 - accuracy: 0.7372 - val_loss: 0.7835 - val_accuracy: 0.7368\n", + "Epoch 22/30\n", + "474/487 [============================>.] - ETA: 0s - loss: 0.7774 - accuracy: 0.7382\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00022: val_loss improved from 0.78348 to 0.78014, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00022: val_loss improved from 0.78348 to 0.78014, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00022: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00022: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7771 - accuracy: 0.7382 - val_loss: 0.7801 - val_accuracy: 0.7379\n", + "Epoch 23/30\n", + "483/487 [============================>.] - ETA: 0s - loss: 0.7741 - accuracy: 0.7393\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00023: val_loss improved from 0.78014 to 0.77707, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00023: val_loss improved from 0.78014 to 0.77707, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00023: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00023: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 3ms/step - loss: 0.7739 - accuracy: 0.7393 - val_loss: 0.7771 - val_accuracy: 0.7387\n", + "Epoch 24/30\n", + "486/487 [============================>.] - ETA: 0s - loss: 0.7711 - accuracy: 0.7401\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00024: val_loss improved from 0.77707 to 0.77436, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00024: val_loss improved from 0.77707 to 0.77436, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00024: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00024: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7711 - accuracy: 0.7401 - val_loss: 0.7744 - val_accuracy: 0.7398\n", + "Epoch 25/30\n", + "467/487 [===========================>..] - ETA: 0s - loss: 0.7687 - accuracy: 0.7409\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00025: val_loss improved from 0.77436 to 0.77198, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00025: val_loss improved from 0.77436 to 0.77198, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00025: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00025: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7684 - accuracy: 0.7411 - val_loss: 0.7720 - val_accuracy: 0.7403\n", + "Epoch 26/30\n", + "467/487 [===========================>..] - ETA: 0s - loss: 0.7658 - accuracy: 0.7418\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00026: val_loss improved from 0.77198 to 0.76957, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00026: val_loss improved from 0.77198 to 0.76957, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00026: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00026: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7660 - accuracy: 0.7417 - val_loss: 0.7696 - val_accuracy: 0.7412\n", + "Epoch 27/30\n", + "471/487 [============================>.] - ETA: 0s - loss: 0.7640 - accuracy: 0.7426\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00027: val_loss improved from 0.76957 to 0.76751, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00027: val_loss improved from 0.76957 to 0.76751, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00027: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00027: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7637 - accuracy: 0.7427 - val_loss: 0.7675 - val_accuracy: 0.7422\n", + "Epoch 28/30\n", + "469/487 [===========================>..] - ETA: 0s - loss: 0.7616 - accuracy: 0.7431\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00028: val_loss improved from 0.76751 to 0.76542, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00028: val_loss improved from 0.76751 to 0.76542, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00028: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00028: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 2ms/step - loss: 0.7616 - accuracy: 0.7432 - val_loss: 0.7654 - val_accuracy: 0.7423\n", + "Epoch 29/30\n", + "486/487 [============================>.] - ETA: 0s - loss: 0.7595 - accuracy: 0.7439\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00029: val_loss improved from 0.76542 to 0.76335, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00029: val_loss improved from 0.76542 to 0.76335, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00029: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00029: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 3ms/step - loss: 0.7595 - accuracy: 0.7439 - val_loss: 0.7634 - val_accuracy: 0.7434\n", + "Epoch 30/30\n", + "484/487 [============================>.] - ETA: 0s - loss: 0.7577 - accuracy: 0.7444\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", + "***callbacks***\n", + "saving losses to model_2/losses.log\n", + "\n", + "Epoch 00030: val_loss improved from 0.76335 to 0.76154, saving model to model_2/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00030: val_loss improved from 0.76335 to 0.76154, saving model to model_2/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00030: saving model to model_2/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00030: saving model to model_2/KERAS_check_model_last_weights.h5\n", + "\n", + "Epoch 00030: saving model to model_2/KERAS_check_model_epoch30.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 1s 3ms/step - loss: 0.7576 - accuracy: 0.7445 - val_loss: 0.7615 - val_accuracy: 0.7437\n" + ] + } + ], + "source": [ + "train = True\n", + "if train:\n", + " adam = Adam(lr=0.0001)\n", + " model.compile(optimizer=adam, loss=['categorical_crossentropy'], metrics=['accuracy'])\n", + " callbacks = all_callbacks(stop_patience = 1000,\n", + " lr_factor = 0.5,\n", + " lr_patience = 10,\n", + " lr_epsilon = 0.000001,\n", + " lr_cooldown = 2,\n", + " lr_minimum = 0.0000001,\n", + " outputDir = 'model_2')\n", + " callbacks.callbacks.append(pruning_callbacks.UpdatePruningStep())\n", + " model.fit(X_train_val, y_train_val, batch_size=1024,\n", + " epochs=30, validation_split=0.25, shuffle=True,\n", + " callbacks = callbacks.callbacks)\n", + " # Save the model again but with the pruning 'stripped' to use the regular layer types\n", + " model = strip_pruning(model)\n", + " model.save('model_2/KERAS_check_best_model.h5')\n", + "else:\n", + " from tensorflow.keras.models import load_model\n", + " model = load_model('model_2/KERAS_check_best_model.h5')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Check sparsity\n", + "Make a quick check that the model was indeed trained sparse. We'll just make a histogram of the weights of the 1st layer, and hopefully observe a large peak in the bin containing '0'. Note logarithmic y axis." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "% of zeros = 0.75\n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "w = model.layers[0].weights[0].numpy()\n", + "h, b = np.histogram(w, bins=100)\n", + "plt.figure(figsize=(7,7))\n", + "plt.bar(b[:-1], h, width=b[1]-b[0])\n", + "plt.semilogy()\n", + "print('% of zeros = {}'.format(np.sum(w==0)/np.size(w)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Check performance\n", + "How does this 75% sparse model compare against the unpruned model? Let's report the accuracy and make a ROC curve. The pruned model is shown with solid lines, the unpruned model from part 1 is shown with dashed lines.\n", + "**Make sure you've trained the model from part 1**" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy unpruned: 0.7502650602409638\n", + "Accuracy pruned: 0.7426385542168674\n" + ] + }, + { + "data": { + "text/plain": "" + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": "
", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import plotting\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.metrics import accuracy_score\n", + "from tensorflow.keras.models import load_model\n", + "model_ref = load_model('model_1/KERAS_check_best_model.h5')\n", + "\n", + "y_ref = model_ref.predict(X_test)\n", + "y_prune = model.predict(X_test)\n", + "\n", + "print(\"Accuracy unpruned: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_ref, axis=1))))\n", + "print(\"Accuracy pruned: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_prune, axis=1))))\n", + "\n", + "fig, ax = plt.subplots(figsize=(9, 9))\n", + "_ = plotting.makeRoc(y_test, y_ref, classes)\n", + "plt.gca().set_prop_cycle(None) # reset the colors\n", + "_ = plotting.makeRoc(y_test, y_prune, classes, linestyle='--')\n", + "\n", + "from matplotlib.lines import Line2D\n", + "lines = [Line2D([0], [0], ls='-'),\n", + " Line2D([0], [0], ls='--')]\n", + "from matplotlib.legend import Legend\n", + "leg = Legend(ax, lines, labels=['unpruned', 'pruned'],\n", + " loc='lower right', frameon=False)\n", + "ax.add_artist(leg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Convert the model to FPGA firmware with hls4ml\n", + "Let's use the default configuration: `ap_fixed<16,6>` precision everywhere and `ReuseFactor=1`, so we can compare with the part 1 model. We need to use `strip_pruning` to change the layer types back to their originals.\n", + "\n", + "**The synthesis will take a while**\n", + "\n", + "While the C-Synthesis is running, we can monitor the progress looking at the log file by opening a terminal from the notebook home, and executing:\n", + "\n", + "`tail -f model_2/hls4ml_prj/vivado_hls.log`" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Interpreting Sequential\n", + "Topology:\n", + "Layer name: fc1_input, layer type: Input\n", + "Layer name: fc1, layer type: Dense\n", + " -> Activation (linear), layer name: fc1\n", + "Layer name: relu1, layer type: Activation\n", + "Layer name: fc2, layer type: Dense\n", + " -> Activation (linear), layer name: fc2\n", + "Layer name: relu2, layer type: Activation\n", + "Layer name: fc3, layer type: Dense\n", + " -> Activation (linear), layer name: fc3\n", + "Layer name: relu3, layer type: Activation\n", + "Layer name: output, layer type: Dense\n", + " -> Activation (linear), layer name: output\n", + "Layer name: softmax, layer type: Activation\n", + "{'Model': {'Precision': 'ap_fixed<16,6>', 'ReuseFactor': 1, 'Strategy': 'Latency'}}\n", + "Interpreting Sequential\n", + "Topology:\n", + "Layer name: fc1_input, layer type: InputLayer, current shape: [[None, 16]]\n", + "Layer name: fc1, layer type: Dense, current shape: [[None, 16]]\n", + "Layer name: relu1, layer type: Activation, current shape: [[None, 64]]\n", + "Layer name: fc2, layer type: Dense, current shape: [[None, 64]]\n", + "Layer name: relu2, layer type: Activation, current shape: [[None, 32]]\n", + "Layer name: fc3, layer type: Dense, current shape: [[None, 32]]\n", + "Layer name: relu3, layer type: Activation, current shape: [[None, 32]]\n", + "Layer name: output, layer type: Dense, current shape: [[None, 32]]\n", + "Layer name: softmax, layer type: Softmax, current shape: [[None, 5]]\n", + "Creating HLS model\n", + "Writing HLS project\n", + "Done\n" + ] + } + ], + "source": [ + "import hls4ml\n", + "\n", + "config = hls4ml.utils.config_from_keras_model(model, granularity='model')\n", + "print(config)\n", + "hls_model = hls4ml.converters.convert_from_keras_model(model,\n", + " hls_config=config,\n", + " output_dir='model_2/hls4ml_prj',\n", + " fpga_part='xcu250-figd2104-2L-e')\n", + "hls_model.compile()\n", + "hls_model.build(csim=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Check the reports\n", + "Print out the reports generated by Vivado HLS. Pay attention to the Utilization Estimates' section in particular this time." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 1 solution(s) in model_2/hls4ml_prj//myproject_prj.\n", + "Reports for solution \"solution1\":\n", + "\n", + "C simulation report not found.\n", + "SYNTHESIS REPORT:\n", + "================================================================\n", + "== Vivado HLS Report for 'myproject'\n", + "================================================================\n", + "* Date: Tue Mar 2 15:06:03 2021\n", + "\n", + "* Version: 2019.2 (Build 2704478 on Wed Nov 06 22:10:23 MST 2019)\n", + "* Project: myproject_prj\n", + "* Solution: solution1\n", + "* Product family: virtexuplus\n", + "* Target device: xcu250-figd2104-2L-e\n", + "\n", + "\n", + "================================================================\n", + "== Performance Estimates\n", + "================================================================\n", + "+ Timing: \n", + " * Summary: \n", + " +--------+---------+----------+------------+\n", + " | Clock | Target | Estimated| Uncertainty|\n", + " +--------+---------+----------+------------+\n", + " |ap_clk | 5.00 ns | 4.343 ns | 0.62 ns |\n", + " +--------+---------+----------+------------+\n", + "\n", + "+ Latency: \n", + " * Summary: \n", + " +---------+---------+-----------+-----------+-----+-----+----------+\n", + " | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", + " | min | max | min | max | min | max | Type |\n", + " +---------+---------+-----------+-----------+-----+-----+----------+\n", + " | 16| 16| 80.000 ns | 80.000 ns | 2| 2| function |\n", + " +---------+---------+-----------+-----------+-----+-----+----------+\n", + "\n", + " + Detail: \n", + " * Instance: \n", + " +----------------------------------+-----------------------+---------+---------+-----------+-----------+-----+-----+----------+\n", + " | | | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", + " | Instance | Module | min | max | min | max | min | max | Type |\n", + " +----------------------------------+-----------------------+---------+---------+-----------+-----------+-----+-----+----------+\n", + " |grp_dense_latency_0_0_0_1_fu_207 |dense_latency_0_0_0_1 | 2| 2| 10.000 ns | 10.000 ns | 2| 2| function |\n", + " |grp_dense_latency_0_0_0_s_fu_275 |dense_latency_0_0_0_s | 2| 2| 10.000 ns | 10.000 ns | 2| 2| function |\n", + " |grp_dense_latency_0_0_0_2_fu_311 |dense_latency_0_0_0_2 | 1| 1| 5.000 ns | 5.000 ns | 2| 2| function |\n", + " |grp_dense_latency_0_0_0_3_fu_317 |dense_latency_0_0_0_3 | 2| 2| 10.000 ns | 10.000 ns | 2| 2| function |\n", + " |call_ret1_relu_1_fu_353 |relu_1 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " |call_ret3_relu_fu_421 |relu | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " |call_ret5_relu_2_fu_457 |relu_2 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " +----------------------------------+-----------------------+---------+---------+-----------+-----------+-----+-----+----------+\n", + "\n", + " * Loop: \n", + " N/A\n", + "\n", + "\n", + "\n", + "================================================================\n", + "== Utilization Estimates\n", + "================================================================\n", + "* Summary: \n", + "+---------------------+---------+-------+---------+---------+------+\n", + "| Name | BRAM_18K| DSP48E| FF | LUT | URAM |\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|DSP | -| 5| -| -| -|\n", + "|Expression | -| -| 0| 78| -|\n", + "|FIFO | -| -| -| -| -|\n", + "|Instance | -| 1064| 17406| 56754| -|\n", + "|Memory | 3| -| 0| 0| -|\n", + "|Multiplexer | -| -| -| 99| -|\n", + "|Register | -| -| 3991| -| -|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Total | 3| 1069| 21397| 56931| 0|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Available SLR | 1344| 3072| 864000| 432000| 320|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Utilization SLR (%) | ~0 | 34| 2| 13| 0|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Available | 5376| 12288| 3456000| 1728000| 1280|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Utilization (%) | ~0 | 8| ~0 | 3| 0|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "\n", + "+ Detail: \n", + " * Instance: \n", + " +----------------------------------+-----------------------+---------+-------+------+-------+-----+\n", + " | Instance | Module | BRAM_18K| DSP48E| FF | LUT | URAM|\n", + " +----------------------------------+-----------------------+---------+-------+------+-------+-----+\n", + " |grp_dense_latency_0_0_0_1_fu_207 |dense_latency_0_0_0_1 | 0| 512| 8644| 25201| 0|\n", + " |grp_dense_latency_0_0_0_2_fu_311 |dense_latency_0_0_0_2 | 0| 256| 3234| 12545| 0|\n", + " |grp_dense_latency_0_0_0_3_fu_317 |dense_latency_0_0_0_3 | 0| 40| 1124| 2985| 0|\n", + " |grp_dense_latency_0_0_0_s_fu_275 |dense_latency_0_0_0_s | 0| 256| 4404| 12439| 0|\n", + " |call_ret3_relu_fu_421 |relu | 0| 0| 0| 896| 0|\n", + " |call_ret1_relu_1_fu_353 |relu_1 | 0| 0| 0| 1792| 0|\n", + " |call_ret5_relu_2_fu_457 |relu_2 | 0| 0| 0| 896| 0|\n", + " +----------------------------------+-----------------------+---------+-------+------+-------+-----+\n", + " |Total | | 0| 1064| 17406| 56754| 0|\n", + " +----------------------------------+-----------------------+---------+-------+------+-------+-----+\n", + "\n" + ] + } + ], + "source": [ + "hls4ml.report.read_vivado_report('model_2/hls4ml_prj/')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Print the report for the model trained in part 1. Remember these models have the same architecture, but the model in this section was trained using the sparsity API from tensorflow_model_optimization. Notice how the resource usage had dramatically reduced (particularly the DSPs). When Vivado HLS notices an operation like `y = 0 * x` it can avoid placing a DSP for that operation. The impact of this is biggest when `ReuseFactor = 1`, but still applies at higher reuse as well. **Note you need to have trained and synthesized the model from part 1**" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 1 solution(s) in model_1/hls4ml_prj/myproject_prj.\n", + "Reports for solution \"solution1\":\n", + "\n", + "C simulation report not found.\n", + "SYNTHESIS REPORT:\n", + "================================================================\n", + "== Vivado HLS Report for 'myproject'\n", + "================================================================\n", + "* Date: Tue Mar 2 09:31:37 2021\n", + "\n", + "* Version: 2019.2 (Build 2704478 on Wed Nov 06 22:10:23 MST 2019)\n", + "* Project: myproject_prj\n", + "* Solution: solution1\n", + "* Product family: virtexuplus\n", + "* Target device: xcu250-figd2104-2L-e\n", + "\n", + "\n", + "================================================================\n", + "== Performance Estimates\n", + "================================================================\n", + "+ Timing: \n", + " * Summary: \n", + " +--------+---------+----------+------------+\n", + " | Clock | Target | Estimated| Uncertainty|\n", + " +--------+---------+----------+------------+\n", + " |ap_clk | 5.00 ns | 3.883 ns | 0.62 ns |\n", + " +--------+---------+----------+------------+\n", + "\n", + "+ Latency: \n", + " * Summary: \n", + " +---------+---------+-----------+-----------+-----+-----+----------+\n", + " | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", + " | min | max | min | max | min | max | Type |\n", + " +---------+---------+-----------+-----------+-----+-----+----------+\n", + " | 9| 9| 45.000 ns | 45.000 ns | 1| 1| function |\n", + " +---------+---------+-----------+-----------+-----+-----+----------+\n", + "\n", + " + Detail: \n", + " * Instance: \n", + " +----------------------------------+-----------------------+---------+---------+----------+----------+-----+-----+----------+\n", + " | | | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", + " | Instance | Module | min | max | min | max | min | max | Type |\n", + " +----------------------------------+-----------------------+---------+---------+----------+----------+-----+-----+----------+\n", + " |grp_dense_latency_0_0_0_1_fu_215 |dense_latency_0_0_0_1 | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", + " |grp_dense_latency_0_0_0_s_fu_283 |dense_latency_0_0_0_s | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", + " |grp_dense_latency_0_0_0_2_fu_319 |dense_latency_0_0_0_2 | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", + " |grp_dense_latency_0_0_0_3_fu_325 |dense_latency_0_0_0_3 | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", + " |call_ret1_relu_1_fu_361 |relu_1 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " |call_ret3_relu_fu_429 |relu | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " |call_ret5_relu_2_fu_465 |relu_2 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " +----------------------------------+-----------------------+---------+---------+----------+----------+-----+-----+----------+\n", + "\n", + " * Loop: \n", + " N/A\n", + "\n", + "\n", + "\n", + "================================================================\n", + "== Utilization Estimates\n", + "================================================================\n", + "* Summary: \n", + "+---------------------+---------+-------+---------+---------+------+\n", + "| Name | BRAM_18K| DSP48E| FF | LUT | URAM |\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|DSP | -| 5| -| -| -|\n", + "|Expression | -| -| 0| 78| -|\n", + "|FIFO | -| -| -| -| -|\n", + "|Instance | -| 3906| 24516| 78553| -|\n", + "|Memory | 4| -| 0| 0| -|\n", + "|Multiplexer | -| -| -| 36| -|\n", + "|Register | -| -| 2405| -| -|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Total | 4| 3911| 26921| 78667| 0|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Available SLR | 1344| 3072| 864000| 432000| 320|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Utilization SLR (%) | ~0 | 127| 3| 18| 0|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Available | 5376| 12288| 3456000| 1728000| 1280|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Utilization (%) | ~0 | 31| ~0 | 4| 0|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "\n", + "+ Detail: \n", + " * Instance: \n", + " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", + " | Instance | Module | BRAM_18K| DSP48E| FF | LUT | URAM|\n", + " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", + " |grp_dense_latency_0_0_0_1_fu_215 |dense_latency_0_0_0_1 | 0| 1859| 11265| 35856| 0|\n", + " |grp_dense_latency_0_0_0_2_fu_319 |dense_latency_0_0_0_2 | 0| 982| 6145| 18240| 0|\n", + " |grp_dense_latency_0_0_0_3_fu_325 |dense_latency_0_0_0_3 | 0| 157| 961| 2825| 0|\n", + " |grp_dense_latency_0_0_0_s_fu_283 |dense_latency_0_0_0_s | 0| 908| 6145| 18048| 0|\n", + " |call_ret3_relu_fu_429 |relu | 0| 0| 0| 896| 0|\n", + " |call_ret1_relu_1_fu_361 |relu_1 | 0| 0| 0| 1792| 0|\n", + " |call_ret5_relu_2_fu_465 |relu_2 | 0| 0| 0| 896| 0|\n", + " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", + " |Total | | 0| 3906| 24516| 78553| 0|\n", + " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", + "\n" + ] + } + ], + "source": [ + "hls4ml.report.read_vivado_report('model_1/hls4ml_prj')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/notebooks/part4_quantization.ipynb b/notebooks/part4_quantization.ipynb new file mode 100644 index 0000000000..c5a2da8b87 --- /dev/null +++ b/notebooks/part4_quantization.ipynb @@ -0,0 +1,1082 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Part 4: Quantization" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.utils import to_categorical\n", + "from sklearn.datasets import fetch_openml\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import LabelEncoder, StandardScaler\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "seed = 0\n", + "np.random.seed(seed)\n", + "import tensorflow as tf\n", + "tf.random.set_seed(seed)\n", + "import os\n", + "os.environ['PATH'] = '/tools/Xilinx/Vivado/2019.2/bin:' + os.environ['PATH']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fetch the jet tagging dataset from Open ML" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "X_train_val = np.load('X_train_val.npy')\n", + "X_test = np.load('X_test.npy')\n", + "y_train_val = np.load('y_train_val.npy')\n", + "y_test = np.load('y_test.npy')\n", + "classes = np.load('classes.npy', allow_pickle=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Construct a model\n", + "This time we're going to use QKeras layers.\n", + "QKeras is \"Quantized Keras\" for deep heterogeneous quantization of ML models.\n", + "\n", + "https://github.com/google/qkeras\n", + "\n", + "It is maintained by Google and we recently added support for QKeras model to hls4ml." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.optimizers import Adam\n", + "from tensorflow.keras.regularizers import l1\n", + "from callbacks import all_callbacks\n", + "from tensorflow.keras.layers import Activation\n", + "from qkeras.qlayers import QDense, QActivation\n", + "from qkeras.quantizers import quantized_bits, quantized_relu" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We're using `QDense` layer instead of `Dense`, and `QActivation` instead of `Activation`. We're also specifying `kernel_quantizer = quantized_bits(6,0,0)`. This will use 6-bits (of which 0 are integer) for the weights. We also use the same quantization for the biases, and `quantized_relu(6)` for 6-bit ReLU activations." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "model = Sequential()\n", + "model.add(QDense(64, input_shape=(16,), name='fc1',\n", + " kernel_quantizer=quantized_bits(6,0,alpha=1), bias_quantizer=quantized_bits(6,0,alpha=1),\n", + " kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", + "model.add(QActivation(activation=quantized_relu(6), name='relu1'))\n", + "model.add(QDense(32, name='fc2',\n", + " kernel_quantizer=quantized_bits(6,0,alpha=1), bias_quantizer=quantized_bits(6,0,alpha=1),\n", + " kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", + "model.add(QActivation(activation=quantized_relu(6), name='relu2'))\n", + "model.add(QDense(32, name='fc3',\n", + " kernel_quantizer=quantized_bits(6,0,alpha=1), bias_quantizer=quantized_bits(6,0,alpha=1),\n", + " kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", + "model.add(QActivation(activation=quantized_relu(6), name='relu3'))\n", + "model.add(QDense(5, name='output',\n", + " kernel_quantizer=quantized_bits(6,0,alpha=1), bias_quantizer=quantized_bits(6,0,alpha=1),\n", + " kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", + "model.add(Activation(activation='softmax', name='softmax'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Train sparse\n", + "Let's train with model sparsity again, since QKeras layers are prunable." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "from tensorflow_model_optimization.python.core.sparsity.keras import prune, pruning_callbacks, pruning_schedule\n", + "from tensorflow_model_optimization.sparsity.keras import strip_pruning\n", + "pruning_params = {\"pruning_schedule\" : pruning_schedule.ConstantSparsity(0.75, begin_step=2000, frequency=100)}\n", + "model = prune.prune_low_magnitude(model, **pruning_params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Train the model\n", + "We'll use the same settings as the model for part 1: Adam optimizer with categorical crossentropy loss.\n", + "The callbacks will decay the learning rate and save the model into a directory 'model_2'\n", + "The model isn't very complex, so this should just take a few minutes even on the CPU.\n", + "If you've restarted the notebook kernel after training once, set `train = False` to load the trained model rather than training again." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "pycharm": { + "is_executing": true + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:`epsilon` argument is deprecated and will be removed, use `min_delta` instead.\n", + "WARNING:tensorflow:`period` argument is deprecated. Please use `save_freq` to specify the frequency in number of batches seen.\n", + "Epoch 1/30\n", + " 2/487 [..............................] - ETA: 26s - loss: 1.6332 - accuracy: 0.3340WARNING:tensorflow:Callbacks method `on_train_batch_end` is slow compared to the batch time (batch time: 0.0033s vs `on_train_batch_end` time: 0.1043s). Check your callbacks.\n", + "484/487 [============================>.] - ETA: 0s - loss: 1.3864 - accuracy: 0.4909\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00001: val_loss improved from inf to 1.19395, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00001: val_loss improved from inf to 1.19395, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00001: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00001: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 1.3854 - accuracy: 0.4916 - val_loss: 1.1940 - val_accuracy: 0.6129\n", + "Epoch 2/30\n", + "479/487 [============================>.] - ETA: 0s - loss: 1.1089 - accuracy: 0.6524\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00002: val_loss improved from 1.19395 to 1.04657, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00002: val_loss improved from 1.19395 to 1.04657, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00002: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00002: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 1.1079 - accuracy: 0.6529 - val_loss: 1.0466 - val_accuracy: 0.6832\n", + "Epoch 3/30\n", + "478/487 [============================>.] - ETA: 0s - loss: 1.0015 - accuracy: 0.7013\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00003: val_loss improved from 1.04657 to 0.96347, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00003: val_loss improved from 1.04657 to 0.96347, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00003: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00003: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 1.0008 - accuracy: 0.7015 - val_loss: 0.9635 - val_accuracy: 0.7123\n", + "Epoch 4/30\n", + "478/487 [============================>.] - ETA: 0s - loss: 0.9310 - accuracy: 0.7177\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00004: val_loss improved from 0.96347 to 0.90663, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00004: val_loss improved from 0.96347 to 0.90663, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00004: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00004: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.9306 - accuracy: 0.7177 - val_loss: 0.9066 - val_accuracy: 0.7217\n", + "Epoch 5/30\n", + "478/487 [============================>.] - ETA: 0s - loss: 1.1101 - accuracy: 0.6642\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00005: val_loss did not improve from 0.90663\n", + "\n", + "Epoch 00005: val_loss did not improve from 0.90663\n", + "\n", + "Epoch 00005: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00005: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 1.1092 - accuracy: 0.6647 - val_loss: 1.0584 - val_accuracy: 0.6913\n", + "Epoch 6/30\n", + "480/487 [============================>.] - ETA: 0s - loss: 1.0146 - accuracy: 0.7011\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00006: val_loss did not improve from 0.90663\n", + "\n", + "Epoch 00006: val_loss did not improve from 0.90663\n", + "\n", + "Epoch 00006: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00006: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 1.0142 - accuracy: 0.7012 - val_loss: 0.9860 - val_accuracy: 0.7070\n", + "Epoch 7/30\n", + "474/487 [============================>.] - ETA: 0s - loss: 0.9585 - accuracy: 0.7116\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00007: val_loss did not improve from 0.90663\n", + "\n", + "Epoch 00007: val_loss did not improve from 0.90663\n", + "\n", + "Epoch 00007: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00007: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.9580 - accuracy: 0.7118 - val_loss: 0.9405 - val_accuracy: 0.7147\n", + "Epoch 8/30\n", + "485/487 [============================>.] - ETA: 0s - loss: 0.9219 - accuracy: 0.7170\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00008: val_loss did not improve from 0.90663\n", + "\n", + "Epoch 00008: val_loss did not improve from 0.90663\n", + "\n", + "Epoch 00008: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00008: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.9220 - accuracy: 0.7170 - val_loss: 0.9107 - val_accuracy: 0.7185\n", + "Epoch 9/30\n", + "473/487 [============================>.] - ETA: 0s - loss: 0.8966 - accuracy: 0.7202\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00009: val_loss improved from 0.90663 to 0.88732, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00009: val_loss improved from 0.90663 to 0.88732, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00009: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00009: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.8962 - accuracy: 0.7203 - val_loss: 0.8873 - val_accuracy: 0.7214\n", + "Epoch 10/30\n", + "472/487 [============================>.] - ETA: 0s - loss: 0.8750 - accuracy: 0.7232\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00010: val_loss improved from 0.88732 to 0.86819, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00010: val_loss improved from 0.88732 to 0.86819, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00010: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00010: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "Epoch 00010: saving model to model_3/KERAS_check_model_epoch10.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.8749 - accuracy: 0.7231 - val_loss: 0.8682 - val_accuracy: 0.7240\n", + "Epoch 11/30\n", + "473/487 [============================>.] - ETA: 0s - loss: 0.8572 - accuracy: 0.7257\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00011: val_loss improved from 0.86819 to 0.85183, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00011: val_loss improved from 0.86819 to 0.85183, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00011: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00011: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.8568 - accuracy: 0.7258 - val_loss: 0.8518 - val_accuracy: 0.7265\n", + "Epoch 12/30\n", + "471/487 [============================>.] - ETA: 0s - loss: 0.8412 - accuracy: 0.7283\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00012: val_loss improved from 0.85183 to 0.83666, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00012: val_loss improved from 0.85183 to 0.83666, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00012: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00012: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.8412 - accuracy: 0.7284 - val_loss: 0.8367 - val_accuracy: 0.7286\n", + "Epoch 13/30\n", + "476/487 [============================>.] - ETA: 0s - loss: 0.8280 - accuracy: 0.7306\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00013: val_loss improved from 0.83666 to 0.82493, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00013: val_loss improved from 0.83666 to 0.82493, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00013: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00013: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.8277 - accuracy: 0.7307 - val_loss: 0.8249 - val_accuracy: 0.7308\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 14/30\n", + "486/487 [============================>.] - ETA: 0s - loss: 0.8162 - accuracy: 0.7326\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00014: val_loss improved from 0.82493 to 0.81425, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00014: val_loss improved from 0.82493 to 0.81425, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00014: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00014: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.8162 - accuracy: 0.7326 - val_loss: 0.8143 - val_accuracy: 0.7327\n", + "Epoch 15/30\n", + "476/487 [============================>.] - ETA: 0s - loss: 0.8068 - accuracy: 0.7342\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00015: val_loss improved from 0.81425 to 0.80559, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00015: val_loss improved from 0.81425 to 0.80559, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00015: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00015: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.8065 - accuracy: 0.7343 - val_loss: 0.8056 - val_accuracy: 0.7343\n", + "Epoch 16/30\n", + "485/487 [============================>.] - ETA: 0s - loss: 0.7980 - accuracy: 0.7362\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00016: val_loss improved from 0.80559 to 0.79786, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00016: val_loss improved from 0.80559 to 0.79786, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00016: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00016: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.7980 - accuracy: 0.7362 - val_loss: 0.7979 - val_accuracy: 0.7361\n", + "Epoch 17/30\n", + "474/487 [============================>.] - ETA: 0s - loss: 0.7908 - accuracy: 0.7377\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00017: val_loss improved from 0.79786 to 0.79130, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00017: val_loss improved from 0.79786 to 0.79130, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00017: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00017: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.7909 - accuracy: 0.7377 - val_loss: 0.7913 - val_accuracy: 0.7377\n", + "Epoch 18/30\n", + "478/487 [============================>.] - ETA: 0s - loss: 0.7841 - accuracy: 0.7393\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00018: val_loss improved from 0.79130 to 0.78559, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00018: val_loss improved from 0.79130 to 0.78559, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00018: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00018: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.7844 - accuracy: 0.7391 - val_loss: 0.7856 - val_accuracy: 0.7392\n", + "Epoch 19/30\n", + "478/487 [============================>.] - ETA: 0s - loss: 0.7798 - accuracy: 0.7402\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00019: val_loss improved from 0.78559 to 0.78118, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00019: val_loss improved from 0.78559 to 0.78118, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00019: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00019: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.7795 - accuracy: 0.7403 - val_loss: 0.7812 - val_accuracy: 0.7403\n", + "Epoch 20/30\n", + "475/487 [============================>.] - ETA: 0s - loss: 0.7750 - accuracy: 0.7412\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00020: val_loss improved from 0.78118 to 0.77648, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00020: val_loss improved from 0.78118 to 0.77648, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00020: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00020: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "Epoch 00020: saving model to model_3/KERAS_check_model_epoch20.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.7749 - accuracy: 0.7412 - val_loss: 0.7765 - val_accuracy: 0.7413\n", + "Epoch 21/30\n", + "483/487 [============================>.] - ETA: 0s - loss: 0.7707 - accuracy: 0.7426\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00021: val_loss improved from 0.77648 to 0.77317, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00021: val_loss improved from 0.77648 to 0.77317, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00021: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00021: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.7707 - accuracy: 0.7426 - val_loss: 0.7732 - val_accuracy: 0.7416\n", + "Epoch 22/30\n", + "474/487 [============================>.] - ETA: 0s - loss: 0.7676 - accuracy: 0.7434\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00022: val_loss improved from 0.77317 to 0.76988, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00022: val_loss improved from 0.77317 to 0.76988, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00022: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00022: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.7672 - accuracy: 0.7435 - val_loss: 0.7699 - val_accuracy: 0.7424\n", + "Epoch 23/30\n", + "482/487 [============================>.] - ETA: 0s - loss: 0.7642 - accuracy: 0.7443\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00023: val_loss improved from 0.76988 to 0.76731, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00023: val_loss improved from 0.76988 to 0.76731, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00023: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00023: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.7641 - accuracy: 0.7443 - val_loss: 0.7673 - val_accuracy: 0.7433\n", + "Epoch 24/30\n", + "475/487 [============================>.] - ETA: 0s - loss: 0.7617 - accuracy: 0.7450\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00024: val_loss improved from 0.76731 to 0.76479, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00024: val_loss improved from 0.76731 to 0.76479, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00024: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00024: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.7617 - accuracy: 0.7450 - val_loss: 0.7648 - val_accuracy: 0.7439\n", + "Epoch 25/30\n", + "486/487 [============================>.] - ETA: 0s - loss: 0.7593 - accuracy: 0.7455\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00025: val_loss improved from 0.76479 to 0.76259, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00025: val_loss improved from 0.76479 to 0.76259, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00025: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00025: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.7592 - accuracy: 0.7455 - val_loss: 0.7626 - val_accuracy: 0.7445\n", + "Epoch 26/30\n", + "477/487 [============================>.] - ETA: 0s - loss: 0.7571 - accuracy: 0.7464\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00026: val_loss improved from 0.76259 to 0.76096, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00026: val_loss improved from 0.76259 to 0.76096, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00026: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00026: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.7574 - accuracy: 0.7463 - val_loss: 0.7610 - val_accuracy: 0.7449\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 27/30\n", + "473/487 [============================>.] - ETA: 0s - loss: 0.7556 - accuracy: 0.7467\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00027: val_loss improved from 0.76096 to 0.75936, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00027: val_loss improved from 0.76096 to 0.75936, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00027: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00027: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.7554 - accuracy: 0.7468 - val_loss: 0.7594 - val_accuracy: 0.7456\n", + "Epoch 28/30\n", + "486/487 [============================>.] - ETA: 0s - loss: 0.7538 - accuracy: 0.7473\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00028: val_loss improved from 0.75936 to 0.75812, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00028: val_loss improved from 0.75936 to 0.75812, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00028: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00028: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.7537 - accuracy: 0.7473 - val_loss: 0.7581 - val_accuracy: 0.7455\n", + "Epoch 29/30\n", + "472/487 [============================>.] - ETA: 0s - loss: 0.7521 - accuracy: 0.7477\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00029: val_loss improved from 0.75812 to 0.75593, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00029: val_loss improved from 0.75812 to 0.75593, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00029: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00029: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.7524 - accuracy: 0.7476 - val_loss: 0.7559 - val_accuracy: 0.7466\n", + "Epoch 30/30\n", + "476/487 [============================>.] - ETA: 0s - loss: 0.7508 - accuracy: 0.7480\n", + "***callbacks***\n", + "saving losses to model_3/losses.log\n", + "\n", + "Epoch 00030: val_loss improved from 0.75593 to 0.75478, saving model to model_3/KERAS_check_best_model.h5\n", + "\n", + "Epoch 00030: val_loss improved from 0.75593 to 0.75478, saving model to model_3/KERAS_check_best_model_weights.h5\n", + "\n", + "Epoch 00030: saving model to model_3/KERAS_check_model_last.h5\n", + "\n", + "Epoch 00030: saving model to model_3/KERAS_check_model_last_weights.h5\n", + "\n", + "Epoch 00030: saving model to model_3/KERAS_check_model_epoch30.h5\n", + "\n", + "***callbacks end***\n", + "\n", + "487/487 [==============================] - 2s 4ms/step - loss: 0.7506 - accuracy: 0.7481 - val_loss: 0.7548 - val_accuracy: 0.7471\n" + ] + } + ], + "source": [ + "train = True\n", + "if train:\n", + " adam = Adam(lr=0.0001)\n", + " model.compile(optimizer=adam, loss=['categorical_crossentropy'], metrics=['accuracy'])\n", + " callbacks = all_callbacks(stop_patience = 1000,\n", + " lr_factor = 0.5,\n", + " lr_patience = 10,\n", + " lr_epsilon = 0.000001,\n", + " lr_cooldown = 2,\n", + " lr_minimum = 0.0000001,\n", + " outputDir = 'model_3')\n", + " callbacks.callbacks.append(pruning_callbacks.UpdatePruningStep())\n", + " model.fit(X_train_val, y_train_val, batch_size=1024,\n", + " epochs=30, validation_split=0.25, shuffle=True,\n", + " callbacks = callbacks.callbacks)\n", + " # Save the model again but with the pruning 'stripped' to use the regular layer types\n", + " model = strip_pruning(model)\n", + " model.save('model_3/KERAS_check_best_model.h5')\n", + "else:\n", + " from tensorflow.keras.models import load_model\n", + " from qkeras.utils import _add_supported_quantized_objects\n", + " co = {}\n", + " _add_supported_quantized_objects(co)\n", + " model = load_model('model_3/KERAS_check_best_model.h5', custom_objects=co)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Check performance\n", + "How does this model which was trained using 6-bits, and 75% sparsity model compare against the original model? Let's report the accuracy and make a ROC curve. The quantized, pruned model is shown with solid lines, the unpruned model from part 1 is shown with dashed lines.\n", + "\n", + "\n", + "We should also check that hls4ml can respect the choice to use 6-bits throughout the model, and match the accuracy. We'll generate a configuration from this Quantized model, and plot its performance as the dotted line.\n", + "The generated configuration is printed out. You'll notice that it uses 7 bits for the type, but we specified 6!? That's just because QKeras doesn't count the sign-bit when we specify the number of bits, so the type that actually gets used needs 1 more.\n", + "\n", + "We also use the `OutputRoundingSaturationMode` optimizer pass of `hls4ml` to set the Activation layers to round, rather than truncate, the cast. This is important for getting good model accuracy when using small bit precision activations. And we'll set a different data type for the tables used in the Softmax, just for a bit of extra performance.\n", + "\n", + "\n", + "**Make sure you've trained the model from part 1**" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Interpreting Sequential\n", + "Topology:\n", + "Layer name: fc1_input, layer type: Input\n", + "Layer name: fc1, layer type: QDense\n", + "Layer name: relu1, layer type: QActivation\n", + "Layer name: fc2, layer type: QDense\n", + "Layer name: relu2, layer type: QActivation\n", + "Layer name: fc3, layer type: QDense\n", + "Layer name: relu3, layer type: QActivation\n", + "Layer name: output, layer type: QDense\n", + "Layer name: softmax, layer type: Activation\n", + "Interpreting Sequential\n", + "Topology:\n", + "Layer name: fc1_input, layer type: InputLayer, current shape: [[None, 16]]\n", + "Layer name: fc1, layer type: QDense, current shape: [[None, 16]]\n", + "Layer name: relu1, layer type: Activation, current shape: [[None, 64]]\n", + "Layer name: fc2, layer type: QDense, current shape: [[None, 64]]\n", + "Layer name: relu2, layer type: Activation, current shape: [[None, 32]]\n", + "Layer name: fc3, layer type: QDense, current shape: [[None, 32]]\n", + "Layer name: relu3, layer type: Activation, current shape: [[None, 32]]\n", + "Layer name: output, layer type: QDense, current shape: [[None, 32]]\n", + "Layer name: softmax, layer type: Softmax, current shape: [[None, 5]]\n", + "Creating HLS model\n", + "-----------------------------------\n", + "Model\n", + " Precision: ap_fixed<16,6>\n", + " ReuseFactor: 1\n", + " Strategy: Resource\n", + "-----------------------------------\n" + ] + } + ], + "source": [ + "import hls4ml\n", + "import plotting\n", + "'''\n", + "hls4ml.model.optimizer.OutputRoundingSaturationMode.layers = ['Activation']\n", + "hls4ml.model.optimizer.OutputRoundingSaturationMode.rounding_mode = 'AP_RND'\n", + "hls4ml.model.optimizer.OutputRoundingSaturationMode.saturation_mode = 'AP_SAT'\n", + "\n", + "config = hls4ml.utils.config_from_keras_model(model, granularity='name')\n", + "config['LayerName']['softmax']['exp_table_t'] = 'ap_fixed<18,8>'\n", + "config['LayerName']['softmax']['inv_table_t'] = 'ap_fixed<18,4>'\n", + "'''\n", + "config = hls4ml.utils.config_from_keras_model(model, granularity='model')\n", + "hls_model = hls4ml.converters.convert_from_keras_model(model,\n", + " hls_config=config,\n", + " output_dir='model_3/hls4ml_prj',\n", + " fpga_part='xcu250-figd2104-2L-e')\n", + "config['Model']['Strategy'] = \"Resource\"\n", + "print(\"-----------------------------------\")\n", + "plotting.print_dict(config)\n", + "print(\"-----------------------------------\")" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Writing HLS project\n", + "Done\n" + ] + } + ], + "source": [ + "hls_model.compile()\n", + "\n", + "y_qkeras = model.predict(np.ascontiguousarray(X_test))\n", + "y_hls = hls_model.predict(np.ascontiguousarray(X_test))" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy baseline: 0.7502530120481927\n", + "Accuracy pruned, quantized: 0.7456385542168674\n", + "Accuracy hls4ml: 0.6305783132530121\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "from sklearn.metrics import accuracy_score\n", + "from tensorflow.keras.models import load_model\n", + "\n", + "model_ref = load_model('model_1/KERAS_check_best_model.h5')\n", + "y_ref = model_ref.predict(X_test)\n", + "\n", + "print(\"Accuracy baseline: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_ref, axis=1))))\n", + "print(\"Accuracy pruned, quantized: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_qkeras, axis=1))))\n", + "print(\"Accuracy hls4ml: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_hls, axis=1))))\n", + "\n", + "fig, ax = plt.subplots(figsize=(9, 9))\n", + "_ = plotting.makeRoc(y_test, y_ref, classes)\n", + "plt.gca().set_prop_cycle(None) # reset the colors\n", + "_ = plotting.makeRoc(y_test, y_qkeras, classes, linestyle='--')\n", + "plt.gca().set_prop_cycle(None) # reset the colors\n", + "_ = plotting.makeRoc(y_test, y_hls, classes, linestyle=':')\n", + "\n", + "from matplotlib.lines import Line2D\n", + "lines = [Line2D([0], [0], ls='-'),\n", + " Line2D([0], [0], ls='--'),\n", + " Line2D([0], [0], ls=':')]\n", + "from matplotlib.legend import Legend\n", + "leg = Legend(ax, lines, labels=['baseline', 'pruned, quantized', 'hls4ml'],\n", + " loc='lower right', frameon=False)\n", + "ax.add_artist(leg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Synthesize\n", + "Now let's synthesize this quantized, pruned model.\n", + "\n", + "**The synthesis will take a while**\n", + "\n", + "While the C-Synthesis is running, we can monitor the progress looking at the log file by opening a terminal from the notebook home, and executing:\n", + "\n", + "`tail -f model_3/hls4ml_prj/vivado_hls.log`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "hls_model.build(csim=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Check the reports\n", + "Print out the reports generated by Vivado HLS. Pay attention to the Utilization Estimates' section in particular this time." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 1 solution(s) in model_3/hls4ml_prj/myproject_prj.\n", + "Reports for solution \"solution1\":\n", + "\n", + "C simulation report not found.\n", + "SYNTHESIS REPORT:\n", + "================================================================\n", + "== Vivado HLS Report for 'myproject'\n", + "================================================================\n", + "* Date: Thu Mar 4 12:27:48 2021\n", + "\n", + "* Version: 2019.2 (Build 2704478 on Wed Nov 06 22:10:23 MST 2019)\n", + "* Project: myproject_prj\n", + "* Solution: solution1\n", + "* Product family: virtexuplus\n", + "* Target device: xcu250-figd2104-2L-e\n", + "\n", + "\n", + "================================================================\n", + "== Performance Estimates\n", + "================================================================\n", + "+ Timing: \n", + " * Summary: \n", + " +--------+---------+----------+------------+\n", + " | Clock | Target | Estimated| Uncertainty|\n", + " +--------+---------+----------+------------+\n", + " |ap_clk | 5.00 ns | 3.965 ns | 0.62 ns |\n", + " +--------+---------+----------+------------+\n", + "\n", + "+ Latency: \n", + " * Summary: \n", + " +---------+---------+-----------+-----------+-----+-----+----------+\n", + " | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", + " | min | max | min | max | min | max | Type |\n", + " +---------+---------+-----------+-----------+-----+-----+----------+\n", + " | 9| 9| 45.000 ns | 45.000 ns | 1| 1| function |\n", + " +---------+---------+-----------+-----------+-----+-----+----------+\n", + "\n", + " + Detail: \n", + " * Instance: \n", + " +--------------------------------------------------------------------------------+---------------------------------------------------------------+---------+---------+-----------+-----------+-----+-----+----------+\n", + " | | | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", + " | Instance | Module | min | max | min | max | min | max | Type |\n", + " +--------------------------------------------------------------------------------+---------------------------------------------------------------+---------+---------+-----------+-----------+-----+-----+----------+\n", + " |call_ret2_dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_1_fu_123 |dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_1 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " |call_ret4_dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_s_fu_191 |dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_s | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " |call_ret_dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_2_fu_227 |dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_2 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " |call_ret1_relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config4_s_fu_233 |relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config4_s | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " |call_ret6_dense_latency_ap_fixed_ap_fixed_config11_0_0_0_0_0_0_fu_301 |dense_latency_ap_fixed_ap_fixed_config11_0_0_0_0_0_0 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " |call_ret3_relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config7_s_fu_328 |relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config7_s | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " |call_ret5_relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config10_s_fu_364 |relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config10_s | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", + " |grp_softmax_latency_ap_fixed_ap_fixed_softmax_config13_s_fu_391 |softmax_latency_ap_fixed_ap_fixed_softmax_config13_s | 2| 2| 10.000 ns | 10.000 ns | 1| 1| function |\n", + " +--------------------------------------------------------------------------------+---------------------------------------------------------------+---------+---------+-----------+-----------+-----+-----+----------+\n", + "\n", + " * Loop: \n", + " N/A\n", + "\n", + "\n", + "\n", + "================================================================\n", + "== Utilization Estimates\n", + "================================================================\n", + "* Summary: \n", + "+---------------------+---------+-------+---------+---------+------+\n", + "| Name | BRAM_18K| DSP48E| FF | LUT | URAM |\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|DSP | -| -| -| -| -|\n", + "|Expression | -| -| 0| 6| -|\n", + "|FIFO | -| -| -| -| -|\n", + "|Instance | 4| 132| 93| 34819| -|\n", + "|Memory | -| -| -| -| -|\n", + "|Multiplexer | -| -| -| 36| -|\n", + "|Register | -| -| 4156| -| -|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Total | 4| 132| 4249| 34861| 0|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Available SLR | 1344| 3072| 864000| 432000| 320|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Utilization SLR (%) | ~0 | 4| ~0 | 8| 0|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Available | 5376| 12288| 3456000| 1728000| 1280|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "|Utilization (%) | ~0 | 1| ~0 | 2| 0|\n", + "+---------------------+---------+-------+---------+---------+------+\n", + "\n", + "+ Detail: \n", + " * Instance: \n", + " +--------------------------------------------------------------------------------+---------------------------------------------------------------+---------+-------+----+-------+-----+\n", + " | Instance | Module | BRAM_18K| DSP48E| FF | LUT | URAM|\n", + " +--------------------------------------------------------------------------------+---------------------------------------------------------------+---------+-------+----+-------+-----+\n", + " |call_ret2_dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_1_fu_123 |dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_1 | 0| 46| 0| 14034| 0|\n", + " |call_ret_dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_2_fu_227 |dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_2 | 0| 25| 0| 7863| 0|\n", + " |call_ret4_dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_s_fu_191 |dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_s | 0| 48| 0| 8079| 0|\n", + " |call_ret6_dense_latency_ap_fixed_ap_fixed_config11_0_0_0_0_0_0_fu_301 |dense_latency_ap_fixed_ap_fixed_config11_0_0_0_0_0_0 | 0| 8| 0| 1433| 0|\n", + " |call_ret5_relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config10_s_fu_364 |relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config10_s | 0| 0| 0| 644| 0|\n", + " |call_ret1_relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config4_s_fu_233 |relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config4_s | 0| 0| 0| 1792| 0|\n", + " |call_ret3_relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config7_s_fu_328 |relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config7_s | 0| 0| 0| 896| 0|\n", + " |grp_softmax_latency_ap_fixed_ap_fixed_softmax_config13_s_fu_391 |softmax_latency_ap_fixed_ap_fixed_softmax_config13_s | 4| 5| 93| 78| 0|\n", + " +--------------------------------------------------------------------------------+---------------------------------------------------------------+---------+-------+----+-------+-----+\n", + " |Total | | 4| 132| 93| 34819| 0|\n", + " +--------------------------------------------------------------------------------+---------------------------------------------------------------+---------+-------+----+-------+-----+\n", + "\n", + "Co-simulation report not found.\n" + ] + } + ], + "source": [ + "hls4ml.report.read_vivado_report('model_3/hls4ml_prj')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Print the report for the model trained in part 1. Now, compared to the model from part 1, this model has been trained with low-precision quantization, and 75% pruning. You should be able to see that we have saved a lot of resource compared to where we started in part 1. At the same time, referring to the ROC curve above, the model performance is pretty much identical even with this drastic compression!\n", + "\n", + "**Note you need to have trained and synthesized the model from part 1**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "hls4ml.report.read_vivado_report('model_1/hls4ml_prj')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Print the report for the model trained in part 3. Both these models were trained with 75% sparsity, but the new model uses 6-bit precision as well. You can see how Vivado HLS has moved multiplication operations from DSPs into LUTs, reducing the \"critical\" resource usage.\n", + "\n", + "**Note you need to have trained and synthesized the model from part 3**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "hls4ml.report.read_vivado_report('model_2/hls4ml_prj')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## NB\n", + "Note as well that the Vivado HLS resource estimates tend to _overestimate_ LUTs, while generally estimating the DSPs correctly. Running the subsequent stages of FPGA compilation reveals the more realistic resource usage, You can run the next step, 'logic synthesis' with `hls_model.build(synth=True, vsynth=True)`, but we skipped it in this tutorial in the interest of time." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "hls_model.build(synth=True, vsynth=True)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/qconv2dbatchnorm_test/test_conv2dbatchnorm.py b/qconv2dbatchnorm_test/test_conv2dbatchnorm.py new file mode 100644 index 0000000000..11f1acc9f7 --- /dev/null +++ b/qconv2dbatchnorm_test/test_conv2dbatchnorm.py @@ -0,0 +1,175 @@ +import numpy as np +import random as rnd + +import tensorflow +from qkeras.utils import load_qmodel +from qkeras import QConv2DBatchnorm, QActivation, quantized_relu, QDense, quantized_bits, to_categorical, \ + QBatchNormalization, QConv2D +from tensorflow.keras.layers import * +from tensorflow.keras.models import Sequential, model_from_json +from tensorflow.keras.optimizers import Adam +from tensorflow.keras.regularizers import l1 + +import hls4ml +import yaml + +from notebooks.callbacks import all_callbacks + +from scipy.io import loadmat + +rnd.seed(42) +height = 32 +width = 32 +chan = 3 +input_shape = (height, width, chan) +num_classes = 5 +sparcity = 0. +int_bits = 6 + +model = Sequential() +model.add(Input(shape=input_shape)) +model.add(QConv2D(8, (3, 3), kernel_quantizer=quantized_bits(6, 0, alpha=1), + bias_quantizer=quantized_bits(6, 0, alpha=1), name='qconv2d')) +model.add((QBatchNormalization(name='qbatchnorm', beta_quantizer=quantized_bits(6, 0, alpha=1), + gamma_quantizer=quantized_bits(6, 0, alpha=1), + mean_quantizer=quantized_bits(6, 0, alpha=1), + variance_quantizer=quantized_bits(6, 0, alpha=1)))) +model.add(QActivation(activation=quantized_relu(6), name='relu1')) +model.add(QConv2DBatchnorm(16, (3, 3), kernel_quantizer=quantized_bits(6, 0, alpha=1), + bias_quantizer=quantized_bits(6, 0, alpha=1), name='qconv2dbatchnorm')) +model.add(QActivation(activation=quantized_relu(6), name='relu2')) +model.add(Flatten()) +model.add(QDense(10, name='output', + kernel_quantizer=quantized_bits(6, 0, alpha=1), bias_quantizer=quantized_bits(6, 0, alpha=1), + kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001))) +model.add(Activation(activation='softmax', name='softmax')) +print(model.summary()) + +''' +# Generate some weights with some sparcity +for layer in model.layers: + old_weights = layer.get_weights() + if len(old_weights) > 0: + new_weights = [] + for w in old_weights: + print(layer.name, w.shape) + n_zeros = 0 + if sparcity > 0: + n_zeros = int(sparcity * np.prod(w.shape)) + if n_zeros > 0: + zero_indices = rnd.sample(range(1, np.prod(w.shape)), n_zeros) + else: + zero_indices = [] + new_w = [] + for i in range(np.prod(w.shape)): + if i in zero_indices: + new_w.append(0) + else: + #new_w.append(rnd.randint(1, 2**(int_bits - 1))) + #new_w.append(rnd.randint(1, 10)) + new_w.append(rnd.uniform(1, 3)) + new_w = np.asarray(new_w).reshape(w.shape) + new_weights.append(new_w) + layer.set_weights(new_weights) +''' + +train = loadmat('svhndataset/train_32x32.mat') +train_img = np.array(train['X']) +train_label = train['y'] +train_img = np.moveaxis(train_img, -1, 0) +train_label[train_label == 10] = 0 +train_img = train_img / 255.0 + +train_label = to_categorical(train_label) + +train = False +if train: + adam = Adam(lr=0.0001) + model.compile(optimizer=adam, loss=['categorical_crossentropy'], metrics=['accuracy']) + callbacks = all_callbacks(stop_patience=1000, + lr_factor=0.5, + lr_patience=10, + lr_epsilon=0.000001, + lr_cooldown=2, + lr_minimum=0.0000001, + outputDir='model') + model.fit(train_img, train_label, batch_size=1024, + epochs=1, validation_split=0.25, shuffle=True, + callbacks=callbacks.callbacks) + model.save('model/KERAS_check_best_model.h5') +else: + model = load_qmodel('model/KERAS_check_best_model.h5') + +# Let's test it out +# np.random.seed(42) + +# predictions = model.predict(x) +# print(predictions.flatten()) +# Save it +model.save('dummy_conv2dbatchnorm.h5') +# model_json = model.to_json() +# with open("dummy_cnn.json", "w") as json_file: +# json_file.write(model_json) +# model.save_weights("dummy_cnn_weights.h5") +# Now hls4ml-ify it +yaml_config = {} + +# yaml_config['KerasH5'] = '/home/vloncar/work/CERN/FPGA/hls4ml/example-models/dummy_cnn/dummy_cnn.h5' +yaml_config['KerasModel'] = model +yaml_config['OutputDir'] = '/home/nicolo/CERN-working-dir/hls4ml/qconv2dbatchnorm_test/hls' +yaml_config['ProjectName'] = 'myproject' +yaml_config['XilinxPart'] = 'xcvu9p-flgb2104-2-e' +yaml_config['ClockPeriod'] = 5 +# yaml_config['IOType'] = 'io_parallel' +yaml_config['IOType'] = 'io_stream' +yaml_config['HLSConfig'] = { + 'Model': { + 'Precision': 'ap_fixed<16,6>', + 'ReuseFactor': 1, + 'Strategy': 'Resource' + }, + # 'LayerName': { + # 'conv2d_3': {'Strategy': 'Resource', 'ReuseFactor': 100}, + # 'conv2d_4': {'Strategy': 'Resource', 'ReuseFactor': 100}, + # 'conv2d_6': {'Strategy': 'Resource', 'ReuseFactor': 100}, + # 'conv2d_7': {'Strategy': 'Resource', 'ReuseFactor': 100}, + # 'conv2d_8': {'Strategy': 'Resource', 'ReuseFactor': 100}, + # } +} +# Convert it +config = hls4ml.utils.config.config_from_keras_model(model, granularity='name') +config['SkipOptimizers'] = ['FuseBatchNormalization'] +hls_model = hls4ml.converters.convert_from_keras_model(model, hls_config=config) +# hls_model = hls4ml.converters.keras_to_hls(yaml_config) +# Test it +np.random.seed(42) # We need this again +# x = np.random.rand(np.prod(model.input.shape[1:])).reshape(model.input.shape[1:]) +hls_model.write() +hls_model.compile() + +# x = np.random.rand(np.prod(input_shape)).reshape(input_shape) +x = np.ones(np.prod(input_shape)).reshape(input_shape) +x = np.expand_dims(x, axis=0) + +y = hls_model.predict(x) +y_ = model.predict(x) + +hls_weights = hls_model.graph.get('qconv2dbatchnorm').weights.get('weight').data_unquantized +mod_weights = model.layers[3].get_folded_weights()[0] + +hls_bias = hls_model.graph.get('qconv2dbatchnorm').weights.get('bias').data_unquantized +mod_bias = model.layers[3].get_folded_weights()[1] + +if tensorflow.equal(hls_weights, mod_weights).numpy().all(): + print('Weights OK!') + +if tensorflow.equal(hls_bias, mod_bias).numpy().all(): + print('Bias OK!') + +print(y) +print(y_) +# Build it +# report = hls_model.build(csim=True, synth=True, cosim=False, reset=True) +# hls4ml.report.read_vivado_report(yaml_config['OutputDir']) +# report = hls4ml.report.parse_vivado_report(yaml_config['OutputDir']) +# print(report) \ No newline at end of file From 0ae678d0bcec2fb21de8c25d2a1019605f113e92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ghielmetti?= Date: Mon, 8 Mar 2021 14:03:58 +0100 Subject: [PATCH 002/102] Added QConv2DBatchnorm support. --- hls4ml/model/hls_layers.py | 91 ++++++++++++++--------------- hls4ml/templates/vivado_template.py | 50 ++++++++-------- 2 files changed, 70 insertions(+), 71 deletions(-) diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index 1f82235ba5..4aed293d28 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -843,8 +843,7 @@ def initialize(self): self.set_attr('strategy', 'resource') if self.model.config.backend.name == 'Vivado': self.model.config.backend.set_closest_reuse_factor(self) - self.weights['weight'].data = np.transpose(self.weights['weight'].data, - axes=[3, 2, 0, 1]) # (H,W,C,F) => (F,C,H,W) + self.weights['weight'].data = np.transpose(self.weights['weight'].data, axes=[3, 2, 0, 1]) #(H,W,C,F) => (F,C,H,W) else: self.set_attr('strategy', 'latency') @@ -1838,51 +1837,51 @@ def _get_transforms_config(self, params): params['sublayer_configs'] = '\n'.join(sublayer_configs) layer_map = { - 'Input': Input, - 'InputLayer': Input, - 'Activation': Activation, - 'QActivation': Activation, - 'LeakyReLU': ParametrizedActivation, - 'ThresholdedReLU': ParametrizedActivation, - 'ELU': ParametrizedActivation, - 'PReLU': PReLU, - 'Softmax': Softmax, - 'Reshape': Reshape, - 'Dense': Dense, - 'BinaryDense': Dense, - 'TernaryDense': Dense, - 'QDense': Dense, - 'Conv1D': Conv1D, - 'QConv1D': Conv1D, - 'Conv2D': Conv2D, - 'BinaryConv2D': Conv2D, - 'QConv2D': Conv2D, - 'SeparableConv1D': SeparableConv1D, - 'SeparableConv2D': SeparableConv2D, - 'DepthwiseConv2D': DepthwiseConv2D, - 'BatchNormalization': BatchNormalization, - 'QBatchNormalization': BatchNormalization, - 'QConv2DBatchnorm': Conv2DBatchnorm, - 'MaxPooling1D': Pooling1D, - 'AveragePooling1D': Pooling1D, - 'MaxPooling2D': Pooling2D, - 'AveragePooling2D': Pooling2D, - 'GlobalMaxPooling1D': GlobalPooling1D, - 'GlobalAveragePooling1D': GlobalPooling1D, - 'GlobalMaxPooling2D': GlobalPooling2D, - 'GlobalAveragePooling2D': GlobalPooling2D, - 'ZeroPadding1D': ZeroPadding1D, - 'ZeroPadding2D': ZeroPadding2D, - 'Merge': Merge, - 'Dot': Dot, - 'Concatenate': Concatenate, - 'Resize': Resize, - 'UpSampling2D': Resize, - 'Transpose': Transpose, - 'GarNet': GarNet, - 'GarNetStack': GarNetStack, + 'Input' : Input, + 'InputLayer' : Input, + 'Activation' : Activation, + 'QActivation' : Activation, + 'LeakyReLU' : ParametrizedActivation, + 'ThresholdedReLU' : ParametrizedActivation, + 'ELU' : ParametrizedActivation, + 'PReLU' : PReLU, + 'Softmax' : Softmax, + 'Reshape' : Reshape, + 'Dense' : Dense, + 'BinaryDense' : Dense, + 'TernaryDense' : Dense, + 'QDense' : Dense, + 'Conv1D' : Conv1D, + 'QConv1D' : Conv1D, + 'Conv2D' : Conv2D, + 'BinaryConv2D' : Conv2D, + 'QConv2D' : Conv2D, + 'QConv2DBatchnorm' : Conv2DBatchnorm, + 'SeparableConv1D' : SeparableConv1D, + 'SeparableConv2D' : SeparableConv2D, + 'DepthwiseConv2D' : DepthwiseConv2D, + 'BatchNormalization' : BatchNormalization, + 'QBatchNormalization' : BatchNormalization, + 'MaxPooling1D' : Pooling1D, + 'AveragePooling1D' : Pooling1D, + 'MaxPooling2D' : Pooling2D, + 'AveragePooling2D' : Pooling2D, + 'GlobalMaxPooling1D' : GlobalPooling1D, + 'GlobalAveragePooling1D' : GlobalPooling1D, + 'GlobalMaxPooling2D' : GlobalPooling2D, + 'GlobalAveragePooling2D' : GlobalPooling2D, + 'ZeroPadding1D' : ZeroPadding1D, + 'ZeroPadding2D' : ZeroPadding2D, + 'Merge' : Merge, + 'Dot' : Dot, + 'Concatenate' : Concatenate, + 'Resize' : Resize, + 'UpSampling2D' : Resize, + 'Transpose' : Transpose, + 'GarNet' : GarNet, + 'GarNetStack' : GarNetStack, # TensorFlow-specific layers: - 'BiasAdd': BiasAdd, + 'BiasAdd' : BiasAdd, } def register_layer(name, clazz): diff --git a/hls4ml/templates/vivado_template.py b/hls4ml/templates/vivado_template.py index 530c0f0184..edd9d00bb4 100644 --- a/hls4ml/templates/vivado_template.py +++ b/hls4ml/templates/vivado_template.py @@ -402,32 +402,32 @@ class VivadoBackend(Backend): def __init__(self): super(VivadoBackend, self).__init__('Vivado') - self.register_templates('Dense', dense_function_template, dense_config_template, dense_include_list) - self.register_templates('BinaryDense' , dense_function_template, dense_config_template, dense_include_list) - self.register_templates('BatchNormalization' , batchnorm_function_template, batchnorm_config_template, batchnorm_include_list) - self.register_templates('Conv1D' , conv1d_function_template, [conv1d_config_template, conv_mult_config_template], conv1d_include_list) - self.register_templates('Conv2D' , conv2d_function_template, [conv2d_config_template, conv_mult_config_template], conv2d_include_list) + self.register_templates('Dense', dense_function_template, dense_config_template, dense_include_list) + self.register_templates('BinaryDense' , dense_function_template, dense_config_template, dense_include_list) + self.register_templates('BatchNormalization' , batchnorm_function_template, batchnorm_config_template, batchnorm_include_list) + self.register_templates('Conv1D' , conv1d_function_template, [conv1d_config_template, conv_mult_config_template], conv1d_include_list) + self.register_templates('Conv2D' , conv2d_function_template, [conv2d_config_template, conv_mult_config_template], conv2d_include_list) self.register_templates('Conv2DBatchnorm' , conv2dbatchnorm_function_template, [conv2dbatchnorm_config_template, conv_mult_config_template], conv2dbatchnorm_include_list) - self.register_templates('SeparableConv1D' , sepconv1d_function_template, [sepconv_config_template, conv1d_config_template, conv1d_config_template, conv_mult_config_template, conv_mult_config_template], sepconv1d_include_list) - self.register_templates('SeparableConv2D' , sepconv2d_function_template, [sepconv_config_template, conv2d_config_template, conv2d_config_template, conv_mult_config_template, conv_mult_config_template], sepconv2d_include_list) - self.register_templates('DepthwiseConv2D' , depthconv2d_function_template, [conv2d_config_template, conv_mult_config_template], sepconv2d_include_list) - self.register_templates('Activation' , activ_function_template, activ_config_template, activ_include_list) - self.register_templates('ParametrizedActivation' , param_activ_function_template, activ_config_template, activ_include_list) - self.register_templates('PReLU' , param_activ_function_template, activ_config_template, activ_include_list) - self.register_templates('Softmax' , activ_function_template, softmax_config_template, activ_include_list) - self.register_templates('Pooling1D' , pooling1d_function_template, pooling1d_config_template, pooling_include_list) - self.register_templates('Pooling2D' , pooling2d_function_template, pooling2d_config_template, pooling_include_list) - self.register_templates('GlobalPooling1D' , global_pooling1d_function_template,global_pooling1d_config_template, pooling_include_list) - self.register_templates('GlobalPooling2D' , global_pooling2d_function_template,global_pooling2d_config_template, pooling_include_list) - self.register_templates('ZeroPadding1D' , zeropad1d_function_template, zeropad1d_config_template, padding_include_list) - self.register_templates('ZeroPadding2D' , zeropad2d_function_template, zeropad2d_config_template, padding_include_list) - self.register_templates('Merge' , merge_function_template, merge_config_template, merge_include_list) - self.register_templates('Concatenate' , merge_function_template, concat_config_template, merge_include_list) - self.register_templates('Dot' , merge_function_template, dot_config_template, merge_include_list) - self.register_templates('Resize' , resize_function_template, resize_config_template, resize_include_list) - self.register_templates('Transpose' , transpose_function_template, transpose_config_template, transpose_include_list) - self.register_templates('GarNet' , garnet_function_template, garnet_config_template, garnet_include_list) - self.register_templates('GarNetStack' , garnet_stack_function_template, garnet_stack_config_template, garnet_include_list) + self.register_templates('SeparableConv1D' , sepconv1d_function_template, [sepconv_config_template, conv1d_config_template, conv1d_config_template, conv_mult_config_template, conv_mult_config_template], sepconv1d_include_list) + self.register_templates('SeparableConv2D' , sepconv2d_function_template, [sepconv_config_template, conv2d_config_template, conv2d_config_template, conv_mult_config_template, conv_mult_config_template], sepconv2d_include_list) + self.register_templates('DepthwiseConv2D' , depthconv2d_function_template, [conv2d_config_template, conv_mult_config_template], sepconv2d_include_list) + self.register_templates('Activation' , activ_function_template, activ_config_template, activ_include_list) + self.register_templates('ParametrizedActivation' , param_activ_function_template, activ_config_template, activ_include_list) + self.register_templates('PReLU' , param_activ_function_template, activ_config_template, activ_include_list) + self.register_templates('Softmax' , activ_function_template, softmax_config_template, activ_include_list) + self.register_templates('Pooling1D' , pooling1d_function_template, pooling1d_config_template, pooling_include_list) + self.register_templates('Pooling2D' , pooling2d_function_template, pooling2d_config_template, pooling_include_list) + self.register_templates('GlobalPooling1D' , global_pooling1d_function_template, global_pooling1d_config_template, pooling_include_list) + self.register_templates('GlobalPooling2D' , global_pooling2d_function_template, global_pooling2d_config_template, pooling_include_list) + self.register_templates('ZeroPadding1D' , zeropad1d_function_template, zeropad1d_config_template, padding_include_list) + self.register_templates('ZeroPadding2D' , zeropad2d_function_template, zeropad2d_config_template, padding_include_list) + self.register_templates('Merge' , merge_function_template, merge_config_template, merge_include_list) + self.register_templates('Concatenate' , merge_function_template, concat_config_template, merge_include_list) + self.register_templates('Dot' , merge_function_template, dot_config_template, merge_include_list) + self.register_templates('Resize' , resize_function_template, resize_config_template, resize_include_list) + self.register_templates('Transpose' , transpose_function_template, transpose_config_template, transpose_include_list) + self.register_templates('GarNet' , garnet_function_template, garnet_config_template, garnet_include_list) + self.register_templates('GarNetStack' , garnet_stack_function_template,garnet_stack_config_template, garnet_include_list) def get_valid_reuse_factors(self, layer): n_in = 0 From 08467661d003b92bdb032ea34e79fd268e12a526 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ghielmetti?= Date: Mon, 8 Mar 2021 14:22:42 +0100 Subject: [PATCH 003/102] Added support for QConv2DBatchnorm. --- notebooks/callbacks.py | 115 -- notebooks/part1_getting_started.ipynb | 1165 ----------------- notebooks/part2_advanced_config.ipynb | 973 -------------- notebooks/part3_compression.ipynb | 1100 ---------------- notebooks/part4_quantization.ipynb | 1082 --------------- qconv2dbatchnorm_test/test_conv2dbatchnorm.py | 175 --- 6 files changed, 4610 deletions(-) delete mode 100644 notebooks/callbacks.py delete mode 100644 notebooks/part1_getting_started.ipynb delete mode 100644 notebooks/part2_advanced_config.ipynb delete mode 100644 notebooks/part3_compression.ipynb delete mode 100644 notebooks/part4_quantization.ipynb delete mode 100644 qconv2dbatchnorm_test/test_conv2dbatchnorm.py diff --git a/notebooks/callbacks.py b/notebooks/callbacks.py deleted file mode 100644 index 2361ccc8ea..0000000000 --- a/notebooks/callbacks.py +++ /dev/null @@ -1,115 +0,0 @@ -''' -Created on 7 Apr 2017 - -@author: jkiesele -''' -from __future__ import print_function - -from tensorflow.keras.callbacks import Callback, EarlyStopping, History, ModelCheckpoint, TensorBoard, ReduceLROnPlateau -# loss per epoch -from time import time -from pdb import set_trace -import json - - -class newline_callbacks_begin(Callback): - - def __init__(self, outputDir): - self.outputDir = outputDir - self.loss = [] - self.val_loss = [] - self.full_logs = [] - - def on_epoch_end(self, epoch, epoch_logs={}): - import os - lossfile = os.path.join(self.outputDir, 'losses.log') - print('\n***callbacks***\nsaving losses to ' + lossfile) - self.loss.append(epoch_logs.get('loss')) - self.val_loss.append(epoch_logs.get('val_loss')) - f = open(lossfile, 'w') - for i in range(len(self.loss)): - f.write(str(self.loss[i])) - f.write(" ") - f.write(str(self.val_loss[i])) - f.write("\n") - f.close() - normed = {} - for vv in epoch_logs: - normed[vv] = float(epoch_logs[vv]) - self.full_logs.append(normed) - lossfile = os.path.join(self.outputDir, 'full_info.log') - with open(lossfile, 'w') as out: - out.write(json.dumps(self.full_logs)) - - -class newline_callbacks_end(Callback): - def on_epoch_end(self, epoch, epoch_logs={}): - print('\n***callbacks end***\n') - - -class Losstimer(Callback): - def __init__(self, every=5): - self.points = [] - self.every = every - - def on_train_begin(self, logs): - self.start = time() - - def on_batch_end(self, batch, logs): - if (batch % self.every) != 0: return - elapsed = time() - self.start - cop = {} - for i, j in logs.items(): - cop[i] = float(j) - cop['elapsed'] = elapsed - self.points.append(cop) - - -class all_callbacks(object): - def __init__(self, - stop_patience=10, - lr_factor=0.5, - lr_patience=1, - lr_epsilon=0.001, - lr_cooldown=4, - lr_minimum=1e-5, - outputDir=''): - self.nl_begin = newline_callbacks_begin(outputDir) - self.nl_end = newline_callbacks_end() - - self.stopping = EarlyStopping(monitor='val_loss', - patience=stop_patience, - verbose=1, mode='min') - - self.reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=lr_factor, patience=lr_patience, - mode='min', verbose=1, epsilon=lr_epsilon, - cooldown=lr_cooldown, min_lr=lr_minimum) - - self.modelbestcheck = ModelCheckpoint(outputDir + "/KERAS_check_best_model.h5", - monitor='val_loss', verbose=1, - save_best_only=True) - - self.modelbestcheckweights = ModelCheckpoint(outputDir + "/KERAS_check_best_model_weights.h5", - monitor='val_loss', verbose=1, - save_best_only=True, save_weights_only=True) - - self.modelcheckperiod = ModelCheckpoint(outputDir + "/KERAS_check_model_epoch{epoch:02d}.h5", verbose=1, - period=10) - - self.modelcheck = ModelCheckpoint(outputDir + "/KERAS_check_model_last.h5", verbose=1) - - self.modelcheckweights = ModelCheckpoint(outputDir + "/KERAS_check_model_last_weights.h5", verbose=1, - save_weights_only=True) - - self.tb = TensorBoard(log_dir=outputDir + '/logs') - - self.history = History() - self.timer = Losstimer() - - self.callbacks = [ - self.nl_begin, - self.modelbestcheck, self.modelbestcheckweights, self.modelcheck, self.modelcheckweights, - self.modelcheckperiod, - self.reduce_lr, self.stopping, self.nl_end, self.tb, self.history, - self.timer - ] diff --git a/notebooks/part1_getting_started.ipynb b/notebooks/part1_getting_started.ipynb deleted file mode 100644 index f9155c6f13..0000000000 --- a/notebooks/part1_getting_started.ipynb +++ /dev/null @@ -1,1165 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Part 1: Getting started" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.utils import to_categorical\n", - "from sklearn.datasets import fetch_openml\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.preprocessing import LabelEncoder, StandardScaler\n", - "import numpy as np\n", - "%matplotlib inline\n", - "seed = 0\n", - "np.random.seed(seed)\n", - "import tensorflow as tf\n", - "tf.random.set_seed(seed)\n", - "import os\n", - "os.environ['PATH'] = '/tools/Xilinx/Vivado/2019.2/bin:' + os.environ['PATH']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Fetch the jet tagging dataset from Open ML" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "data = fetch_openml('hls4ml_lhc_jets_hlf')\n", - "X, y = data['data'], data['target']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Let's print some information about the dataset\n", - "Print the feature names and the dataset shape" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['zlogz', 'c1_b0_mmdt', 'c1_b1_mmdt', 'c1_b2_mmdt', 'c2_b1_mmdt', 'c2_b2_mmdt', 'd2_b1_mmdt', 'd2_b2_mmdt', 'd2_a1_b1_mmdt', 'd2_a1_b2_mmdt', 'm2_b1_mmdt', 'm2_b2_mmdt', 'n2_b1_mmdt', 'n2_b2_mmdt', 'mass_mmdt', 'multiplicity']\n", - "(830000, 16) (830000,)\n", - " zlogz c1_b0_mmdt c1_b1_mmdt c1_b2_mmdt c2_b1_mmdt c2_b2_mmdt \\\n", - "0 -2.935125 0.383155 0.005126 0.000084 0.009070 0.000179 \n", - "1 -1.927335 0.270699 0.001585 0.000011 0.003232 0.000029 \n", - "2 -3.112147 0.458171 0.097914 0.028588 0.124278 0.038487 \n", - "3 -2.666515 0.437068 0.049122 0.007978 0.047477 0.004802 \n", - "4 -2.484843 0.428981 0.041786 0.006110 0.023066 0.001123 \n", - "\n", - " d2_b1_mmdt d2_b2_mmdt d2_a1_b1_mmdt d2_a1_b2_mmdt m2_b1_mmdt \\\n", - "0 1.769445 2.123898 1.769445 0.308185 0.135687 \n", - "1 2.038834 2.563099 2.038834 0.211886 0.063729 \n", - "2 1.269254 1.346238 1.269254 0.246488 0.115636 \n", - "3 0.966505 0.601864 0.966505 0.160756 0.082196 \n", - "4 0.552002 0.183821 0.552002 0.084338 0.048006 \n", - "\n", - " m2_b2_mmdt n2_b1_mmdt n2_b2_mmdt mass_mmdt multiplicity \n", - "0 0.083278 0.412136 0.299058 8.926882 75.0 \n", - "1 0.036310 0.310217 0.226661 3.886512 31.0 \n", - "2 0.079094 0.357559 0.289220 162.144669 61.0 \n", - "3 0.033311 0.238871 0.094516 91.258934 39.0 \n", - "4 0.014450 0.141906 0.036665 79.725777 35.0 \n", - "0 g\n", - "1 w\n", - "2 t\n", - "3 z\n", - "4 w\n", - "Name: class, dtype: category\n", - "Categories (5, object): ['g', 'q', 'w', 'z', 't']\n" - ] - } - ], - "source": [ - "print(data['feature_names'])\n", - "print(X.shape, y.shape)\n", - "print(X[:5])\n", - "print(y[:5])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As you saw above, the `y` target is an array of strings, e.g. \\['g', 'w',...\\] etc.\n", - "We need to make this a \"One Hot\" encoding for the training.\n", - "Then, split the dataset into training and validation sets" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[1. 0. 0. 0. 0.]\n", - " [0. 0. 0. 1. 0.]\n", - " [0. 0. 1. 0. 0.]\n", - " [0. 0. 0. 0. 1.]\n", - " [0. 0. 0. 1. 0.]]\n" - ] - } - ], - "source": [ - "le = LabelEncoder()\n", - "y = le.fit_transform(y)\n", - "y = to_categorical(y, 5)\n", - "X_train_val, X_test, y_train_val, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", - "print(y[:5])" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "scaler = StandardScaler()\n", - "X_train_val = scaler.fit_transform(X_train_val)\n", - "X_test = scaler.transform(X_test)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "np.save('X_train_val.npy', X_train_val)\n", - "np.save('X_test.npy', X_test)\n", - "np.save('y_train_val.npy', y_train_val)\n", - "np.save('y_test.npy', y_test)\n", - "np.save('classes.npy', le.classes_)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Now construct a model\n", - "We'll use 3 hidden layers with 64, then 32, then 32 neurons. Each layer will use `relu` activation.\n", - "Add an output layer with 5 neurons (one for each class), then finish with Softmax activation." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.models import Sequential\n", - "from tensorflow.keras.layers import Dense, Activation, BatchNormalization\n", - "from tensorflow.keras.optimizers import Adam\n", - "from tensorflow.keras.regularizers import l1\n", - "from callbacks import all_callbacks" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "model = Sequential()\n", - "model.add(Dense(64, input_shape=(16,), name='fc1', kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", - "model.add(Activation(activation='relu', name='relu1'))\n", - "model.add(Dense(32, name='fc2', kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", - "model.add(Activation(activation='relu', name='relu2'))\n", - "model.add(Dense(32, name='fc3', kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", - "model.add(Activation(activation='relu', name='relu3'))\n", - "model.add(Dense(5, name='output', kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", - "model.add(Activation(activation='softmax', name='softmax'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Train the model\n", - "We'll use Adam optimizer with categorical crossentropy loss.\n", - "The callbacks will decay the learning rate and save the model into a directory 'model_1'\n", - "The model isn't very complex, so this should just take a few minutes even on the CPU.\n", - "If you've restarted the notebook kernel after training once, set `train = False` to load the trained model." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WARNING:tensorflow:`epsilon` argument is deprecated and will be removed, use `min_delta` instead.\n", - "WARNING:tensorflow:`period` argument is deprecated. Please use `save_freq` to specify the frequency in number of batches seen.\n", - "Epoch 1/30\n", - " 3/487 [..............................] - ETA: 1:16 - loss: 1.6385 - accuracy: 0.2988\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bWARNING:tensorflow:Callback method `on_train_batch_begin` is slow compared to the batch time (batch time: 0.0016s vs `on_train_batch_begin` time: 0.0228s). Check your callbacks.\n", - "WARNING:tensorflow:Callback method `on_train_batch_end` is slow compared to the batch time (batch time: 0.0016s vs `on_train_batch_end` time: 0.0295s). Check your callbacks.\n", - "487/487 [==============================] - 2s 3ms/step - loss: 1.4710 - accuracy: 0.4208 - val_loss: 1.1251 - val_accuracy: 0.6363\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00001: val_loss improved from inf to 1.12515, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00001: val_loss improved from inf to 1.12515, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00001: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00001: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 2/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 1.0855 - accuracy: 0.6526 - val_loss: 1.0071 - val_accuracy: 0.6900\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00002: val_loss improved from 1.12515 to 1.00706, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00002: val_loss improved from 1.12515 to 1.00706, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00002: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00002: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 3/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.9876 - accuracy: 0.6948 - val_loss: 0.9450 - val_accuracy: 0.7098\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00003: val_loss improved from 1.00706 to 0.94500, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00003: val_loss improved from 1.00706 to 0.94500, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00003: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00003: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 4/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.9303 - accuracy: 0.7120 - val_loss: 0.9005 - val_accuracy: 0.7187\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00004: val_loss improved from 0.94500 to 0.90048, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00004: val_loss improved from 0.94500 to 0.90048, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00004: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00004: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 5/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.8871 - accuracy: 0.7203 - val_loss: 0.8725 - val_accuracy: 0.7242\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00005: val_loss improved from 0.90048 to 0.87249, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00005: val_loss improved from 0.90048 to 0.87249, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00005: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00005: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 6/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.8628 - accuracy: 0.7253 - val_loss: 0.8548 - val_accuracy: 0.7273\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00006: val_loss improved from 0.87249 to 0.85481, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00006: val_loss improved from 0.87249 to 0.85481, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00006: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00006: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 7/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.8474 - accuracy: 0.7288 - val_loss: 0.8419 - val_accuracy: 0.7306\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00007: val_loss improved from 0.85481 to 0.84187, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00007: val_loss improved from 0.85481 to 0.84187, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00007: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00007: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 8/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.8350 - accuracy: 0.7312 - val_loss: 0.8322 - val_accuracy: 0.7325\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00008: val_loss improved from 0.84187 to 0.83221, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00008: val_loss improved from 0.84187 to 0.83221, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00008: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00008: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 9/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.8249 - accuracy: 0.7341 - val_loss: 0.8237 - val_accuracy: 0.7347\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00009: val_loss improved from 0.83221 to 0.82370, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00009: val_loss improved from 0.83221 to 0.82370, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00009: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00009: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 10/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.8164 - accuracy: 0.7361 - val_loss: 0.8161 - val_accuracy: 0.7368\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00010: val_loss improved from 0.82370 to 0.81606, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00010: val_loss improved from 0.82370 to 0.81606, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00010: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00010: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "Epoch 00010: saving model to model_1/KERAS_check_model_epoch10.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 11/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.8095 - accuracy: 0.7384 - val_loss: 0.8099 - val_accuracy: 0.7381\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00011: val_loss improved from 0.81606 to 0.80993, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00011: val_loss improved from 0.81606 to 0.80993, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00011: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00011: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 12/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.8027 - accuracy: 0.7404 - val_loss: 0.8039 - val_accuracy: 0.7401\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00012: val_loss improved from 0.80993 to 0.80386, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00012: val_loss improved from 0.80993 to 0.80386, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00012: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00012: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 13/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7990 - accuracy: 0.7407 - val_loss: 0.7988 - val_accuracy: 0.7415\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00013: val_loss improved from 0.80386 to 0.79877, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00013: val_loss improved from 0.80386 to 0.79877, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00013: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00013: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 14/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7939 - accuracy: 0.7429 - val_loss: 0.7947 - val_accuracy: 0.7424\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00014: val_loss improved from 0.79877 to 0.79470, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00014: val_loss improved from 0.79877 to 0.79470, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00014: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00014: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 15/30\n", - "487/487 [==============================] - 1s 3ms/step - loss: 0.7910 - accuracy: 0.7428 - val_loss: 0.7909 - val_accuracy: 0.7435\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00015: val_loss improved from 0.79470 to 0.79094, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00015: val_loss improved from 0.79470 to 0.79094, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00015: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00015: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 16/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7854 - accuracy: 0.7443 - val_loss: 0.7876 - val_accuracy: 0.7440\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00016: val_loss improved from 0.79094 to 0.78761, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00016: val_loss improved from 0.79094 to 0.78761, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00016: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00016: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 17/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7829 - accuracy: 0.7460 - val_loss: 0.7849 - val_accuracy: 0.7452\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00017: val_loss improved from 0.78761 to 0.78491, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00017: val_loss improved from 0.78761 to 0.78491, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00017: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00017: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 18/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7800 - accuracy: 0.7465 - val_loss: 0.7819 - val_accuracy: 0.7462\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00018: val_loss improved from 0.78491 to 0.78187, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00018: val_loss improved from 0.78491 to 0.78187, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00018: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00018: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 19/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7792 - accuracy: 0.7465 - val_loss: 0.7797 - val_accuracy: 0.7464\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00019: val_loss improved from 0.78187 to 0.77973, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00019: val_loss improved from 0.78187 to 0.77973, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00019: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00019: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 20/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7735 - accuracy: 0.7487 - val_loss: 0.7773 - val_accuracy: 0.7472\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00020: val_loss improved from 0.77973 to 0.77729, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00020: val_loss improved from 0.77973 to 0.77729, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00020: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00020: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "Epoch 00020: saving model to model_1/KERAS_check_model_epoch20.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 21/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7721 - accuracy: 0.7481 - val_loss: 0.7752 - val_accuracy: 0.7478\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00021: val_loss improved from 0.77729 to 0.77517, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00021: val_loss improved from 0.77729 to 0.77517, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00021: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00021: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 22/30\n", - "487/487 [==============================] - 1s 3ms/step - loss: 0.7722 - accuracy: 0.7485 - val_loss: 0.7734 - val_accuracy: 0.7484\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00022: val_loss improved from 0.77517 to 0.77345, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00022: val_loss improved from 0.77517 to 0.77345, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00022: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00022: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 23/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7684 - accuracy: 0.7492 - val_loss: 0.7716 - val_accuracy: 0.7487\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00023: val_loss improved from 0.77345 to 0.77156, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00023: val_loss improved from 0.77345 to 0.77156, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00023: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00023: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 24/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7663 - accuracy: 0.7497 - val_loss: 0.7696 - val_accuracy: 0.7493\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00024: val_loss improved from 0.77156 to 0.76961, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00024: val_loss improved from 0.77156 to 0.76961, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00024: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00024: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 25/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7625 - accuracy: 0.7509 - val_loss: 0.7680 - val_accuracy: 0.7493\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00025: val_loss improved from 0.76961 to 0.76797, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00025: val_loss improved from 0.76961 to 0.76797, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00025: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00025: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 26/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7623 - accuracy: 0.7504 - val_loss: 0.7664 - val_accuracy: 0.7500\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00026: val_loss improved from 0.76797 to 0.76638, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00026: val_loss improved from 0.76797 to 0.76638, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00026: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00026: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 27/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7579 - accuracy: 0.7526 - val_loss: 0.7648 - val_accuracy: 0.7501\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00027: val_loss improved from 0.76638 to 0.76477, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00027: val_loss improved from 0.76638 to 0.76477, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00027: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00027: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 28/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7565 - accuracy: 0.7523 - val_loss: 0.7636 - val_accuracy: 0.7508\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00028: val_loss improved from 0.76477 to 0.76365, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00028: val_loss improved from 0.76477 to 0.76365, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00028: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00028: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 29/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7588 - accuracy: 0.7514 - val_loss: 0.7618 - val_accuracy: 0.7511\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00029: val_loss improved from 0.76365 to 0.76181, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00029: val_loss improved from 0.76365 to 0.76181, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00029: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00029: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "Epoch 30/30\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7571 - accuracy: 0.7517 - val_loss: 0.7603 - val_accuracy: 0.7514\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "\n", - "***callbacks***\n", - "saving losses to model_1/losses.log\n", - "\n", - "Epoch 00030: val_loss improved from 0.76181 to 0.76032, saving model to model_1/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00030: val_loss improved from 0.76181 to 0.76032, saving model to model_1/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00030: saving model to model_1/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00030: saving model to model_1/KERAS_check_model_last_weights.h5\n", - "\n", - "Epoch 00030: saving model to model_1/KERAS_check_model_epoch30.h5\n", - "\n", - "***callbacks end***\n", - "\n" - ] - } - ], - "source": [ - "train = True\n", - "if train:\n", - " adam = Adam(lr=0.0001)\n", - " model.compile(optimizer=adam, loss=['categorical_crossentropy'], metrics=['accuracy'])\n", - " callbacks = all_callbacks(stop_patience = 1000,\n", - " lr_factor = 0.5,\n", - " lr_patience = 10,\n", - " lr_epsilon = 0.000001,\n", - " lr_cooldown = 2,\n", - " lr_minimum = 0.0000001,\n", - " outputDir = 'model_1')\n", - " model.fit(X_train_val, y_train_val, batch_size=1024,\n", - " epochs=30, validation_split=0.25, shuffle=True,\n", - " callbacks = callbacks.callbacks)\n", - "else:\n", - " from tensorflow.keras.models import load_model\n", - " model = load_model('model_1/KERAS_check_best_model.h5')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Check performance\n", - "Check the accuracy and make a ROC curve" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Accuracy: 0.7502530120481927\n" - ] - }, - { - "data": { - "text/plain": "
", - "image/png": "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\n" - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "import plotting\n", - "import matplotlib.pyplot as plt\n", - "from sklearn.metrics import accuracy_score\n", - "y_keras = model.predict(X_test)\n", - "print(\"Accuracy: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_keras, axis=1))))\n", - "plt.figure(figsize=(9,9))\n", - "_ = plotting.makeRoc(y_test, y_keras, le.classes_)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Convert the model to FPGA firmware with hls4ml\n", - "Now we will go through the steps to convert the model we trained to a low-latency optimized FPGA firmware with hls4ml.\n", - "First, we will evaluate its classification performance to make sure we haven't lost accuracy using the fixed-point data types. \n", - "Then we will synthesize the model with Vivado HLS and check the metrics of latency and FPGA resource usage.\n", - "\n", - "## Make an hls4ml config & model\n", - "The hls4ml Neural Network inference library is controlled through a configuration dictionary.\n", - "In this example we'll use the most simple variation, later exercises will look at more advanced configuration." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Interpreting Sequential\n", - "Topology:\n", - "Layer name: fc1_input, layer type: Input\n", - "Layer name: fc1, layer type: Dense\n", - " -> Activation (linear), layer name: fc1\n", - "Layer name: relu1, layer type: Activation\n", - "Layer name: fc2, layer type: Dense\n", - " -> Activation (linear), layer name: fc2\n", - "Layer name: relu2, layer type: Activation\n", - "Layer name: fc3, layer type: Dense\n", - " -> Activation (linear), layer name: fc3\n", - "Layer name: relu3, layer type: Activation\n", - "Layer name: output, layer type: Dense\n", - " -> Activation (linear), layer name: output\n", - "Layer name: softmax, layer type: Activation\n", - "-----------------------------------\n", - "Configuration\n", - "Model\n", - " Precision: ap_fixed<16,6>\n", - " ReuseFactor: 1\n", - " Strategy: Latency\n", - "-----------------------------------\n", - "Interpreting Sequential\n", - "Topology:\n", - "Layer name: fc1_input, layer type: InputLayer, current shape: [[None, 16]]\n", - "Layer name: fc1, layer type: Dense, current shape: [[None, 16]]\n", - "Layer name: relu1, layer type: Activation, current shape: [[None, 64]]\n", - "Layer name: fc2, layer type: Dense, current shape: [[None, 64]]\n", - "Layer name: relu2, layer type: Activation, current shape: [[None, 32]]\n", - "Layer name: fc3, layer type: Dense, current shape: [[None, 32]]\n", - "Layer name: relu3, layer type: Activation, current shape: [[None, 32]]\n", - "Layer name: output, layer type: Dense, current shape: [[None, 32]]\n", - "Layer name: softmax, layer type: Softmax, current shape: [[None, 5]]\n", - "Creating HLS model\n" - ] - } - ], - "source": [ - "import hls4ml\n", - "config = hls4ml.utils.config_from_keras_model(model, granularity='model')\n", - "print(\"-----------------------------------\")\n", - "print(\"Configuration\")\n", - "plotting.print_dict(config)\n", - "print(\"-----------------------------------\")\n", - "hls_model = hls4ml.converters.convert_from_keras_model(model,\n", - " hls_config=config,\n", - " output_dir='model_1/hls4ml_prj',\n", - " fpga_part='xcu250-figd2104-2L-e')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's visualise what we created. The model architecture is shown, annotated with the shape and data types" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": "" - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "hls4ml.utils.plot_model(hls_model, show_shapes=True, show_precision=True, to_file=None)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Compile, predict\n", - "Now we need to check that this model performance is still good. We compile the hls_model, and then use `hls_model.predict` to execute the FPGA firmware with bit-accurate emulation on the CPU." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing HLS project\n", - "Done\n" - ] - } - ], - "source": [ - "hls_model.compile()\n", - "y_hls = hls_model.predict(np.ascontiguousarray(X_test))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Compare\n", - "That was easy! Now let's see how the performance compares to Keras:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Keras Accuracy: 0.7502530120481927\n", - "hls4ml Accuracy: 0.7503373493975903\n" - ] - }, - { - "data": { - "text/plain": "" - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "text/plain": "
", - "image/png": "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\n" - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "print(\"Keras Accuracy: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_keras, axis=1))))\n", - "print(\"hls4ml Accuracy: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_hls, axis=1))))\n", - "\n", - "fig, ax = plt.subplots(figsize=(9, 9))\n", - "_ = plotting.makeRoc(y_test, y_keras, le.classes_)\n", - "plt.gca().set_prop_cycle(None) # reset the colors\n", - "_ = plotting.makeRoc(y_test, y_hls, le.classes_, linestyle='--')\n", - "\n", - "from matplotlib.lines import Line2D\n", - "lines = [Line2D([0], [0], ls='-'),\n", - " Line2D([0], [0], ls='--')]\n", - "from matplotlib.legend import Legend\n", - "leg = Legend(ax, lines, labels=['keras', 'hls4ml'],\n", - " loc='lower right', frameon=False)\n", - "ax.add_artist(leg)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Synthesize\n", - "Now we'll actually use Vivado HLS to synthesize the model. We can run the build using a method of our `hls_model` object.\n", - "After running this step, we can integrate the generated IP into a workflow to compile for a specific FPGA board.\n", - "In this case, we'll just review the reports that Vivado HLS generates, checking the latency and resource usage.\n", - "\n", - "**This can take several minutes.**\n", - "\n", - "While the C-Synthesis is running, we can monitor the progress looking at the log file by opening a terminal from the notebook home, and executing:\n", - "\n", - "`tail -f model_1/hls4ml_prj/vivado_hls.log`" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": "{'EstimatedClockPeriod': '4.046',\n 'BestLatency': '10',\n 'WorstLatency': '10',\n 'IntervalMin': '1',\n 'IntervalMax': '1',\n 'BRAM_18K': '4',\n 'DSP48E': '2777',\n 'FF': '13315',\n 'LUT': '109274',\n 'URAM': '0',\n 'AvailableBRAM_18K': '5376',\n 'AvailableDSP48E': '12288',\n 'AvailableFF': '3456000',\n 'AvailableLUT': '1728000',\n 'AvailableURAM': '1280'}" - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "hls_model.build(csim=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Check the reports\n", - "Print out the reports generated by Vivado HLS. Pay attention to the Latency and the 'Utilization Estimates' sections" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Found 1 solution(s) in model_1/hls4ml_prj//myproject_prj.\n", - "Reports for solution \"solution1\":\n", - "\n", - "C simulation report not found.\n", - "SYNTHESIS REPORT:\n", - "================================================================\n", - "== Vivado HLS Report for 'myproject'\n", - "================================================================\n", - "* Date: Tue Mar 2 09:31:37 2021\n", - "\n", - "* Version: 2019.2 (Build 2704478 on Wed Nov 06 22:10:23 MST 2019)\n", - "* Project: myproject_prj\n", - "* Solution: solution1\n", - "* Product family: virtexuplus\n", - "* Target device: xcu250-figd2104-2L-e\n", - "\n", - "\n", - "================================================================\n", - "== Performance Estimates\n", - "================================================================\n", - "+ Timing: \n", - " * Summary: \n", - " +--------+---------+----------+------------+\n", - " | Clock | Target | Estimated| Uncertainty|\n", - " +--------+---------+----------+------------+\n", - " |ap_clk | 5.00 ns | 3.883 ns | 0.62 ns |\n", - " +--------+---------+----------+------------+\n", - "\n", - "+ Latency: \n", - " * Summary: \n", - " +---------+---------+-----------+-----------+-----+-----+----------+\n", - " | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", - " | min | max | min | max | min | max | Type |\n", - " +---------+---------+-----------+-----------+-----+-----+----------+\n", - " | 9| 9| 45.000 ns | 45.000 ns | 1| 1| function |\n", - " +---------+---------+-----------+-----------+-----+-----+----------+\n", - "\n", - " + Detail: \n", - " * Instance: \n", - " +----------------------------------+-----------------------+---------+---------+----------+----------+-----+-----+----------+\n", - " | | | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", - " | Instance | Module | min | max | min | max | min | max | Type |\n", - " +----------------------------------+-----------------------+---------+---------+----------+----------+-----+-----+----------+\n", - " |grp_dense_latency_0_0_0_1_fu_215 |dense_latency_0_0_0_1 | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", - " |grp_dense_latency_0_0_0_s_fu_283 |dense_latency_0_0_0_s | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", - " |grp_dense_latency_0_0_0_2_fu_319 |dense_latency_0_0_0_2 | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", - " |grp_dense_latency_0_0_0_3_fu_325 |dense_latency_0_0_0_3 | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", - " |call_ret1_relu_1_fu_361 |relu_1 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " |call_ret3_relu_fu_429 |relu | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " |call_ret5_relu_2_fu_465 |relu_2 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " +----------------------------------+-----------------------+---------+---------+----------+----------+-----+-----+----------+\n", - "\n", - " * Loop: \n", - " N/A\n", - "\n", - "\n", - "\n", - "================================================================\n", - "== Utilization Estimates\n", - "================================================================\n", - "* Summary: \n", - "+---------------------+---------+-------+---------+---------+------+\n", - "| Name | BRAM_18K| DSP48E| FF | LUT | URAM |\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|DSP | -| 5| -| -| -|\n", - "|Expression | -| -| 0| 78| -|\n", - "|FIFO | -| -| -| -| -|\n", - "|Instance | -| 3906| 24516| 78553| -|\n", - "|Memory | 4| -| 0| 0| -|\n", - "|Multiplexer | -| -| -| 36| -|\n", - "|Register | -| -| 2405| -| -|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Total | 4| 3911| 26921| 78667| 0|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Available SLR | 1344| 3072| 864000| 432000| 320|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Utilization SLR (%) | ~0 | 127| 3| 18| 0|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Available | 5376| 12288| 3456000| 1728000| 1280|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Utilization (%) | ~0 | 31| ~0 | 4| 0|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "\n", - "+ Detail: \n", - " * Instance: \n", - " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", - " | Instance | Module | BRAM_18K| DSP48E| FF | LUT | URAM|\n", - " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", - " |grp_dense_latency_0_0_0_1_fu_215 |dense_latency_0_0_0_1 | 0| 1859| 11265| 35856| 0|\n", - " |grp_dense_latency_0_0_0_2_fu_319 |dense_latency_0_0_0_2 | 0| 982| 6145| 18240| 0|\n", - " |grp_dense_latency_0_0_0_3_fu_325 |dense_latency_0_0_0_3 | 0| 157| 961| 2825| 0|\n", - " |grp_dense_latency_0_0_0_s_fu_283 |dense_latency_0_0_0_s | 0| 908| 6145| 18048| 0|\n", - " |call_ret3_relu_fu_429 |relu | 0| 0| 0| 896| 0|\n", - " |call_ret1_relu_1_fu_361 |relu_1 | 0| 0| 0| 1792| 0|\n", - " |call_ret5_relu_2_fu_465 |relu_2 | 0| 0| 0| 896| 0|\n", - " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", - " |Total | | 0| 3906| 24516| 78553| 0|\n", - " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", - "\n" - ] - } - ], - "source": [ - "hls4ml.report.read_vivado_report('model_1/hls4ml_prj/')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "## Exercise\n", - "Since `ReuseFactor = 1` we expect each multiplication used in the inference of our neural network to use 1 DSP. Is this what we see? (Note that the Softmax layer should use 5 DSPs, or 1 per class)\n", - "Calculate how many multiplications are performed for the inference of this network...\n", - "(We'll discuss the outcome)\n", - "#### Tentative solution\n", - "```\n", - " ________________________________________\n", - "| DSP usage | |\n", - "|-------------------------------------- |\n", - "| Expected: | 16x64+64x32+32x32+5 = 4101 |\n", - "|-------------------------------------- |\n", - "| Obtained: | 3911 |\n", - "| _______________________________________\n", - "```\n", - "Some DSPs are removed; why? Something that is constant is moved to LUTs (like tables for activation functions)?\n", - "Casting to ap_fixed types maybe can lead to sort of \"unintended\" pruning?" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.8" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} \ No newline at end of file diff --git a/notebooks/part2_advanced_config.ipynb b/notebooks/part2_advanced_config.ipynb deleted file mode 100644 index f64d512a0f..0000000000 --- a/notebooks/part2_advanced_config.ipynb +++ /dev/null @@ -1,973 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Part 2: Advanced Configuration" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.utils import to_categorical\n", - "from sklearn.datasets import fetch_openml\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.preprocessing import LabelEncoder, StandardScaler\n", - "from sklearn.metrics import accuracy_score\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "%matplotlib inline\n", - "import plotting\n", - "import os\n", - "os.environ['PATH'] = '/tools/Xilinx/Vivado/2019.2/bin:' + os.environ['PATH']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Load the dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "X_train_val = np.load('X_train_val.npy')\n", - "X_test = np.load('X_test.npy')\n", - "y_train_val = np.load('y_train_val.npy')\n", - "y_test = np.load('y_test.npy')\n", - "classes = np.load('classes.npy', allow_pickle=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Load the model\n", - "Load the model trained in 'part1_getting_started'. **Make sure you've run through that walkthrough first!**" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.models import load_model\n", - "model = load_model('model_1/KERAS_check_best_model.h5')\n", - "y_keras = model.predict(X_test)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Make an hls4ml config & model\n", - "This time, we'll create a config with finer granularity. When we print the config dictionary, you'll notice that an entry is created for each named Layer of the model. See for the first layer, for example:\n", - "```LayerName:\n", - " fc1:\n", - " Precision:\n", - " weight: ap_fixed<16,6>\n", - " bias: ap_fixed<16,6>\n", - " result: ap_fixed<16,6>\n", - " ReuseFactor: 1\n", - "```\n", - "Taken 'out of the box' this config will set all the parameters to the same settings as in part 1, but we can use it as a template to start modifying things. " - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Interpreting Sequential\n", - "Topology:\n", - "Layer name: fc1_input, layer type: Input\n", - "Layer name: fc1, layer type: Dense\n", - " -> Activation (linear), layer name: fc1\n", - "Layer name: relu1, layer type: Activation\n", - "Layer name: fc2, layer type: Dense\n", - " -> Activation (linear), layer name: fc2\n", - "Layer name: relu2, layer type: Activation\n", - "Layer name: fc3, layer type: Dense\n", - " -> Activation (linear), layer name: fc3\n", - "Layer name: relu3, layer type: Activation\n", - "Layer name: output, layer type: Dense\n", - " -> Activation (linear), layer name: output\n", - "Layer name: softmax, layer type: Activation\n", - "-----------------------------------\n", - "LayerName\n", - " fc1_input\n", - " Precision\n", - " result: ap_fixed<16,6>\n", - " fc1\n", - " Precision\n", - " weight: ap_fixed<16,6>\n", - " bias: ap_fixed<16,6>\n", - " result: ap_fixed<16,6>\n", - " ReuseFactor: 1\n", - " fc1_linear\n", - " Precision: ap_fixed<16,6>\n", - " ReuseFactor: 1\n", - " table_size: 1024\n", - " table_t: ap_fixed<18,8>\n", - " relu1\n", - " Precision: ap_fixed<16,6>\n", - " ReuseFactor: 1\n", - " table_size: 1024\n", - " table_t: ap_fixed<18,8>\n", - " fc2\n", - " Precision\n", - " weight: ap_fixed<16,6>\n", - " bias: ap_fixed<16,6>\n", - " result: ap_fixed<16,6>\n", - " ReuseFactor: 1\n", - " fc2_linear\n", - " Precision: ap_fixed<16,6>\n", - " ReuseFactor: 1\n", - " table_size: 1024\n", - " table_t: ap_fixed<18,8>\n", - " relu2\n", - " Precision: ap_fixed<16,6>\n", - " ReuseFactor: 1\n", - " table_size: 1024\n", - " table_t: ap_fixed<18,8>\n", - " fc3\n", - " Precision\n", - " weight: ap_fixed<16,6>\n", - " bias: ap_fixed<16,6>\n", - " result: ap_fixed<16,6>\n", - " ReuseFactor: 1\n", - " fc3_linear\n", - " Precision: ap_fixed<16,6>\n", - " ReuseFactor: 1\n", - " table_size: 1024\n", - " table_t: ap_fixed<18,8>\n", - " relu3\n", - " Precision: ap_fixed<16,6>\n", - " ReuseFactor: 1\n", - " table_size: 1024\n", - " table_t: ap_fixed<18,8>\n", - " output\n", - " Precision\n", - " weight: ap_fixed<16,6>\n", - " bias: ap_fixed<16,6>\n", - " result: ap_fixed<16,6>\n", - " ReuseFactor: 1\n", - " output_linear\n", - " Precision: ap_fixed<16,6>\n", - " ReuseFactor: 1\n", - " table_size: 1024\n", - " table_t: ap_fixed<18,8>\n", - " softmax\n", - " Precision: ap_fixed<16,6>\n", - " ReuseFactor: 1\n", - " table_size: 1024\n", - " exp_table_t: ap_fixed<18,8,AP_RND,AP_SAT>\n", - " inv_table_t: ap_fixed<18,8,AP_RND,AP_SAT>\n", - "-----------------------------------\n" - ] - } - ], - "source": [ - "import hls4ml\n", - "config = hls4ml.utils.config_from_keras_model(model, granularity='name')\n", - "print(\"-----------------------------------\")\n", - "plotting.print_dict(config)\n", - "print(\"-----------------------------------\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Profiling\n", - "As you can see, we can choose the precision of _everything_ in our Neural Network. This is a powerful way to tune the performance, but it's also complicated. The tools in `hls4ml.model.profiling` can help you choose the right precision for your model. (That said, training your model with quantization built in can get around this problem, and that is introduced in Part 4. So, don't go too far down the rabbit hole of tuning your data types without first trying out quantization aware training with QKeras.)\n", - "\n", - "The first thing to try is to numerically profile your model. This method plots the distribution of the weights (and biases) as a box and whisker plot. The grey boxes show the values which can be represented with the data types used in the `hls_model`. Generally, you need the box to overlap completely with the whisker 'to the right' (large values) otherwise you'll get saturation & wrap-around issues. It can be okay for the box not to overlap completely 'to the left' (small values), but finding how small you can go is a matter of trial-and-error.\n", - "\n", - "Providing data, in this case just using the first 1000 examples for speed, will show the same distributions captured at the output of each layer." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Interpreting Sequential\n", - "Topology:\n", - "Layer name: fc1_input, layer type: InputLayer, current shape: [[None, 16]]\n", - "Layer name: fc1, layer type: Dense, current shape: [[None, 16]]\n", - "Layer name: relu1, layer type: Activation, current shape: [[None, 64]]\n", - "Layer name: fc2, layer type: Dense, current shape: [[None, 64]]\n", - "Layer name: relu2, layer type: Activation, current shape: [[None, 32]]\n", - "Layer name: fc3, layer type: Dense, current shape: [[None, 32]]\n", - "Layer name: relu3, layer type: Activation, current shape: [[None, 32]]\n", - "Layer name: output, layer type: Dense, current shape: [[None, 32]]\n", - "Layer name: softmax, layer type: Softmax, current shape: [[None, 5]]\n", - "Creating HLS model\n", - "Profiling weights\n", - "Profiling activations\n", - " fc1\n", - " relu1\n", - " fc2\n", - " relu2\n", - " fc3\n", - " relu3\n", - " output\n", - " softmax\n" - ] - }, - { - "data": { - "text/plain": [ - "(
,
)" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "%matplotlib inline\n", - "hls_model = hls4ml.converters.convert_from_keras_model(model,\n", - " hls_config=config,\n", - " output_dir='model_1/hls4ml_prj_2',\n", - " fpga_part='xcu250-figd2104-2L-e')\n", - "hls4ml.model.profiling.numerical(keras_model=model, hls_model=hls_model, X=X_test[:1000])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Customize\n", - "Let's just try setting the precision of the first layer weights to something more narrow than 16 bits. Using fewer bits can save resources in the FPGA. After inspecting the profiling plot above, let's try 8 bits with 1 integer bit.\n", - "\n", - "Then create a new `HLSModel`, and display the profiling with the new config. This time, just display the weight profile by not providing any data '`X`'. Then create the `HLSModel` and display the architecture. Notice the box around the weights of the first layer reflects the different precision." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Interpreting Sequential\n", - "Topology:\n", - "Layer name: fc1_input, layer type: InputLayer, current shape: [[None, 16]]\n", - "Layer name: fc1, layer type: Dense, current shape: [[None, 16]]\n", - "Layer name: relu1, layer type: Activation, current shape: [[None, 64]]\n", - "Layer name: fc2, layer type: Dense, current shape: [[None, 64]]\n", - "Layer name: relu2, layer type: Activation, current shape: [[None, 32]]\n", - "Layer name: fc3, layer type: Dense, current shape: [[None, 32]]\n", - "Layer name: relu3, layer type: Activation, current shape: [[None, 32]]\n", - "Layer name: output, layer type: Dense, current shape: [[None, 32]]\n", - "Layer name: softmax, layer type: Softmax, current shape: [[None, 5]]\n", - "Creating HLS model\n", - "Profiling weights\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "config['LayerName']['fc1']['Precision']['weight'] = 'ap_fixed<8,2>'\n", - "hls_model = hls4ml.converters.convert_from_keras_model(model,\n", - " hls_config=config,\n", - " output_dir='model_1/hls4ml_prj_2',\n", - " fpga_part='xcu250-figd2104-2L-e')\n", - "hls4ml.model.profiling.numerical(keras_model=model, hls_model=hls_model)\n", - "hls4ml.utils.plot_model(hls_model, show_shapes=True, show_precision=True, to_file=None)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Trace\n", - "When we start using customised precision throughout the model, it can be useful to collect the output from each layer to find out when things have gone wrong. We enable this trace collection by setting `Trace = True` for each layer whose output we want to collect." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Interpreting Sequential\n", - "Topology:\n", - "Layer name: fc1_input, layer type: InputLayer, current shape: [[None, 16]]\n", - "Layer name: fc1, layer type: Dense, current shape: [[None, 16]]\n", - "Layer name: relu1, layer type: Activation, current shape: [[None, 64]]\n", - "Layer name: fc2, layer type: Dense, current shape: [[None, 64]]\n", - "Layer name: relu2, layer type: Activation, current shape: [[None, 32]]\n", - "Layer name: fc3, layer type: Dense, current shape: [[None, 32]]\n", - "Layer name: relu3, layer type: Activation, current shape: [[None, 32]]\n", - "Layer name: output, layer type: Dense, current shape: [[None, 32]]\n", - "Layer name: softmax, layer type: Softmax, current shape: [[None, 5]]\n", - "Creating HLS model\n" - ] - } - ], - "source": [ - "for layer in config['LayerName'].keys():\n", - " config['LayerName'][layer]['Trace'] = True\n", - "hls_model = hls4ml.converters.convert_from_keras_model(model,\n", - " hls_config=config,\n", - " output_dir='model_1/hls4ml_prj_2',\n", - " fpga_part='xcu250-figd2104-2L-e')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Compile, trace, predict\n", - "Now we need to check that this model performance is still good after reducing the precision. We compile the `hls_model`, and now use the `hls_model.trace` method to collect the model output, and also the output for all the layers we enabled tracing for. This returns a dictionary with keys corresponding to the layer names of the model. Stored at that key is the array of values output by that layer, sampled from the provided data.\n", - "A helper function `get_ymodel_keras` will return the same dictionary for the Keras model.\n", - "\n", - "We'll just run the `trace` for the first 1000 examples, since it takes a bit longer and uses more memory than just running `predict`. " - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing HLS project\n", - "Done\n", - "Recompiling myproject with tracing\n", - "Writing HLS project\n", - "Done\n", - "Processing fc1 in Keras model...\n", - "Processing relu1 in Keras model...\n", - "Processing fc2 in Keras model...\n", - "Processing relu2 in Keras model...\n", - "Processing fc3 in Keras model...\n", - "Processing relu3 in Keras model...\n", - "Processing output in Keras model...\n", - "Processing softmax in Keras model...\n", - "Done taking outputs for Keras model.\n" - ] - }, - { - "ename": "Exception", - "evalue": "Array must be c_contiguous, try using numpy.ascontiguousarray(x)", - "output_type": "error", - "traceback": [ - "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", - "\u001B[0;31mException\u001B[0m Traceback (most recent call last)", - "\u001B[0;32m\u001B[0m in \u001B[0;36m\u001B[0;34m\u001B[0m\n\u001B[1;32m 2\u001B[0m \u001B[0mhls4ml_pred\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mhls4ml_trace\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mhls_model\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mtrace\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mnp\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mascontiguousarray\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mX_test\u001B[0m\u001B[0;34m[\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;36m1000\u001B[0m\u001B[0;34m]\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 3\u001B[0m \u001B[0mkeras_trace\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mhls4ml\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mmodel\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mprofiling\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mget_ymodel_keras\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mmodel\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mX_test\u001B[0m\u001B[0;34m[\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;36m1000\u001B[0m\u001B[0;34m]\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m----> 4\u001B[0;31m \u001B[0my_hls\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mhls_model\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mpredict\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mX_test\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m", - "\u001B[0;32m/usr/local/anaconda3/envs/hls4ml-tutorial-0.4.0/lib/python3.7/site-packages/hls4ml/model/hls_model.py\u001B[0m in \u001B[0;36mpredict\u001B[0;34m(self, x)\u001B[0m\n\u001B[1;32m 440\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 441\u001B[0m \u001B[0;32mdef\u001B[0m \u001B[0mpredict\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mself\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mx\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m--> 442\u001B[0;31m \u001B[0mtop_function\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mctype\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mself\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0m_get_top_function\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mx\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 443\u001B[0m \u001B[0mn_samples\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mself\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0m_compute_n_samples\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mx\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 444\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n", - "\u001B[0;32m/usr/local/anaconda3/envs/hls4ml-tutorial-0.4.0/lib/python3.7/site-packages/hls4ml/model/hls_model.py\u001B[0m in \u001B[0;36m_get_top_function\u001B[0;34m(self, x)\u001B[0m\n\u001B[1;32m 413\u001B[0m \u001B[0;32mraise\u001B[0m \u001B[0mException\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m'Expected numpy.ndarray, but got {}'\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mformat\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mtype\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mx\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 414\u001B[0m \u001B[0;32mif\u001B[0m \u001B[0;32mnot\u001B[0m \u001B[0mx\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mflags\u001B[0m\u001B[0;34m[\u001B[0m\u001B[0;34m'C_CONTIGUOUS'\u001B[0m\u001B[0;34m]\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m--> 415\u001B[0;31m \u001B[0;32mraise\u001B[0m \u001B[0mException\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m'Array must be c_contiguous, try using numpy.ascontiguousarray(x)'\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 416\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 417\u001B[0m \u001B[0;32mif\u001B[0m \u001B[0mx\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mdtype\u001B[0m \u001B[0;32min\u001B[0m \u001B[0;34m[\u001B[0m\u001B[0mnp\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0msingle\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mnp\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mfloat32\u001B[0m\u001B[0;34m]\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n", - "\u001B[0;31mException\u001B[0m: Array must be c_contiguous, try using numpy.ascontiguousarray(x)" - ] - } - ], - "source": [ - "hls_model.compile()\n", - "hls4ml_pred, hls4ml_trace = hls_model.trace(np.ascontiguousarray(X_test[:1000]))\n", - "keras_trace = hls4ml.model.profiling.get_ymodel_keras(model, X_test[:1000])\n", - "y_hls = hls_model.predict(X_test)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Inspect\n", - "Now we can print out, make plots, or do any other more detailed analysis on the output of each layer to make sure we haven't made the performance worse. And if we have, we can quickly find out where. Let's just print the output of the first layer, for the first sample, for both the Keras and hls4ml models." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Keras layer 'fc1', first sample:\n", - "tf.Tensor(\n", - "[ 1.3298949 -0.2273792 -2.0345597 -1.2124288 0.74129164 1.363094\n", - " 2.6127422 2.1302752 0.21171883 -1.0895215 0.05829001 -0.26720256\n", - " 1.507444 0.62107986 -0.6999786 0.69951785 0.23473763 0.49169973\n", - " 0.6744242 0.80380046 1.0611422 0.43186942 0.5371661 -1.0782578\n", - " -1.1119338 0.58070505 -0.5819302 -2.1471696 0.85888755 0.06874409\n", - " 1.8492386 0.6351749 0.12423055 0.7581076 1.3591877 1.3394173\n", - " 0.7297581 -2.35184 -0.4690978 -0.06473738 -0.3725239 0.19004951\n", - " -1.1871346 -0.7982826 1.518335 -1.594072 1.346335 1.924911\n", - " -1.5910498 -1.767949 0.57423884 -2.1299162 -1.5479293 1.7082984\n", - " 1.2846634 0.5533352 -1.1855457 -1.4779193 0.8521671 0.9319416\n", - " -1.5019095 0.7208327 -1.2629596 -1.0844446 ], shape=(64,), dtype=float32)\n", - "hls4ml layer 'fc1', first sample:\n", - "[ 1.31152344 -0.23535156 -2.05273438 -1.23339844 0.70605469 1.32617188\n", - " 2.5546875 2.07519531 0.14550781 -1.125 0.03710938 -0.30371094\n", - " 1.45703125 0.57421875 -0.75585938 0.66210938 0.20507812 0.42675781\n", - " 0.60839844 0.7578125 1.0390625 0.38964844 0.50390625 -1.11035156\n", - " -1.12890625 0.53613281 -0.63671875 -2.16894531 0.83007812 0.03027344\n", - " 1.82519531 0.61816406 0.11621094 0.72460938 1.33886719 1.34082031\n", - " 0.70800781 -2.37988281 -0.5234375 -0.09179688 -0.39941406 0.1796875\n", - " -1.2265625 -0.81738281 1.47167969 -1.63671875 1.29589844 1.85839844\n", - " -1.62695312 -1.81738281 0.53710938 -2.171875 -1.57910156 1.66503906\n", - " 1.24414062 0.53027344 -1.23535156 -1.47265625 0.79394531 0.89453125\n", - " -1.54882812 0.67578125 -1.30371094 -1.12207031]\n" - ] - } - ], - "source": [ - "print(\"Keras layer 'fc1', first sample:\")\n", - "print(keras_trace['fc1'][0])\n", - "print(\"hls4ml layer 'fc1', first sample:\")\n", - "print(hls4ml_trace['fc1'][0])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Compare\n", - "Let's see if we lost performance by using 8 bits for the weights of the first layer by inspecting the accuracy and ROC curve." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Keras Accuracy: 0.7502650602409638\n", - "hls4ml Accuracy: 0.7494819277108433\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "print(\"Keras Accuracy: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_keras, axis=1))))\n", - "print(\"hls4ml Accuracy: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_hls, axis=1))))\n", - "\n", - "fig, ax = plt.subplots(figsize=(9, 9))\n", - "_ = plotting.makeRoc(y_test, y_keras, classes)\n", - "plt.gca().set_prop_cycle(None) # reset the colors\n", - "_ = plotting.makeRoc(y_test, y_hls, classes, linestyle='--')\n", - "\n", - "from matplotlib.lines import Line2D\n", - "lines = [Line2D([0], [0], ls='-'),\n", - " Line2D([0], [0], ls='--')]\n", - "from matplotlib.legend import Legend\n", - "leg = Legend(ax, lines, labels=['keras', 'hls4ml'],\n", - " loc='lower right', frameon=False)\n", - "ax.add_artist(leg)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Profiling & Trace Summary\n", - "We lost a small amount of accuracy compared to when we used `ap_fixed<16,6>`, but in many cases this difference will be small enough to be worth the resource saving. You can choose how aggressive to go with quantization, but it's always sensible to make the profiling plots even with the default configuration. Layer-level `trace` is very useful for finding when you reduced the bitwidth too far, or when the default configuration is no good for your model.\n", - "\n", - "With this 'post training quantization', around 8-bits width generally seems to be the limit to how low you can go before suffering significant performance loss. In Part 4, we'll look at using 'training aware quantization' with QKeras to go much lower without losing much performance.\n", - "\n", - "## ReuseFactor\n", - "Now let's look at the other configuration parameter: `ReuseFactor`.\n", - "Recall that `ReuseFactor` is our mechanism for tuning the parallelism:" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![reuse.png](attachment:images/reuse.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So now let's make a new configuration for this model, and set the `ReuseFactor` to `2` for every layer:\n", - "we'll compile the model, then evaulate its performance. (Note, by creating a new config with `granularity=Model`, we're implicitly resetting the precision to `ap_fixed<16,6>` throughout.) Changing the `ReuseFactor` should not change the classification results, but let's just verify that by inspecting the accuracy and ROC curve again!\n", - "Then we'll build the model." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Interpreting Sequential\n", - "Topology:\n", - "Layer name: fc1_input, layer type: Input\n", - "Layer name: fc1, layer type: Dense\n", - " -> Activation (linear), layer name: fc1\n", - "Layer name: relu1, layer type: Activation\n", - "Layer name: fc2, layer type: Dense\n", - " -> Activation (linear), layer name: fc2\n", - "Layer name: relu2, layer type: Activation\n", - "Layer name: fc3, layer type: Dense\n", - " -> Activation (linear), layer name: fc3\n", - "Layer name: relu3, layer type: Activation\n", - "Layer name: output, layer type: Dense\n", - " -> Activation (linear), layer name: output\n", - "Layer name: softmax, layer type: Activation\n", - "-----------------------------------\n", - "{'Model': {'Precision': 'ap_fixed<16,6>', 'ReuseFactor': 1, 'Strategy': 'Latency'}}\n", - "-----------------------------------\n", - "Interpreting Sequential\n", - "Topology:\n", - "Layer name: fc1_input, layer type: InputLayer, current shape: [[None, 16]]\n", - "Layer name: fc1, layer type: Dense, current shape: [[None, 16]]\n", - "Layer name: relu1, layer type: Activation, current shape: [[None, 64]]\n", - "Layer name: fc2, layer type: Dense, current shape: [[None, 64]]\n", - "Layer name: relu2, layer type: Activation, current shape: [[None, 32]]\n", - "Layer name: fc3, layer type: Dense, current shape: [[None, 32]]\n", - "Layer name: relu3, layer type: Activation, current shape: [[None, 32]]\n", - "Layer name: output, layer type: Dense, current shape: [[None, 32]]\n", - "Layer name: softmax, layer type: Softmax, current shape: [[None, 5]]\n", - "Creating HLS model\n", - "Writing HLS project\n", - "Done\n" - ] - }, - { - "ename": "Exception", - "evalue": "Array must be c_contiguous, try using numpy.ascontiguousarray(x)", - "output_type": "error", - "traceback": [ - "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", - "\u001B[0;31mException\u001B[0m Traceback (most recent call last)", - "\u001B[0;32m\u001B[0m in \u001B[0;36m\u001B[0;34m\u001B[0m\n\u001B[1;32m 10\u001B[0m fpga_part='xcu250-figd2104-2L-e')\n\u001B[1;32m 11\u001B[0m \u001B[0mhls_model\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mcompile\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m---> 12\u001B[0;31m \u001B[0my_hls\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mhls_model\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mpredict\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mX_test\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 13\u001B[0m \u001B[0mprint\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m\"Keras Accuracy: {}\"\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mformat\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0maccuracy_score\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mnp\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0margmax\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0my_test\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0maxis\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0;36m1\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mnp\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0margmax\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0my_keras\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0maxis\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0;36m1\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 14\u001B[0m \u001B[0mprint\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m\"hls4ml Accuracy: {}\"\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mformat\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0maccuracy_score\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mnp\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0margmax\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0my_test\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0maxis\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0;36m1\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mnp\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0margmax\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0my_hls\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0maxis\u001B[0m\u001B[0;34m=\u001B[0m\u001B[0;36m1\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n", - "\u001B[0;32m/usr/local/anaconda3/envs/hls4ml-tutorial-0.4.0/lib/python3.7/site-packages/hls4ml/model/hls_model.py\u001B[0m in \u001B[0;36mpredict\u001B[0;34m(self, x)\u001B[0m\n\u001B[1;32m 440\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 441\u001B[0m \u001B[0;32mdef\u001B[0m \u001B[0mpredict\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mself\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mx\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m--> 442\u001B[0;31m \u001B[0mtop_function\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mctype\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mself\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0m_get_top_function\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mx\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 443\u001B[0m \u001B[0mn_samples\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mself\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0m_compute_n_samples\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mx\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 444\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n", - "\u001B[0;32m/usr/local/anaconda3/envs/hls4ml-tutorial-0.4.0/lib/python3.7/site-packages/hls4ml/model/hls_model.py\u001B[0m in \u001B[0;36m_get_top_function\u001B[0;34m(self, x)\u001B[0m\n\u001B[1;32m 413\u001B[0m \u001B[0;32mraise\u001B[0m \u001B[0mException\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m'Expected numpy.ndarray, but got {}'\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mformat\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mtype\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mx\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 414\u001B[0m \u001B[0;32mif\u001B[0m \u001B[0;32mnot\u001B[0m \u001B[0mx\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mflags\u001B[0m\u001B[0;34m[\u001B[0m\u001B[0;34m'C_CONTIGUOUS'\u001B[0m\u001B[0;34m]\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m--> 415\u001B[0;31m \u001B[0;32mraise\u001B[0m \u001B[0mException\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m'Array must be c_contiguous, try using numpy.ascontiguousarray(x)'\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 416\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 417\u001B[0m \u001B[0;32mif\u001B[0m \u001B[0mx\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mdtype\u001B[0m \u001B[0;32min\u001B[0m \u001B[0;34m[\u001B[0m\u001B[0mnp\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0msingle\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mnp\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mfloat32\u001B[0m\u001B[0;34m]\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n", - "\u001B[0;31mException\u001B[0m: Array must be c_contiguous, try using numpy.ascontiguousarray(x)" - ] - } - ], - "source": [ - "config = hls4ml.utils.config_from_keras_model(model, granularity='Model')\n", - "print(\"-----------------------------------\")\n", - "print(config)\n", - "print(\"-----------------------------------\")\n", - "# Set the ReuseFactor to 2 throughout\n", - "config['Model']['ReuseFactor'] = 2\n", - "hls_model = hls4ml.converters.convert_from_keras_model(model,\n", - " hls_config=config,\n", - " output_dir='model_1/hls4ml_prj_2',\n", - " fpga_part='xcu250-figd2104-2L-e')\n", - "hls_model.compile()\n", - "y_hls = hls_model.predict(X_test)\n", - "print(\"Keras Accuracy: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_keras, axis=1))))\n", - "print(\"hls4ml Accuracy: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_hls, axis=1))))\n", - "plt.figure(figsize=(9, 9))\n", - "_ = plotting.makeRoc(y_test, y_keras, classes)\n", - "plt.gca().set_prop_cycle(None) # reset the colors\n", - "_ = plotting.makeRoc(y_test, y_hls, classes, linestyle='--')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now build the model\n", - "\n", - "**This can take several minutes.**\n", - "\n", - "While the C-Synthesis is running, we can monitor the progress looking at the log file by opening a terminal from the notebook home, and executing:\n", - "\n", - "`tail -f model_1/hls4ml_prj_2/vivado_hls.log`" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "hls_model.build(csim=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And now print the report, compare this to the report from Exercise 1" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Found 1 solution(s) in model_1/hls4ml_prj_2/myproject_prj.\n", - "Reports for solution \"solution1\":\n", - "\n", - "C simulation report not found.\n", - "SYNTHESIS REPORT:\n", - "================================================================\n", - "== Vivado HLS Report for 'myproject'\n", - "================================================================\n", - "* Date: Tue Mar 2 12:30:29 2021\n", - "\n", - "* Version: 2019.2 (Build 2704478 on Wed Nov 06 22:10:23 MST 2019)\n", - "* Project: myproject_prj\n", - "* Solution: solution1\n", - "* Product family: virtexuplus\n", - "* Target device: xcu250-figd2104-2L-e\n", - "\n", - "\n", - "================================================================\n", - "== Performance Estimates\n", - "================================================================\n", - "+ Timing: \n", - " * Summary: \n", - " +--------+---------+----------+------------+\n", - " | Clock | Target | Estimated| Uncertainty|\n", - " +--------+---------+----------+------------+\n", - " |ap_clk | 5.00 ns | 4.486 ns | 0.62 ns |\n", - " +--------+---------+----------+------------+\n", - "\n", - "+ Latency: \n", - " * Summary: \n", - " +---------+---------+-----------+-----------+-----+-----+----------+\n", - " | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", - " | min | max | min | max | min | max | Type |\n", - " +---------+---------+-----------+-----------+-----+-----+----------+\n", - " | 15| 15| 75.000 ns | 75.000 ns | 2| 2| function |\n", - " +---------+---------+-----------+-----------+-----+-----+----------+\n", - "\n", - " + Detail: \n", - " * Instance: \n", - " +----------------------------------+-----------------------+---------+---------+-----------+-----------+-----+-----+----------+\n", - " | | | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", - " | Instance | Module | min | max | min | max | min | max | Type |\n", - " +----------------------------------+-----------------------+---------+---------+-----------+-----------+-----+-----+----------+\n", - " |grp_dense_latency_0_0_0_1_fu_207 |dense_latency_0_0_0_1 | 2| 2| 10.000 ns | 10.000 ns | 2| 2| function |\n", - " |grp_dense_latency_0_0_0_s_fu_275 |dense_latency_0_0_0_s | 2| 2| 10.000 ns | 10.000 ns | 2| 2| function |\n", - " |grp_dense_latency_0_0_0_2_fu_311 |dense_latency_0_0_0_2 | 2| 2| 10.000 ns | 10.000 ns | 2| 2| function |\n", - " |grp_dense_latency_0_0_0_3_fu_317 |dense_latency_0_0_0_3 | 2| 2| 10.000 ns | 10.000 ns | 2| 2| function |\n", - " |call_ret1_relu_1_fu_353 |relu_1 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " |call_ret3_relu_fu_421 |relu | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " |call_ret5_relu_2_fu_457 |relu_2 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " +----------------------------------+-----------------------+---------+---------+-----------+-----------+-----+-----+----------+\n", - "\n", - " * Loop: \n", - " N/A\n", - "\n", - "\n", - "\n", - "================================================================\n", - "== Utilization Estimates\n", - "================================================================\n", - "* Summary: \n", - "+---------------------+---------+-------+---------+---------+------+\n", - "| Name | BRAM_18K| DSP48E| FF | LUT | URAM |\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|DSP | -| 5| -| -| -|\n", - "|Expression | -| -| 0| 78| -|\n", - "|FIFO | -| -| -| -| -|\n", - "|Instance | -| 2128| 28160| 117637| -|\n", - "|Memory | 3| -| 0| 0| -|\n", - "|Multiplexer | -| -| -| 90| -|\n", - "|Register | -| -| 2454| -| -|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Total | 3| 2133| 30614| 117805| 0|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Available SLR | 1344| 3072| 864000| 432000| 320|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Utilization SLR (%) | ~0 | 69| 3| 27| 0|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Available | 5376| 12288| 3456000| 1728000| 1280|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Utilization (%) | ~0 | 17| ~0 | 6| 0|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "\n", - "+ Detail: \n", - " * Instance: \n", - " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", - " | Instance | Module | BRAM_18K| DSP48E| FF | LUT | URAM|\n", - " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", - " |grp_dense_latency_0_0_0_1_fu_207 |dense_latency_0_0_0_1 | 0| 1024| 12676| 52707| 0|\n", - " |grp_dense_latency_0_0_0_2_fu_311 |dense_latency_0_0_0_2 | 0| 512| 6548| 29373| 0|\n", - " |grp_dense_latency_0_0_0_3_fu_317 |dense_latency_0_0_0_3 | 0| 80| 1300| 4994| 0|\n", - " |grp_dense_latency_0_0_0_s_fu_275 |dense_latency_0_0_0_s | 0| 512| 7636| 26979| 0|\n", - " |call_ret3_relu_fu_421 |relu | 0| 0| 0| 896| 0|\n", - " |call_ret1_relu_1_fu_353 |relu_1 | 0| 0| 0| 1792| 0|\n", - " |call_ret5_relu_2_fu_457 |relu_2 | 0| 0| 0| 896| 0|\n", - " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", - " |Total | | 0| 2128| 28160| 117637| 0|\n", - " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", - "\n" - ] - } - ], - "source": [ - "hls4ml.report.read_vivado_report('model_1/hls4ml_prj_2')" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Found 1 solution(s) in model_1/hls4ml_prj/myproject_prj.\n", - "Reports for solution \"solution1\":\n", - "\n", - "C simulation report not found.\n", - "SYNTHESIS REPORT:\n", - "================================================================\n", - "== Vivado HLS Report for 'myproject'\n", - "================================================================\n", - "* Date: Tue Mar 2 09:31:37 2021\n", - "\n", - "* Version: 2019.2 (Build 2704478 on Wed Nov 06 22:10:23 MST 2019)\n", - "* Project: myproject_prj\n", - "* Solution: solution1\n", - "* Product family: virtexuplus\n", - "* Target device: xcu250-figd2104-2L-e\n", - "\n", - "\n", - "================================================================\n", - "== Performance Estimates\n", - "================================================================\n", - "+ Timing: \n", - " * Summary: \n", - " +--------+---------+----------+------------+\n", - " | Clock | Target | Estimated| Uncertainty|\n", - " +--------+---------+----------+------------+\n", - " |ap_clk | 5.00 ns | 3.883 ns | 0.62 ns |\n", - " +--------+---------+----------+------------+\n", - "\n", - "+ Latency: \n", - " * Summary: \n", - " +---------+---------+-----------+-----------+-----+-----+----------+\n", - " | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", - " | min | max | min | max | min | max | Type |\n", - " +---------+---------+-----------+-----------+-----+-----+----------+\n", - " | 9| 9| 45.000 ns | 45.000 ns | 1| 1| function |\n", - " +---------+---------+-----------+-----------+-----+-----+----------+\n", - "\n", - " + Detail: \n", - " * Instance: \n", - " +----------------------------------+-----------------------+---------+---------+----------+----------+-----+-----+----------+\n", - " | | | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", - " | Instance | Module | min | max | min | max | min | max | Type |\n", - " +----------------------------------+-----------------------+---------+---------+----------+----------+-----+-----+----------+\n", - " |grp_dense_latency_0_0_0_1_fu_215 |dense_latency_0_0_0_1 | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", - " |grp_dense_latency_0_0_0_s_fu_283 |dense_latency_0_0_0_s | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", - " |grp_dense_latency_0_0_0_2_fu_319 |dense_latency_0_0_0_2 | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", - " |grp_dense_latency_0_0_0_3_fu_325 |dense_latency_0_0_0_3 | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", - " |call_ret1_relu_1_fu_361 |relu_1 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " |call_ret3_relu_fu_429 |relu | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " |call_ret5_relu_2_fu_465 |relu_2 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " +----------------------------------+-----------------------+---------+---------+----------+----------+-----+-----+----------+\n", - "\n", - " * Loop: \n", - " N/A\n", - "\n", - "\n", - "\n", - "================================================================\n", - "== Utilization Estimates\n", - "================================================================\n", - "* Summary: \n", - "+---------------------+---------+-------+---------+---------+------+\n", - "| Name | BRAM_18K| DSP48E| FF | LUT | URAM |\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|DSP | -| 5| -| -| -|\n", - "|Expression | -| -| 0| 78| -|\n", - "|FIFO | -| -| -| -| -|\n", - "|Instance | -| 3906| 24516| 78553| -|\n", - "|Memory | 4| -| 0| 0| -|\n", - "|Multiplexer | -| -| -| 36| -|\n", - "|Register | -| -| 2405| -| -|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Total | 4| 3911| 26921| 78667| 0|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Available SLR | 1344| 3072| 864000| 432000| 320|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Utilization SLR (%) | ~0 | 127| 3| 18| 0|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Available | 5376| 12288| 3456000| 1728000| 1280|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Utilization (%) | ~0 | 31| ~0 | 4| 0|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "\n", - "+ Detail: \n", - " * Instance: \n", - " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", - " | Instance | Module | BRAM_18K| DSP48E| FF | LUT | URAM|\n", - " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", - " |grp_dense_latency_0_0_0_1_fu_215 |dense_latency_0_0_0_1 | 0| 1859| 11265| 35856| 0|\n", - " |grp_dense_latency_0_0_0_2_fu_319 |dense_latency_0_0_0_2 | 0| 982| 6145| 18240| 0|\n", - " |grp_dense_latency_0_0_0_3_fu_325 |dense_latency_0_0_0_3 | 0| 157| 961| 2825| 0|\n", - " |grp_dense_latency_0_0_0_s_fu_283 |dense_latency_0_0_0_s | 0| 908| 6145| 18048| 0|\n", - " |call_ret3_relu_fu_429 |relu | 0| 0| 0| 896| 0|\n", - " |call_ret1_relu_1_fu_361 |relu_1 | 0| 0| 0| 1792| 0|\n", - " |call_ret5_relu_2_fu_465 |relu_2 | 0| 0| 0| 896| 0|\n", - " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", - " |Total | | 0| 3906| 24516| 78553| 0|\n", - " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", - "\n" - ] - } - ], - "source": [ - "hls4ml.report.read_vivado_report('model_1/hls4ml_prj')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercise\n", - "- Recall the outcome of the exercise of part 1 where we estimated how many DSPs our network should use.\n", - "How does this change now we've used `ReuseFactor = 2` for the network? Does the expectation match the report this time?\n", - "#### Tentative solution\n", - "\n", - "\n", - "```\n", - " ____________________________________________\n", - "| DSP usage | |\n", - "|------------------------------------------- |\n", - "| Expected: | (16x64+64x32+32x32+5)/2 = 2051 |\n", - "|------------------------------------------- |\n", - "| Obtained: | 2133 |\n", - "| ___________________________________________\n", - "```\n", - "\n", - "82 more DSP than expected; why?" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} \ No newline at end of file diff --git a/notebooks/part3_compression.ipynb b/notebooks/part3_compression.ipynb deleted file mode 100644 index 70830bb328..0000000000 --- a/notebooks/part3_compression.ipynb +++ /dev/null @@ -1,1100 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Part 3: Compression" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.utils import to_categorical\n", - "from sklearn.datasets import fetch_openml\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.preprocessing import LabelEncoder, StandardScaler\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "%matplotlib inline\n", - "seed = 0\n", - "np.random.seed(seed)\n", - "import tensorflow as tf\n", - "tf.random.set_seed(seed)\n", - "import os\n", - "os.environ['PATH'] = '/tools/Xilinx/Vivado/2019.2/bin:' + os.environ['PATH']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Fetch the jet tagging dataset from Open ML" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "X_train_val = np.load('X_train_val.npy')\n", - "X_test = np.load('X_test.npy')\n", - "y_train_val = np.load('y_train_val.npy')\n", - "y_test = np.load('y_test.npy')\n", - "classes = np.load('classes.npy', allow_pickle=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Now construct a model\n", - "We'll use the same architecture as in part 1: 3 hidden layers with 64, then 32, then 32 neurons. Each layer will use `relu` activation.\n", - "Add an output layer with 5 neurons (one for each class), then finish with Softmax activation." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.models import Sequential\n", - "from tensorflow.keras.layers import Dense, Activation, BatchNormalization\n", - "from tensorflow.keras.optimizers import Adam\n", - "from tensorflow.keras.regularizers import l1\n", - "from callbacks import all_callbacks" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "model = Sequential()\n", - "model.add(Dense(64, input_shape=(16,), name='fc1', kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", - "model.add(Activation(activation='relu', name='relu1'))\n", - "model.add(Dense(32, name='fc2', kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", - "model.add(Activation(activation='relu', name='relu2'))\n", - "model.add(Dense(32, name='fc3', kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", - "model.add(Activation(activation='relu', name='relu3'))\n", - "model.add(Dense(5, name='output', kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", - "model.add(Activation(activation='softmax', name='softmax'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Train sparse\n", - "This time we'll use the Tensorflow model optimization sparsity to train a sparse model (forcing many weights to '0'). In this instance, the target sparsity is 75%" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow_model_optimization.python.core.sparsity.keras import prune, pruning_callbacks, pruning_schedule\n", - "from tensorflow_model_optimization.sparsity.keras import strip_pruning\n", - "pruning_params = {\"pruning_schedule\" : pruning_schedule.ConstantSparsity(0.75, begin_step=2000, frequency=100)}\n", - "model = prune.prune_low_magnitude(model, **pruning_params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Train the model\n", - "We'll use the same settings as the model for part 1: Adam optimizer with categorical crossentropy loss.\n", - "The callbacks will decay the learning rate and save the model into a directory 'model_2'\n", - "The model isn't very complex, so this should just take a few minutes even on the CPU.\n", - "If you've restarted the notebook kernel after training once, set `train = False` to load the trained model rather than training again." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WARNING:tensorflow:`epsilon` argument is deprecated and will be removed, use `min_delta` instead.\n", - "WARNING:tensorflow:`period` argument is deprecated. Please use `save_freq` to specify the frequency in number of batches seen.\n", - "Epoch 1/30\n", - " 1/487 [..............................] - ETA: 0s - loss: 1.6388 - accuracy: 0.3027WARNING:tensorflow:From /usr/local/anaconda3/envs/hls4ml-tutorial-0.4.0/lib/python3.7/site-packages/tensorflow/python/ops/summary_ops_v2.py:1277: stop (from tensorflow.python.eager.profiler) is deprecated and will be removed after 2020-07-01.\n", - "Instructions for updating:\n", - "use `tf.profiler.experimental.stop` instead.\n", - "WARNING:tensorflow:Callbacks method `on_train_batch_end` is slow compared to the batch time (batch time: 0.0022s vs `on_train_batch_end` time: 0.0072s). Check your callbacks.\n", - "485/487 [============================>.] - ETA: 0s - loss: 1.3297 - accuracy: 0.5158\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00001: val_loss improved from inf to 1.12515, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00001: val_loss improved from inf to 1.12515, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00001: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00001: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 3ms/step - loss: 1.3290 - accuracy: 0.5161 - val_loss: 1.1252 - val_accuracy: 0.6363\n", - "Epoch 2/30\n", - "467/487 [===========================>..] - ETA: 0s - loss: 1.0573 - accuracy: 0.6658\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00002: val_loss improved from 1.12515 to 1.00706, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00002: val_loss improved from 1.12515 to 1.00706, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00002: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00002: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 1.0550 - accuracy: 0.6668 - val_loss: 1.0071 - val_accuracy: 0.6900\n", - "Epoch 3/30\n", - "466/487 [===========================>..] - ETA: 0s - loss: 0.9725 - accuracy: 0.7001\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00003: val_loss improved from 1.00706 to 0.94499, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00003: val_loss improved from 1.00706 to 0.94499, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00003: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00003: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.9712 - accuracy: 0.7004 - val_loss: 0.9450 - val_accuracy: 0.7098\n", - "Epoch 4/30\n", - "468/487 [===========================>..] - ETA: 0s - loss: 0.9186 - accuracy: 0.7144\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00004: val_loss improved from 0.94499 to 0.90047, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00004: val_loss improved from 0.94499 to 0.90047, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00004: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00004: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.9183 - accuracy: 0.7143 - val_loss: 0.9005 - val_accuracy: 0.7187\n", - "Epoch 5/30\n", - "463/487 [===========================>..] - ETA: 0s - loss: 1.0783 - accuracy: 0.6400\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00005: val_loss did not improve from 0.90047\n", - "\n", - "Epoch 00005: val_loss did not improve from 0.90047\n", - "\n", - "Epoch 00005: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00005: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 1.0746 - accuracy: 0.6415 - val_loss: 0.9991 - val_accuracy: 0.6721\n", - "Epoch 6/30\n", - "469/487 [===========================>..] - ETA: 0s - loss: 0.9623 - accuracy: 0.6859\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00006: val_loss did not improve from 0.90047\n", - "\n", - "Epoch 00006: val_loss did not improve from 0.90047\n", - "\n", - "Epoch 00006: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00006: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.9615 - accuracy: 0.6863 - val_loss: 0.9364 - val_accuracy: 0.6952\n", - "Epoch 7/30\n", - "466/487 [===========================>..] - ETA: 0s - loss: 0.9164 - accuracy: 0.7012\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00007: val_loss did not improve from 0.90047\n", - "\n", - "Epoch 00007: val_loss did not improve from 0.90047\n", - "\n", - "Epoch 00007: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00007: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.9158 - accuracy: 0.7015 - val_loss: 0.9022 - val_accuracy: 0.7051\n", - "Epoch 8/30\n", - "471/487 [============================>.] - ETA: 0s - loss: 0.8874 - accuracy: 0.7098\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00008: val_loss improved from 0.90047 to 0.87750, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00008: val_loss improved from 0.90047 to 0.87750, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00008: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00008: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.8865 - accuracy: 0.7101 - val_loss: 0.8775 - val_accuracy: 0.7122\n", - "Epoch 9/30\n", - "479/487 [============================>.] - ETA: 0s - loss: 0.8659 - accuracy: 0.7155\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00009: val_loss improved from 0.87750 to 0.86038, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00009: val_loss improved from 0.87750 to 0.86038, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00009: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00009: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.8655 - accuracy: 0.7156 - val_loss: 0.8604 - val_accuracy: 0.7173\n", - "Epoch 10/30\n", - "485/487 [============================>.] - ETA: 0s - loss: 0.8508 - accuracy: 0.7192\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00010: val_loss improved from 0.86038 to 0.84774, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00010: val_loss improved from 0.86038 to 0.84774, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00010: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00010: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "Epoch 00010: saving model to model_2/KERAS_check_model_epoch10.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.8506 - accuracy: 0.7192 - val_loss: 0.8477 - val_accuracy: 0.7208\n", - "Epoch 11/30\n", - "462/487 [===========================>..] - ETA: 0s - loss: 0.8394 - accuracy: 0.7218\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00011: val_loss improved from 0.84774 to 0.83780, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00011: val_loss improved from 0.84774 to 0.83780, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00011: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00011: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.8392 - accuracy: 0.7220 - val_loss: 0.8378 - val_accuracy: 0.7228\n", - "Epoch 12/30\n", - "465/487 [===========================>..] - ETA: 0s - loss: 0.8300 - accuracy: 0.7243\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00012: val_loss improved from 0.83780 to 0.82950, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00012: val_loss improved from 0.83780 to 0.82950, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00012: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00012: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.8299 - accuracy: 0.7243 - val_loss: 0.8295 - val_accuracy: 0.7256\n", - "Epoch 13/30\n", - "472/487 [============================>.] - ETA: 0s - loss: 0.8224 - accuracy: 0.7262\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00013: val_loss improved from 0.82950 to 0.82221, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00013: val_loss improved from 0.82950 to 0.82221, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00013: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00013: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.8220 - accuracy: 0.7263 - val_loss: 0.8222 - val_accuracy: 0.7270\n", - "Epoch 14/30\n", - "468/487 [===========================>..] - ETA: 0s - loss: 0.8152 - accuracy: 0.7281\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00014: val_loss improved from 0.82221 to 0.81563, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00014: val_loss improved from 0.82221 to 0.81563, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00014: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00014: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.8149 - accuracy: 0.7282 - val_loss: 0.8156 - val_accuracy: 0.7286\n", - "Epoch 15/30\n", - "484/487 [============================>.] - ETA: 0s - loss: 0.8087 - accuracy: 0.7299\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00015: val_loss improved from 0.81563 to 0.80983, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00015: val_loss improved from 0.81563 to 0.80983, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00015: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00015: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.8086 - accuracy: 0.7299 - val_loss: 0.8098 - val_accuracy: 0.7301\n", - "Epoch 16/30\n", - "471/487 [============================>.] - ETA: 0s - loss: 0.8029 - accuracy: 0.7315\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00016: val_loss improved from 0.80983 to 0.80445, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00016: val_loss improved from 0.80983 to 0.80445, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00016: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00016: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.8030 - accuracy: 0.7314 - val_loss: 0.8045 - val_accuracy: 0.7315\n", - "Epoch 17/30\n", - "482/487 [============================>.] - ETA: 0s - loss: 0.7977 - accuracy: 0.7326\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00017: val_loss improved from 0.80445 to 0.79966, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00017: val_loss improved from 0.80445 to 0.79966, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00017: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00017: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7977 - accuracy: 0.7326 - val_loss: 0.7997 - val_accuracy: 0.7324\n", - "Epoch 18/30\n", - "475/487 [============================>.] - ETA: 0s - loss: 0.7927 - accuracy: 0.7339\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00018: val_loss improved from 0.79966 to 0.79519, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00018: val_loss improved from 0.79966 to 0.79519, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00018: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00018: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7930 - accuracy: 0.7338 - val_loss: 0.7952 - val_accuracy: 0.7338\n", - "Epoch 19/30\n", - "467/487 [===========================>..] - ETA: 0s - loss: 0.7892 - accuracy: 0.7348\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00019: val_loss improved from 0.79519 to 0.79118, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00019: val_loss improved from 0.79519 to 0.79118, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00019: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00019: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7886 - accuracy: 0.7350 - val_loss: 0.7912 - val_accuracy: 0.7346\n", - "Epoch 20/30\n", - "478/487 [============================>.] - ETA: 0s - loss: 0.7845 - accuracy: 0.7359\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00020: val_loss improved from 0.79118 to 0.78713, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00020: val_loss improved from 0.79118 to 0.78713, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00020: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00020: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "Epoch 00020: saving model to model_2/KERAS_check_model_epoch20.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7845 - accuracy: 0.7360 - val_loss: 0.7871 - val_accuracy: 0.7357\n", - "Epoch 21/30\n", - "465/487 [===========================>..] - ETA: 0s - loss: 0.7809 - accuracy: 0.7371\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00021: val_loss improved from 0.78713 to 0.78348, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00021: val_loss improved from 0.78713 to 0.78348, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00021: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00021: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7807 - accuracy: 0.7372 - val_loss: 0.7835 - val_accuracy: 0.7368\n", - "Epoch 22/30\n", - "474/487 [============================>.] - ETA: 0s - loss: 0.7774 - accuracy: 0.7382\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00022: val_loss improved from 0.78348 to 0.78014, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00022: val_loss improved from 0.78348 to 0.78014, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00022: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00022: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7771 - accuracy: 0.7382 - val_loss: 0.7801 - val_accuracy: 0.7379\n", - "Epoch 23/30\n", - "483/487 [============================>.] - ETA: 0s - loss: 0.7741 - accuracy: 0.7393\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00023: val_loss improved from 0.78014 to 0.77707, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00023: val_loss improved from 0.78014 to 0.77707, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00023: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00023: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 3ms/step - loss: 0.7739 - accuracy: 0.7393 - val_loss: 0.7771 - val_accuracy: 0.7387\n", - "Epoch 24/30\n", - "486/487 [============================>.] - ETA: 0s - loss: 0.7711 - accuracy: 0.7401\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00024: val_loss improved from 0.77707 to 0.77436, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00024: val_loss improved from 0.77707 to 0.77436, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00024: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00024: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7711 - accuracy: 0.7401 - val_loss: 0.7744 - val_accuracy: 0.7398\n", - "Epoch 25/30\n", - "467/487 [===========================>..] - ETA: 0s - loss: 0.7687 - accuracy: 0.7409\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00025: val_loss improved from 0.77436 to 0.77198, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00025: val_loss improved from 0.77436 to 0.77198, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00025: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00025: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7684 - accuracy: 0.7411 - val_loss: 0.7720 - val_accuracy: 0.7403\n", - "Epoch 26/30\n", - "467/487 [===========================>..] - ETA: 0s - loss: 0.7658 - accuracy: 0.7418\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00026: val_loss improved from 0.77198 to 0.76957, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00026: val_loss improved from 0.77198 to 0.76957, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00026: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00026: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7660 - accuracy: 0.7417 - val_loss: 0.7696 - val_accuracy: 0.7412\n", - "Epoch 27/30\n", - "471/487 [============================>.] - ETA: 0s - loss: 0.7640 - accuracy: 0.7426\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00027: val_loss improved from 0.76957 to 0.76751, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00027: val_loss improved from 0.76957 to 0.76751, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00027: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00027: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7637 - accuracy: 0.7427 - val_loss: 0.7675 - val_accuracy: 0.7422\n", - "Epoch 28/30\n", - "469/487 [===========================>..] - ETA: 0s - loss: 0.7616 - accuracy: 0.7431\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00028: val_loss improved from 0.76751 to 0.76542, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00028: val_loss improved from 0.76751 to 0.76542, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00028: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00028: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 2ms/step - loss: 0.7616 - accuracy: 0.7432 - val_loss: 0.7654 - val_accuracy: 0.7423\n", - "Epoch 29/30\n", - "486/487 [============================>.] - ETA: 0s - loss: 0.7595 - accuracy: 0.7439\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00029: val_loss improved from 0.76542 to 0.76335, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00029: val_loss improved from 0.76542 to 0.76335, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00029: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00029: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 3ms/step - loss: 0.7595 - accuracy: 0.7439 - val_loss: 0.7634 - val_accuracy: 0.7434\n", - "Epoch 30/30\n", - "484/487 [============================>.] - ETA: 0s - loss: 0.7577 - accuracy: 0.7444\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\n", - "***callbacks***\n", - "saving losses to model_2/losses.log\n", - "\n", - "Epoch 00030: val_loss improved from 0.76335 to 0.76154, saving model to model_2/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00030: val_loss improved from 0.76335 to 0.76154, saving model to model_2/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00030: saving model to model_2/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00030: saving model to model_2/KERAS_check_model_last_weights.h5\n", - "\n", - "Epoch 00030: saving model to model_2/KERAS_check_model_epoch30.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 1s 3ms/step - loss: 0.7576 - accuracy: 0.7445 - val_loss: 0.7615 - val_accuracy: 0.7437\n" - ] - } - ], - "source": [ - "train = True\n", - "if train:\n", - " adam = Adam(lr=0.0001)\n", - " model.compile(optimizer=adam, loss=['categorical_crossentropy'], metrics=['accuracy'])\n", - " callbacks = all_callbacks(stop_patience = 1000,\n", - " lr_factor = 0.5,\n", - " lr_patience = 10,\n", - " lr_epsilon = 0.000001,\n", - " lr_cooldown = 2,\n", - " lr_minimum = 0.0000001,\n", - " outputDir = 'model_2')\n", - " callbacks.callbacks.append(pruning_callbacks.UpdatePruningStep())\n", - " model.fit(X_train_val, y_train_val, batch_size=1024,\n", - " epochs=30, validation_split=0.25, shuffle=True,\n", - " callbacks = callbacks.callbacks)\n", - " # Save the model again but with the pruning 'stripped' to use the regular layer types\n", - " model = strip_pruning(model)\n", - " model.save('model_2/KERAS_check_best_model.h5')\n", - "else:\n", - " from tensorflow.keras.models import load_model\n", - " model = load_model('model_2/KERAS_check_best_model.h5')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Check sparsity\n", - "Make a quick check that the model was indeed trained sparse. We'll just make a histogram of the weights of the 1st layer, and hopefully observe a large peak in the bin containing '0'. Note logarithmic y axis." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "% of zeros = 0.75\n" - ] - }, - { - "data": { - "text/plain": "
", - "image/png": "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\n" - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "w = model.layers[0].weights[0].numpy()\n", - "h, b = np.histogram(w, bins=100)\n", - "plt.figure(figsize=(7,7))\n", - "plt.bar(b[:-1], h, width=b[1]-b[0])\n", - "plt.semilogy()\n", - "print('% of zeros = {}'.format(np.sum(w==0)/np.size(w)))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Check performance\n", - "How does this 75% sparse model compare against the unpruned model? Let's report the accuracy and make a ROC curve. The pruned model is shown with solid lines, the unpruned model from part 1 is shown with dashed lines.\n", - "**Make sure you've trained the model from part 1**" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Accuracy unpruned: 0.7502650602409638\n", - "Accuracy pruned: 0.7426385542168674\n" - ] - }, - { - "data": { - "text/plain": "" - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "text/plain": "
", - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAIuCAYAAACl2OK5AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOzde1yO9//A8dd1151SKedDDmGE6u7u4KycVmgO88WIOcwc5swYyxgbfmYOM8bMYcNYMeSw5SyTw1BEyTFySEql8+mu+/r9ceueVM7k8Hk+Hj3Gdfhc78+1dL/7XJ/r85ZkWUYQBEEQBOFNpCjuAARBEARBEJ6VSGQEQRAEQXhjiURGEARBEIQ3lkhkBEEQBEF4Y4lERhAEQRCEN5ZIZARBEARBeGOJROYFkiQpR5IkWZKkK89zzKsmSdLB+zGJd/EFQRCEN4pIZN4wkiSdyEs6JElKK+54BEEQBKE4iUTmDSJJ0udAw+KOQxAEQRBeFyKReUkkSdotSVKuJElaSZKuSpJU+RHHbpUkKeuBkZZMSZIuP3RMLeB7QAOkF9FO3vnHJUm6eP/PGkmSvpMkyVWSpPj72zIkSfr0hXZYEARBEIqBJEoUvDiSJOUABg9sygEM7//5iCzLLR44JkKW5fckSfoWmHr/mGxABkoAyLIsPdD2LcAK+BRYAFgA6bIsmz5wzIP/M3PRJap5beTc/6/hA/tNZVnOkiTpINDy4WsKgiAIwutOjMi8PC6AMf+NnjgUcZz6/n8TZFkuIcuy8f3zRuUdIEnSb+iSmL2yLP/6BNfOAkoDkx7YlgQYAavv/90AaPMEbQmCIAjCa0skMi/HHVmWg2VZzgVi7m8zLuLYvMSkzP3HUMlAMLpkBEmSGgED0CUiHZ7w+udkWU65306eg7Ju+O3sA9vqPGF7giAIgvBaEonMy/Hg20Ta+/8t9JGNLMtbgbbAAeAOYALYAsslSeoLNLt/qAWQc//xkcX9bSXvz3n530PNptz/b/YD2xLzLvnANvH/XxAEQXijiQ+yYiZJ0vuALMtyW1mWqwCWD+zu8YTNKF94YIIgCILwBhCJTPH7GDhw/w2ndCD5gX1HZFleKMuy9OAXusdMoJvsK8myvOGVRy0IgiAIrwGRyBS/vcBtdI+gTND9P8kAfpNleU5xBiYIgiAIrzvx+rUgCIIgCG8sMSIjCIIgCMIbSyQygiAIgiC8sUQiIwiCIAjCG0skMoIgCIIgvLFEIiMIgiAIwhtLJDKCIAiCILyxRCIjCIIgCMIbSyQygiAIgiC8sQyLO4DHkSTJFFiKrgDiQVmW1xdzSIIgCIIgvCaKZURGkqRfJUmKlSQp7KHt7SVJuihJ0hVJkr68v/l/wCZZlgcDnV95sIIgCIIgvLaK69HSaqD9gxskSTIAlgAdgAaAlyRJDYCqwM37h+W+whgFQRAEQXjNFUsiI8vyISDhoc2NgCuyLF+VZTkb8AW6ALfQJTMg5vQIgiAIgvCA12mOjBX/jbyALoFpDCwCfpIk6QNgR1EnS5I0BBgCYGJi4lytWrWXEqRWq0WhEPnUqyDu9asj7vWrJe73qyPu9auRFZcGUglKlH05acWlS5fiZFkuX9i+1ymRKZQsy2nAJ09w3HJgOYCLi4scFBT0UuI5ePAgrVq1eiltC/mJe/3qiHv9aon7/eqIe/1qHOnTAeMsGedNu15K+5IkXS9q3+uUyEQBDw6jVL2/TRAEQRCE11RydjJK6ySMFenFcv3XabztJFBHkqSakiQZAb2A7cUckyAIgiAIjxCZFMkii5ocUtQtlusX1+vXPsAxwEaSpFuSJH0qy3IOMBLYDZwHNsqyfK444hMEQRAE4clEJkXS7FJ3jK56FMv1i+XRkizLXkVs9wf8X8Y1NRoNt27dIjMz87nasbCw4Pz58y8oKuFR3rR7bWxsTNWqVVEqlcUdiiAIwitz6d4lzLSVkeXiecjzOs2Realu3bqFubk51tbWSJL0zO2kpKRgbm7+AiMTivIm3WtZlomPj+fWrVvUrFmzuMMRBEF4ZS4kXMBFqoqRJrlYrv86zZF5bpIkdZIkaXlSUlKBfZmZmZQtW/a5khhBKIokSZQtW/a5R/wEQRDeNBGJEYAhZnJGsVz/rUpkZFneIcvyEAsLi0L3iyRGeJnE95cgCO8iY0NjkAxQFNPi+29VIvM22Lp1K+Hh4cUdxiONHTsWKysrtFqtftv06dOZN29evuOsra2Ji4sD4M6dO/Tq1YvatWvj7OyMp6cnly5deq44rl+/Ttu2bVGpVLRq1Ypbt24BEBISQtOmTbG1tUWlUrFhw4ZCz79x4watW7fG0dERlUqFv79uetaRI0dQqVS4uLhw+fJlABITE/Hw8MjXZ0EQBAGQtXTI/AZjXs76bY8jEpnXTHEnMjk5OY/cr9Vq8fPzo1q1avzzzz9P1KYsy3Tt2pVWrVoRERFBcHAws2fPJiYm5rlinTBhAv369ePs2bN8/fXXeHt7A1CyZEnWrl3LuXPn2LVrF2PHjiUxMbHA+TNnzuSjjz7i9OnT+Pr6Mnz4cADmz5+Pv78/CxcuZNmyZfpjJ0+eLFYIFQRBeIAmV0NuchQ13rvG6VpViiUG8VP5FZoxYwY2Nja0aNECLy+vAiMYR48eZfv27XzxxReo1WoiIiJYsWIFDRs2xMHBgW7dupGerltwKCIigiZNmmBvb8+UKVMwMzMDdInG8OHDqVevHu7u7nh6erJp0yYAgoODadmyJc7OzrRr147o6GgAWrVqxdixY3FxceHHH398ZB8OHjyIra0tw4YNw8fH54n6HRAQgFKp5LPPPtNvc3BwwNXV9cluXBHCw8Np06YNAK1bt2bbtm0A1K1blzp16gBQpUoVKlSowN27dwucL0kSycm6yWlJSUlUqaL7R6hUKklPTyc9PR2lUklERAQ3b94Uq4MKgiA8ZP+N/cRgiM+9ERimlSuWGN6Zt5Ye9M2Oc4TffrbZ1bm5uRgYGBTY3qBKKaZ1si3yvJMnT7J582bOnDmDRqPByckJZ2fnfMc0a9aMzp0707FjR7p37w6ApaUlgwcPBmDKlCmsWrWKUaNGMWbMGMaMGYOXl5d+1ABgy5YtREZGEh4eTmxsLPXr12fgwIFoNBpGjRrFtm3bKF++PBs2bOCrr77i119/BSA7O5snKevg4+ODl5cXXbp0YfLkyWg0mse+bhwWFlagr0VxdXUlJSUFyF8jZd68ebz//vv5jnVwcGDLli2MGTMGPz8/UlJSiI+Pp2zZsvpjTpw4QXZ2NrVr1y5wrenTp+Ph4cHixYtJS0tj3759AHh7e9OvXz9MTEz4/fffmTBhAjNnznyi+AVBEN4lx6OPY5JjRkLW+1jdPlgsMbyTiUxxOHLkCF26dMHY2BhjY2M6der0ROeFhYUxZcoUEhMTSU1NpV27dgAcO3aMrVu3AtC7d28mTJgAwOHDh+nRowcKhYJKlSrRunVrAC5evEhYWBju7u6ALiGrXLmy/jo9e/Z8bCzZ2dn4+/uzYMECzM3Nady4Mbt376Zjx45FTnR92gmwgYGB+j8/7vXrefPmMXLkSFavXo2bmxtWVlb5kszo6Gj69u3LmjVrCn0k5OPjw4ABAxg/fjzHjh2jb9++hIWFoVar+ffffwE4dOgQlStXRpZlevbsiVKpZP78+VSsWPGp+iUIgvA2Op9wHmON7olAliQXSwzvZCLzqJGTx3nVa5sMGDCArVu34uDgwOrVqzl48OAztSPLMra2thw7dqzQ/aampo9tY/fu3SQmJmJvbw9Aeno6JiYmdOzYkbJly+ofVeVJSUnB0tISW1tb/eOtx3maEZkqVaqwZcsWAFJTU9m8eTOWlpYAJCcn88EHHzBr1iyaNGlS6LVWrVrFrl26AmdNmzYlMzOTuLg4KlSoAOju2cyZM/H19WXUqFF8//33REZGsmjRImbNmvVE/REEQXib3Uy5ibWmFACGmrRiieGtmiPzqHVkilvz5s3ZsWMHmZmZpKam8tdffxV6nLm5uf6DHHTJQOXKldFoNKxfv16/vUmTJmzevBkAX1/ffNfZvHkzWq2WmJgYfeJjY2PD3bt39YmMRqPh3LnCK0D4+fnpJ84+yMfHh5UrVxIZGUlkZCTXrl1j7969pKen4+bmxvbt2/Wxb9myBQcHBwwMDGjTpg1ZWVksX75c39bZs2fzjb7kCQwMJCQkhJCQEI4cOaL/88NJDEBcXJz+LaLZs2czcOBAQDdy1LVrV/r166d/RFeY6tWrs3//fgDOnz9PZmYm5cv/VyV+7dq1eHp6UqZMGdLT01EoFCgUCv08JUEQhHdZSnYKydnJNEnTjcRYakTRyOf2uHVkilPDhg3p3LkzKpWKDh06YG9vT2Fx9urVi7lz5+Lo6EhERAQzZsygcePGNG/enHr16umPW7hwIQsWLEClUnHlyhV9W926daNq1ao0aNCAjz/+GCcnJywsLDAyMmLTpk1MmjQJBwcH1Go1R48eLTTWiIgISpUqlW9beno6u3bt4oMPPtBvMzU1pUWLFuzYsQOVSsXIkSNp0aIFarWaZcuWsXLlSkD3eMnPz499+/ZRu3ZtbG1t8fb2plKlSs91Tw8ePIiNjQ1169YlJiaGr776CoCNGzdy6NAhVq9ejVqtRq1WExISAsDXX3/N9u26WqTz589nxYoVODg44OXlxerVq/WPwtLT01m9ejUjRowA4PPPP8fT05OxY8fmm7QsCILwLqukNMchzRgAQ7l41pFBluW37svZ2Vl+WHh4eIFtzyI5OfmZz01JSZFlWZbT0tJkZ2dnOTg4+JnbSktLk7VarSzLsuzj4yN37ty5wHXi4uLkWrVqydHR0U/Vdp8+feTY2Nhnju1FeZ57XVxe1PfZqxYQEFDcIbxTxP1+dcS9fnk0uRrZa0V9Wft1KXn1R17yr+0GvrRrAUFyEZ/57+QcmeIyZMgQwsPDyczMpH///jg5OT1zW8HBwYwcORJZlrG0tNS/fQTQsWNHEhMTyc7OZurUqU898rFu3bpnjksQBEF4N+y/sR9zTRaSBJtrNaHx1TvFEodIZF6hP/7444W15erqypkzZwrd96wTggVBEAThSX1/8nskIyMupLtRK7kSJaSoYolDJDKCIAiCIDyVuIw4YtNjKWVcigMpfbHPgPLxV4ollrdqsq8gCIIgCC/fqZhTANQyLk8GSpAkLLWZxRKLSGQEQRAEQXgqe6/vBWDG1TBKybmYpd5CYWZSLLGIREYQBEEQhKdyJ+0OClnGOu0eEoYYatKRjI2LJRaRyLxmirv69ZMYO3YsVlZW+sXoQFe36OEimNbW1sTFxQFw584devXqRe3atXF2dsbT05NLly49Vxw3btygdevWODo6olKp8Pf3B3QL4n3yySfY29vj4OBQ5OTn6dOnY2VlpV9rJu/8I0eOoFKpcHFx4fLlywAkJibi4eGRr8+CIAjvKueKzjRNzwBAIxtjoM1GafLounsvy1uVyLzOK/s+qeJOZHJych65X6vV4ufnR7Vq1fjnn3+eqE1ZlunatSutWrUiIiKC4OBgZs+eTUxMzHPFOnPmTD766CNOnz6Nr68vw4cPB2DFihUAhIaGsnfvXsaPH19kAjJu3Dj96sGenp6AbqE8f39/Fi5cqC/IOXPmTCZPnlxozSZBEIR3TXxmPF3S0smSDVlWMpEEbSaKkiWLJZa36qey/Bqv7Aswa9Ys6tatS4sWLfDy8iowgnH06FG2b9/OF198gVqtJiIighUrVtCwYUMcHBzo1q2bfnn8iIgImjRpgr29PVOmTMHMTFe0S6vVMnz4cOrVq4e7uzuenp76OkfBwcG0bNkSZ2dn2rVrp6+N1KpVK8aOHYuLiws//vjjI/tw8OBBbG1tGTZsGD4+Pk/U74CAAJRKZb4VcR0cHHB1dX2yG1cESZJITtZVMU9KSqJKlSoAhIeH06ZNGwAqVKiApaXlE1X2zqNUKklPTyc9PR2lUklERAQ3b96kVatWzxWvIAjC2yDgRgD/3DyIc1YuUXI5kkqYk2VZB01N62KJ5918/Xrnl3An9JlONcnNAYNCblsle+jwXZHnBQcH4+vrS0hICDk5OTg5OeHs7JzvmGbNmtG5c2c6duyorxFkaWnJ4MGDAZgyZQqrVq1i1KhRjBkzhjFjxuDl5aUfNQBdjaPIyEjCw8OJjY2lfv36DBw4EI1Gw6hRo9i2bRvly5dnw4YNfPXVV/qF9LKzs5/ow97HxwcvLy+6dOnC5MmT0Wg0KJWPHk4MCwsr0NeiPE3RyOnTp+Ph4cHixYtJS0tj3759gC5J2r59O15eXty8eZPg4GBu3rxJo0aNClzvp59+Yu3atbi4uDB//nxKly6Nt7c3/fr1w8TEhN9//50JEyYwc+bMJ4pfEAThbbfn+h7uZSYSa1mJM9db4ZWqwPpOCGBdLPG8VSMyr7PAwEC6du1KyZIlKVWqFJ07d36i88LCwnB1dcXe3p7169frCz0eO3aMHj16ANC7d2/98YcPH6ZHjx4oFAoqVapE69atAbh48SJhYWG4u7ujVquZOXMmt27d0p/Xs2fPx8aSnZ2Nv78/H374IaVKlaJx48bs3r0bQF+j6GFFbS/K0xSN9PHxYcCAAdy6dQt/f3/69u2LVqtl4MCBVK1aFRcXF8aOHUuzZs0wMDAocP6wYcOIiIggJCSEypUrM378eADUajX//vsvAQEBXL16lcqVKyPLMj179uTjjz9+7kdigiAIb7LQuFCQ4HIJYyIz36ey1oDqtwNQpBVP9et3c0TmESMnj5ORkoK5ufkLDObRBgwYwNatW3FwcGD16tXPvGqvLMvY2trqq18/zNTU9LFt7N69m8TEROzt7QFdYUUTExM6duxI2bJl9Y+q8qSkpGBpaYmtra3+8dbjPM2IzKpVq9i1axcATZs2JTMzk7i4OCpUqMAPP/ygP65Zs2bUrVu3wLUqVqyo//PgwYPp2LFjvv2yLDNz5kx8fX0ZNWoU33//PZGRkSxatIhZs2Y9UX8EQRDeJtGp0VxPvo6JVovLvRhOy8aY5WahkLXklrYslpjEiMwr4ubmxtatW8nIyCAlJYUdO3YUepy5ubn+gxx0yUDlypXRaDSsX79ev71JkyZs3rwZAF9fX/325s2bs3nzZrRaLTExMfrEx8bGhrt37+oTGY1Gox/deZifnx/e3t4Ftvv4+LBy5UoiIyOJjIzk2rVr7N27l/T0dNzc3Ni+fbs+9i1btuDg4ICBgQFt2rQhKyuL5cuX69s6e/YsgYGBBa7xNCMy1atXZ//+/QCcP3+ezMxMypcvT3p6Omn3fzPYu3cvhoaGNGjQoMD5DyZefn5+2NnZ5du/du1aPD09KVOmDOnp6SgUChQKhX6ekiAIwrvmWLTuM2RW3D2qpCZTPteAkpnxAGhNzYolpndzRKYYODk50bNnTxwcHKhQoQINGzYs9LhevXoxePBgFi1axKZNm5gxYwaNGzemfPnyNG7cWJ8oLFy4kI8//phZs2bRvn178iY4d+vWjf3799OgQQOqVauGk5MTFhYWGBkZsWnTJkaPHk1SUhI5OTmMHTsWW1vbAjFERERQqlSpfNvS09PZtWtXvvk4pqamtGjRgh07dtCzZ09GjhxJixYtkCSJChUqsHLlSkD3eMnPz4+xY8cyZ84cjI2Nsba2ZuHChc91T+fPn8/gwYP54YcfkCSJ1atXI0kSsbGxtGvXDoVCgZWVFb///rv+nEGDBvHZZ5/h4uLCxIkTCQkJQZIkrK2t+eWXX/L1d/Xq1ezZsweAzz//HE9PT4yMjF5ozSxBEIQ3SY42hxKSIW3S0kjMrY5CljBP1y2zIZsWz1tLkq469tvFxcVFfnji6vnz56lfv/5zt53ygh4tTZ8+HTMzMyZMmPBM5+c91pEkCV9fX3x8fNi2bRsAqampmJmZER8fT6NGjThy5MhTVcD++OOP+eGHHyhfvvwzxfaivKh7/Sq9qO+zV+3gwYPiraxXSNzvV0fc6xcrKSuJ71Y6MvtuPLvowrmY/rx3Yzd1I3YQs+hHWnl4vJTrSpIULMuyS2H7xIjMGyo4OJiRI0ciyzKWlpb6t48AOnbsSGJiItnZ2UydOvWpkhiAdevWvehwBUEQhDecLMuciztHs/QMcoDhmT1oUEJDDfNSSCVKgJFRscQlEpliMn369Oc639XVlTNnzhS671knBAuCIAhCUY7dPsa4g+NYkJvLXW0ZSuUaYJWroLRpDnIxrnouEhlBEARBEB7rbNxZ0nPS8a1UgzrnPRicYowGmSoxIRhVq1Zscb1Vby29DSUKBEEQBOF1dDz6OADVs7WcyGoBgAESXL1MbmJiscX1ViUyr3uJAkEQBEF4E2XlZnEmNgS3tHSaxsZTP8eQDEkmuYISZLnY6izBW5bICIIgCILw4h26dQiNnMNHKamYZNhhmWOAUoZ6NhYgyxhWqFBssYlE5hVJTExk6dKlT73vdREXF4dSqcy3jgygL1aZZ/Xq1YwcOVL/97Vr12JnZ4e9vT2Ojo4FCmU+ix9//BE7OztsbW3zrUUzffp0rKysUKvVqNVq/P39Cz3f2toae3t71Go1Li7/vc03adIkVCoV/fr1029bt27dc693IwiC8KaraVqVwUlpWGlkIjTdyVWAIRKtHHSfAQbFtKoviETmlXmdE5mcnJzHHvPnn3/SpEmTJ654DbBz504WLlzInj17CA0N5d9//+V5H/uFhYWxYsUKTpw4wZkzZ/jrr7+4cuWKfv+4ceP0qwF7enoW2U5AQAAhISH6QplJSUmcOnWKs2fPYmRkRGhoKBkZGfz222+MGDHiuWIWBEF409WOucjohHjW0JwfTMpwl1w0lkpKJN4G0L1+XUxEIvOKfPnll0RERKBWq/niiy8euS81NZW2bdvi5OSEvb29fqE7gBkzZmBjY0OLFi3w8vLSj3CcPHkSlUqlbyNvuf3c3Fy++OILGjZsiEql0q9ee/DgQVxdXencuXOhy/c/zMfHh/nz5xMVFZWv2OSjzJ49m3nz5lGlShUASpQooa/k/azOnz9P48aNKVmyJIaGhrRs2ZItW7Y8V5sACoUCjUaDLMukp6ejVCqZN28eo0aNemx1b0EQhLfZrZRb7Px3HpGGhuxM74KRsSmVtAY0cK6gf+3azK1lscX3Tr5+PefEHC4kXHimc3NzcwutpFyvTD0mNZpU5HnfffcdYWFhhISEPHZfTk4Ofn5+lCpViri4OJo0aULnzp0JCgpi8+bNnDlzBo1Gg5OTE87OzgB88sknrFixgqZNm/Lll1/q2161ahUWFhacPHmSrKwsmjdvjsf9lRdPnTpFWFgYNWvWfGSfb968SXR0NI0aNeKjjz5iw4YN+krRjxIWFqaP71HWr1/P3LlzC2y3trZm69at+bbZ2dnx1VdfER8fj4mJCf7+/vkeD/3000+sXbsWFxcX5s+fT+nSpQu0K0kSHh4eSJLE0KFDGTJkCObm5nh6euLo6Ejbtm2xsLDg+PHjTJ069bHxC4IgvM32Xd/HfMMk2pnWoMvtqlzL1AIGNHKrRtb2QwCUdHGGB0bHX6V3MpF53cmyzOTJkzl06BAKhYKoqChiYmI4cuQIXbp0wdjYGGNjYzp16gToHk2lpKTQtGlTAHr37s1ff/0FwJ49ezh79qy++nRSUhKXL1/GyMiIRo0aPTaJAdiwYQMfffQRoKsFNXDgwEcmMpIkPVV/+/TpQ58+fQpsf7B4Zp769eszadIkPDw8MDU1Ra1W6xPLYcOGMXXqVCRJYurUqYwfPz7fisd5Dh8+jJWVFbGxsbi7u1OvXj3c3NyYOHEiEydOBHQ1mb799ltWrlzJnj17UKlUTJky5an6JQiC8DYIuRuCARJ37oygplaBJjMXAwsllhVLcjMoGABlpUoikXmVHjVy8jivov7P+vXruXv3LsHBwSiVSqytrcnMzHymtmRZZvHixbRr1y7f9oMHD2JqavpEbfj4+HDnzh199e3bt29z+fJl6tSpg4mJCdnZ2RjdX5o6ISGBcuXKAWBra0twcDBt2rR5ZPtPMyID8Omnn/Lpp58CMHnyZKpWrQpAxYoV9ccMHjyYjh07Fno9KysrACpUqEDXrl05ceIEbm5u+v2nT59GlmVsbGzw9vZm9+7dfPLJJ/o+C4IgvDOu/kNU1AlKagxRJ9fgrglUzDDAtrGu9E3a8eNIRkZIhsWXTog5Mq+Iubl5oSMMhe1LSkqiQoUKKJVKAgICuH79OgDNmzdnx44dZGZmkpqaqh91sbS0xNzcnOPHdYsV+fr66ttq164dP//8MxqNBoBLly6RlpZWaBxt27YlKioq37ZLly6RmppKVFQUkZGRREZG4u3trZ/027JlS31tpoyMDDZu3Ejr1q0B8Pb25osvvuDOnTsAZGdn6ytiP6hPnz76CboPfj1YtfpBsbGxANy4cYMtW7bQu3dvAKKjo/XH+Pn56ecJPSgtLU1/r9PS0tizZ0+B46ZOncqMGTPQaDTk5uYCujk06enphcYjCILwVtJkkLvbm0hNMjXiGmEiK7iJ7uUQ++a6XwhljQYKmW7xKr2TIzLFoWzZsjRv3hw7Ozs6dOiQbwTi4X2TJk2iU6dO2Nvb4+LiQr169QBo2LAhnTt3RqVSUbFiRezt7fVvAa1atYrBgwejUCho2bKlfvugQYOIjIzEyckJWZYpX758oaMcWq2WK1euUKZMmXzbfXx86Nq1a75t3bp1o2fPnnz99df8+OOPDB06lEWLFiHLMv369dOPbnh6ehITE8P777+PLMtIksTAgQOf+15269aN+Ph4lEolS5YswdLSEoCJEycSEhKCJElYW1vrJzbfvn2bQYMG4e/vT0xMjL4/OTk59O7dm/bt2+vb3rp1Ky4uLvoJymq1Gnt7e1QqFQ4ODs8duyAIwhtjlzfXEi6RaVWZ+rEt0FrmUDZFwqCU7rFSTkoK5OZSom7dYg1TkmW5WAN4GVxcXOS812rznD9/nvr16z9326/i0dKjpKamYmZmRnp6Om5ubixfvhwnJyf9dtBNHo6OjubHH3984nbDwsL49ddfWbBgwcsK/akV971+Fi/q++xVO3jwIK1atSruMN4Z4n6/OuJeP6PL+2B9N7D9Hx4XS5OYXRtXMztqXc3FuaM1TTrWIvXwYW4OGkwpzw5YLVjwUu+1JEnBsiy7FLZPjMi8YYYMGUJ4eDiZmZn0798fJycnAP7++29mz55NTk4ONWrUYPXq1U/Vrp2d3WuVxAiCIAjF6PjPYFaR6PhkLqd2xaLcRQwjs5ENDXFopZuXmBF2DgBjW9vijPTtSmQkSeoEdHrvvfeKO5SX5o8//ih0e8+ePenZs+crjkYQBEF4K/VcBydWsODvJLpnarhdKovqOQZUa1UJEzPdyx3KcmUBML0/L7K4vFWTfUXRSEEQBEF4DveuQ2YyyDKn9x+lekJTMkvEUfFGTbSA2/s19Idqou+AJFGievXii5e3bERGEARBEIRnJMuweRDkZJJYcwCH73xMaokETtb4m55nx6CsboplOV2Va21WFgnr1qGwsCjWV6/hLRuREQRBEAThGQWtglsnyHyvG3//VRJJgp31VtD0jjtGSHh0+28drazz59EmJaGsXLkYA9YRIzKCIAiC8K6Lj4B930LVRhjEncNANuei+jipikTei7UlvZoxtWz+W54j7f6bwUa1axVXxHpiROY1tXDhwtd+ATa1Wk2vXr3ybWvVqhUPvvoeGRmZb8G5vFV0bWxscHR0ZNCgQc/dzwMHDuDk5ISdnR39+/cvUM375MmTGBoa6ss0PMzHx0e/Vkz79u2Ji4sDYNKkSahUKvr166c/dt26dSxcuPC54hUEQXjtHJgJudlg1w3lhY0cqlmCUKME6sc2IdYwi77D1fkOT9m1GwDLh9YZKw4ikXlNFXcik7eibVHOnz9Pbm4ugYGBRa4U/LCYmBh69OjBnDlzuHjxIqdPn6Z9+/ZFrnj8JLRaLf3798fX15ewsDBq1KjBmjVr8vUjrzZTYXJychgzZgwBAQGcPXsWlUrFTz/9RFJSEqdOneLs2bMYGRkRGhpKRkYGv/32GyNGjHjmeAVBEF47Wi2YVSCxzlC2b8ghwrgZ/ndLUzqyM82udyVTVYZKpUvqD8+JiyPz3DlQKDBt0qQYA9cRicwrMnfuXBYtWgTAuHHj9PWHDhw4UKBg4qJFi7h9+zatW7fWL/c/bNgwXFxcsLW1Zdq0afpj/f39qVevHs7OzowePVpfX+ju3bu4u7tja2vLoEGDqFGjhn6kYd26dTRq1Ai1Ws3QoUP1SYuZmRnjx4/HwcGBY8eOPbI/Pj4+9O3bFw8PD7Zt2/ZE92DJkiX0799fX9wSoHv37vlqJD2t+Ph4jIyMqHt/ZUl3d3c2b96s37948WK6detGhQoVCj1flmVkWSYtLQ1ZlklOTqZKlSooFAo0Gg2yLJOeno5SqWTevHmMGjUKpVL5zPEKgiC8dhQK4u0m43ekITGZNdhQaRIKZQLqmFJcsLzA/97Pv6RJzr17oFRiXL8+UjGXJ4B3dI7Mnf/7P7LOX3imc3Nyc0ko5H9cifr1qDR5cpHnubq6Mn/+fEaPHk1QUBBZWVloNBoCAwPzFSwEGD16NAsWLCAgIEBfgHHWrFmUKVOG3Nxc2rZty9mzZ6lbty5Dhw7l0KFD1KxZEy8vL30b33zzDW3atMHb25tdu3axatUqQDeSsmHDBo4cOYJSqWT48OGsX7+efv36kZaWRuPGjZk/f/5j78OGDRvYu3cvFy5cYPHixfp6R48SFhZG//79H3vcxYsX6dmzJ1qtFoUif6598OBBfUkCgHLlypGTk0NQUBAuLi5s2rSJmzdvAhAVFYWfnx8BAQGcPHmy0GsplUp+/vln7O3tMTU1pU6dOixZsgQDAwM8PT1xdHSkbdu2WFhYcPz4caZOnfrY+AVBEN4I2lzYOpzkOp+w7bc0yMnC3e0qHS+oKFV9FQcqG5GR2YRFNfOXrsmOjITsbMoM/KR44n7IO5nIFAdnZ2eCg4NJTk6mRIkSODk5ERQURGBgoH6k5lE2btzI8uXLycnJITo6mvDwcLRaLbVq1aJmzZoAeHl5sXz5cgAOHz6Mn58fAO3bt6d06dIA7N+/n+DgYBo2bAjoCj3mjVYYGBjQrVu3x8YSFBREuXLlqF69OlZWVgwcOJCEhATKlCmDJEkFji9s26PY2NgQEhLyRCUKJEnC19eXcePGkZWVhYeHBwb3E82xY8cyZ86cAsnQgzQaDT///DOnT5+mVq1ajBo1itmzZzNlyhQmTpzIxIkTAV3Nqm+//ZaVK1eyZ88eVCoVU6ZMeap+CYIgvFb2TSf3zCZ2BXUmN0OmW61VHLVZStq5Y5gZxaPRlqWLqmm+n+G5yckkbdF9tpi5uhZX5Pm8k4nMo0ZOHudZ6/8olUpq1qzJ6tWradasGSqVioCAAK5cufLY2jzXrl1j3rx5nDx5ktKlSzNgwAAyMzOfKX5Zlunfvz+zZ88usM/Y2FifBDyKj48PFy5cwNraGoDk5GQ2b97M4MGDKVu2LPfu3dMfm5CQoB9VsrW1JTg4mC5dujyy/acZkQFo2rQpgYGBAOzZs4dLly4BuoQrbzJyXFwc/v7+GBoa8uGHH+rPDQkJAaB27doAfPTRR3z33Xf52j99+jSyLGNjY4O3tze7d+/mk08+4fLly9SpUwdBEIQ3zq0gOLoIVL3haAptLX+jTN95uGjKUtfoCreBFON4BjVunu+0exs3khoQQMmmTTEoVap4Yn+ImCPzCrm6ujJv3jzc3NxwdXVl2bJlODo6FjpiYW5urp8Em5ycjKmpKRYWFsTExLBz505AN3Jx9epVIiMjAd3jnjzNmzdn48aNgO7DPS+5aNu2LZs2bSI2NhbQJRrXr18vNF5vb2/9qE4erVbLxo0bCQ0NJTIyksjISLZt24aPjw+ge2tp3bp15BUjXbNmjX6ez8iRI1mzZg3Hjx/Xt7dlyxZiYmLyXSNvRObIkSOEhITk+3o4iQH0fcnKymLOnDl89tlngC4BzIuxe/fuLF26NF8SA2BlZUV4eDh3794FYO/evQUSy6lTpzJjxgw0Go1+PpFCoXjt3yoTBEEoVFocuX8OItOkFgZKQz40HUOtzp3RlGnA4T8uYm52DbQGlDKoQkXz/5KV3NRU4pf9AkDZAY+fJvCqiETmFXJ1dSU6OpqmTZtSsWJFjI2NcS1iaG7IkCG0b9+e1q1b4+DggKOjI/Xq1aN37940b67LkE1MTFi6dCnt27fH2dkZc3Nz8sozTJs2jT179mBnZ8eff/5JpUqVMDc3p0GDBsycORMPDw9UKhXu7u5ER0cXGkNoaCiVKlXKty0wMBArKyuqVKmi3+bm5kZ4eDjR0dEMGTIEc3NzHBwccHBwIDU1lQkTJgBQsWJFfH19mTBhAjY2NtSvX5/du3c/d4XruXPnUr9+fVQqFZ06ddJPpH4UtVoNQJUqVZg2bRpubm6oVCpCQkKY/MCI3datW3FxcaFKlSpYWlqiVquxt7cnMzMTBweH54pbEAShOGgPLWTn9Y/ZmTgJOfh3jBr2IsVxCJ2/O8ihW/eItIgARS69GnyY77yY/5uNNjUVg9KlMW3evPDGi4GU95vz28TFxUV+cC0T0E1yfdwjnCfxrI+WXpbU1FTMzMyQZZkRI0ZQp04d/XwRAwMDDA0NOXbsGMOGDdM/RnlS7dq1Y/fu3S8n8Cfwut3rJ/Givs9etYMHD9KqVaviDuOdIe73qyPudX6yVuYfn4ucC7xNi1K/4tBQCd1/ZdKKYDZcjaFv2dL4sgnjCntZ034NThWdAMgIDSWylxfk5lJ+3DjKDR1SoO2Xea8lSQqWZdmlsH3v5ByZt8mKFStYs2YN2dnZODo6MnToUABu3LjBRx99hFarxcjIiBUrVjx128WZxAiCIAgvlvbKQfbtUnI5LAtVuaM4lAyA949yMvgOWyJisDcxZl92BmUr3cWoRGnsy9vrz81NTUVRsiSyLFPaq9cjrvLqvVWJjCRJnYBO77333mOPfVuMGzeOcePGFdhep04dTp8+XQwRCYIgCK+dmyc4sCSAyxktcakeRKPs+dBjI2mKSkzb/A+SBN3b1GTWiR+xLBFBMys3lArdmlmyVktOVBTalBQqz5r12kzyzfNWJTKyLO8Adri4uAwu7lgEQRAE4bWQFgcbPqZF1dLUKl+BWldnQZspaGu/z47vg7io1eBRpzxbLgZRovwBMnLBrqyutExqYCAJa9aSceE8xra2WHT9sHj7Uggx2VcQBEEQ3lJyTi4XViwmJz0V4y7/R63IaWDjCa4TOL3nOvGRKXzXvA4u9cpxPjlQf56qvAptVhbRU78m4+xZtHHxVJo+DekR63IVl7dqREYQBEEQhP8ELt9D6IWWZKiq43jwO1AYQNtpREcksXP7FdT25fHoUJv2iwIpaXGNEoamGCoMsC9nz90FC8i5cweMjDBxdMTE3v7xFywGIpERBEEQhLdQ2KEoQs+WwFYtoS61Hy6dhO6/klaiJrtWnWRHqRxMapXg6qGrXEu4g1m56ygkMxpWakj6sWPEr1yFwtwcydAQqx8WFHd3ivT6jRG9w4q74vWTUKvV+tVy87Rq1YoHX3ePjIzEzs5O//cTJ07g5uaGjY0Njo6ODBo06Ln7eeDAAZycnLCzs6N///7k5OTk23/y5EkMDQ3ZtGlToecHBwdjb2/Pe++9x+jRo/UL+E2aNAmVSkW/fv30x65bt46FCxc+V7yCIAiv0s0/V3B4w0Wq1LHEtf5ZpEt/g9sXaBt0Zf/qcP7NyCCGXExNlPwUcIUmNjLVzauTqknFvqwdiX5bMbC0vD/BdybKh9YUe52IROY1UtyJTN6qtUU5f/48ubm5BAYGkpaW9kRtxsTE0KNHD+bMmcPFixc5ffo07du3169a/Cy0Wi39+/fH19eXsLAwatSowZo1a/L1Y9KkSXh4eBTZxrBhw1ixYgWXL1/m8uXL7Nq1i6SkJE6dOsXZs2cxMjIiNDSUjIwMfvvtN0aMGPHM8QqCILxK2pCNHPtHxrREGu3cEzE4NBPqtINW3hzfFsHV8wkcL6XFqbolQdcTAPi+Yxe61+kOQIuqrpTq0pnclBTM3m+L+RMsMlqcRCLziixbtgy1Wo1araZmzZr6ZfvzLFq0iNu3b9O6dWv9vmHDhuHi4oKtrS3Tpk3TH+vv70+9evVwdnZm9OjRdOzYEYC7d+/i7u6Ora0tgwYNokaNGsTFxQG6UYVGjRqhVqsZOnSoPmkxMzNj/PjxODg4cOzYsUf2wcfHh759++Lh4cG2bdueqN9Lliyhf//+NG3aVL+te/fuVKxY8YnOL0x8fDxGRkbUrVsXAHd3dzZv3qzfv3jxYrp166Yvhvmw6OhokpOTadKkCZIk0a9fP7Zu3YpCoUCj0SDLMunp6SiVSubNm8eoUaNQKpXPHK8gCMKrIMsy8uV9KP4aTccGO+gxuCwl/+oLltWh6zJO77vFqd03uFCrBInZOXRRW7HvfCzDW1lT0cKQywmXaBekpaa2DLGz/g8Dc3MqT59e3N16rHdyjkzgxkvE3Ux9pnNzc3MLLaxYrpoZrh/VLfK8zz77jM8++wyNRkObNm34/PPP8+0fPXo0CxYsICAgQF9kcdasWZQpU4bc3Fzatm3L2bNnqVu3LkOHDuXQoUPUrFkTLy8vfRvffPMNbdq0wdvbm127drFq1SpAN5KyYcMGjhw5glKpZPjw4axfv55+/fqRlpZG48aNmT9//mP7vmHDBvbu3cuFCxdYvHgxvXv3fuw5YWFh9O//+JoceYUiH5RXNPLhQpHlypUjJyeHoKAgXFxc2LRpEzdv3gQgKioKPz8/AgICOHnyZKHXioqKomrVqvq/V61alaioKMzNzfH09MTR0ZG2bdtiYWHB8ePHmTp16mPjFwRBKG5BfwRy50QobWraYdp2BGztAyalod82bt2U+HdrBFVVZdmScY8P1VU4dzsJIwMFtarfoMUffRnyl4bmZ7TcyfyK7GvXsPphAYb3P49eZ+9kIlOcxowZQ5s2bejUqdNjj924cSPLly8nJyeH6OhowsPD0Wq11KpVi5o1awLg5eXF8uXLATh8+LC+yGP79u0pXbo0APv37yc4OJiGDRsCkJGRoR+tMDAwoFu3bo+NJSgoiHLlylG9enWsrKwYOHAgCQkJlClTptCil4Vte5S8QpEPKqpEgSRJ+Pr66ksxeHh46JPLsWPHMmfOnAJVs5/UxIkTmThxIgCDBg3i22+/ZeXKlezZsweVSsWUKVOeqV1BEISXKfTgLU4E5vCeeS4lPSfBn/2hhDn03UpCemn8fw6iVHkT2vVvQDsjBZFxaXguCqRvkxqciPWla2AOzc9kk9zCHgIDMXd/n1IdOhR3t57IO5nIPGrk5HGep/7P6tWruX79Oj/99NNjj7127Rrz5s3j5MmTlC5dmgEDBpCZmflM15Vlmf79+zN79uwC+4yNjQsdYXqYj48PFy5cwNraGtBV5N68eTODBw+mbNmy+uraoKuonTeqZGtrS3BwMF26dHlk+08zIgPQtGlTAgN1ax7s2bOHS5cuAbqEK28yclxcHP7+/hgaGuarem1lZcWtW7f0f7916xZWVlb52j99+jSyLGNjY4O3tze7d+/mk08+4fLly9SpU+cxd0sQBOHVuXU+gcN/XqZ6gzK8/1FnpD8+BONSMHAXaVJl/l4YjEIh4dLfhhxDCTOlAcv+icBQoWCQW02+XLID78PZHKkv0eLqXQxrVKfKd98Vd7eemJgj84oEBwczb9481q1bV+Rogbm5uX4SbHJyMqamplhYWBATE8POnTsB3cjF1atXiYyMBHSPe/I0b96cjRs3AroP97zkom3btmzatInY2FhAl2hcv3690Bi8vb31ozp5tFotGzduJDQ0lMjISCIjI9m2bRs+Pj6A7q2ldevW6d/8WbNmjX6ez8iRI1mzZg3Hjx/Xt7dlyxZiYmLyXSNvRObBryNHjhASElIgiQH0fcnKymLOnDl89tlngC4BzIuxe/fuLF26NF8SA1C5cmVKlSrFv//+iyzLrF27tkCiNXXqVGbMmIFGo9HPJ1IoFK/9W2WCILxbLh+9yo5FwZSyAHevyhhs7gfpCdBzHVklrPBbcIr05Gw6DFcx4e9zfLAokLO3Etl25jZ9mlQnRXudzoc1JFkqybAwRr59h4pffIHC1LS4u/bERCLzivz0008kJCTQunVr1Go1gwYNKnDMkCFDaN++Pa1bt8bBwQFHR0fq1atH7969aX6/ZLqJiQlLly6lffv2ODs7Y25ujoWFBQDTpk1jz5492NnZ8eeff1KpUiXMzc1p0KABM2fOxMPDA5VKhbu7O9HR0YXGGRoaSqWHXrMLDAzEysqKKlWq6Le5ubkRHh5OdHQ0Q4YMwdzcHAcHBxwcHEhNTWXChAkAVKxYEV9fXyZMmICNjQ3169dn9+7dz13Veu7cudSvXx+VSkWnTp1o8wSz6tVqtf7PS5cuZdCgQbz33nvUrl2bDg8MoW7duhUXFxeqVKmCpaUlarUae3t7MjMzcXBweK64BUEQXpjUu1idHEJ9k/1063gb43VtIf4K9FgNVV0I3HiZpNgMPIer2HozjtCoJEa3qcNkv1BMjQwZ3aYOZ+6eYX5XBTvet6Dt8QxKdeyIWdu2xd2zpyLl/Rb9NnFxcZEfXNcEdBNe69ev/9xtP8+jpRclNTUVMzMzZFlmxIgR1KlTRz9fxMDAAENDQ44dO8awYcMKzDt5nHbt2r02Va9fh3v9tF7U99mrdvDgQVq1alXcYbwzxP1+dd7We333fARl9g/AIOE8dFkCRxdD/GXouxVqNOVyUAx7Vp5D/X417Dta02jWPprUKkvjmmWYs+siP3asTaN9vtzt68HFxEtUGzQHZenSOP61D0XJks8U08u815IkBcuy7FLYvndyjsybbsWKFaxZs4bs7GwcHR0ZOnQoADdu3OCjjz5Cq9ViZGTEihUrnrrt1yWJEQRBEAoXceQiu36PwqZkW97/9HM4OAfuRULPdVCjKSkJmRxcd4GyVmY0/rAWk7aEkanR0qdxdcb4htC+pjmqRdNIDAujpqsrmiUbMMwGg//76pmTmOIkEpk30Lhx4xg3blyB7XXq1OH06dPFEJEgCILwKiTGpnPgzzuUNMnBbUBjOLEY4i5Bnz/hvbbIsszBdRfIzZVpN9gWhUJBGVMlQ1vWYvuZaEpkpDN2+1IyI69Sau4M/K/6Y30tEr8PLJjR2LO4u/dMxBwZQRAEQXgD3Iu8w+bZx5EUEl0mNMEo9De4fgQ+/Bne081rCd55nRvhCTTpUovSlUxRKCS++qAB1UqbsCMkih+vbEK+FkHVxYsJMIlkptEeDjeQMOji8dTLZrwuRCIjCIIgCK+7tHiO/7IZOTOV/42sRZkTk+Dybnh/Ojjolq64czWJ4zuuUktdHoc21Zjtf54DF2KITc7ku50XaWZtQTVjKD96NGauLdh90ocSGvBtqcDduuiSLq878WhJEARBEF5nydGwtgutjWO497+FlAn9Ds78Aa4ToPlYAGKuJfP3krOYlzam9cf1+OfyXX45dJV76dn8fuw6Gk0O0/+npvrHvyCVLMnN6V8TWjODarmW3CmZRePKjYu3j89BjMgIgiAIwmtKTovnzA9zyb4XR4meS6iUuA1O/w5NR0KbKSBJpCdns2t5KAaGEh1HOXA1OYMxviHUKmdKzbKmpP3zD2vOrMJak4SBuTmJ6//gwBk/cg0kbhtn0MKqBUrFm1tPTiQyr5mtW7cSHh5e3GE80tixY7GyskKr1eq3TZ8+nXnz5uU7ztraWl+08s6dO/Tq1YvatWvj7OyMp6enfjXeZ3X9+nXatm2LSqWiVatW+tV6Q0JCaNq0Kba2tqhUqnyLBj5o2bJl2Nvbo1aradGihf6+HzlyBJVKhYuLC5cvXwYgMTERDw+PfH0WBEF4mTRZuexZcpTD0R25WON72PcNhG+H1lPAYyZIEpqsXP5ecoaMVA0dPlORaaLg41XHMVEa8HWnBvhsOYz3KR/KG+RiYFma9FOniZkzh6jG1pgpzcjWZqOuoC7urj6XtyqRkSSpkyRJy5OSkoo7lGdW3IlMTk7OI/drtVr8/PyoVq0a//zzzxO1KcsyXbt2pVWrVkRERBAcHMzs2bMLrO77tCZMmEC/fv04e/YsX3/9Nd7e3gCULFmStWvXcu7cOXbt2sXYsWNJTEwscH7v3r0JDQ0lJCSEiRMn6gt5zp8/H39/fxYuXMiyZcsAmDlzJpMnT37mGk6CIAhPQ87NZc+qc1y5ZopLU7C7Ow1SY6H3Rmj5hT6J2bbwNLE3Unh/QAMq1izF8WvxZOdoWfCRAz/6HmV24M+YlDCk2pKfyIm+zc1hwzCsUIEvR/zBANsBALhULHR5ljfGW/VTWZblHbIsD8lb6fZ1M2PGDGxsbGjRogVeXl4FRjCOHj3K9u3b+eKLL1Cr1URERLBixQoaNmyIg4MD3bp10y+RHxERQZMmTbC3t2fKlCmYmZkBukRj+PDh1KtXD3d3dzw9Pdm0aROgK5PQsmVLnJ2dadeunX5131atWjF27FhcXFz48ccfH9mHgwcPYmtry7Bhw/QlCh4nICAApVKpLyMA4ODggKur65PduCKEh4frV/Rt3bo127ZtA6Bu3br6ekhVqlShQoUK3L17t8D5pUqV0v85LS1NP2NfqVSSnp5Oeno6SqWSiIgIbt68+VYuqiUIwutHjr3IiZkziDwbR+M25jSOHYKUEa97xbrO+7pjtDL/+Fwk5loyHp/a8p6zrhBwV8eq7PvcjR92nOGTXT9TOjeT6st/wcDCgusDPkGSJKqtXIGBpSWXE3Ujzg3KNii2vr4I7+xk356/HCuwraOqMn2bWpORncuA304U2N/duSrtbSxJSMtm2LrgfPs2DG36yOudPHmSzZs3c+bMGTQaDU5OTjg7O+c7plmzZnTu3JmOHTvSvXt3ACwtLRk8eDAAU6ZMYdWqVYwaNYoxY8YwZswYvLy89KMGoKtjFBkZSXh4OLGxsdSvX5+BAwei0WgYNWoU27Zto3z58mzYsIGvvvqKX3/9FYDs7GweXg25MD4+Pnh5edGlSxcmT56MRqNBqXz0s9WwsLACfS2Kq6urvt5UXtFIgHnz5vH+++/nO9bBwYEtW7YwZswY/Pz8SElJIT4+nrJly+qPOXHiBNnZ2dSuXbvQ6y1ZsoQFCxaQnZ3NgQMHAF29qX79+mFiYsLvv//OhAkTmDlz5hPFLwiC8FzirsDqjtxOGEdN60ycIoeDLMOQAKjw36rhR7Zc4eK/d3DxtKaOS0Ui49K4kZBOk1pl+eP4Dc7fTKB8HWuseoykpKMjt70nkxsfT40/1rM2bT+Hd35DVEoUblXd3tjXrvO8s4nMq3bkyBG6dOmCsbExxsbGdOrU6YnOCwsLY8qUKSQmJpKamkq7du0AOHbsGFu3bgV0j0jyahsdPnyYHj16oFAoqFSpkr5448WLFwkLC8Pd3R2A3NxcKleurL/Ow5WnC5OdnY2/vz8LFizA3Nycxo0bs3v3bjp27FjkP4Sn/QeSV9EaHl+iYN68eYwcOZLVq1fj5uaGlZVVvkre0dHR9O3blzVr1hT5SGjEiBGMGDGCP/74g5kzZ7JmzRrUajX//vsvAIcOHaJy5crIskzPnj1RKpXMnz+fihUrPlW/BEEQHuvqP8ibByNps/HoZobJPwNRGJWBXpvzJTFXT9/lzL6b2LpZ0ahTTW4mpNNn5XHSsnMY7mrNr7vO8n6j92jSszuSJJG8azdJfn6U6d+fkk5O7PCbRo42h9iMWMZYjynGDr8Y72wi86gRFBMjgyL3p6SkUMbU6LEjMC/KgAED2Lp1Kw4ODqxevZqDBw8+UzuyLGNra8uxYwVHogBMn6DS6e7du0lMTMTe3h6A9PR0TExM6NixI2XLli1QiDIlJQVLS0tsbW31j7ce52lGZKpUqcKWLVsAXf2pzZs36ytlJycn88EHHzBr1iyaNGny2Ov26tWLYcOG5dsmyzIzZ87E19eXUaNG8f333xMZGcmiRYuYNWvWE/VHEAThidwJ5cIvC7iUPRq3jpZY/jMOSteE/tvB/L9CvslxGexbE06ZKqa06PEeqVk5fLYumMT0bJb0duL85xP5+V4kjaZtR5Ik0v79l9tffIGxg4ryY8dwPfk6kcmRqMqpuJV6Czcrt2Ls9IvxVs2ReZ01b96cHTt2kJmZSWpqKn/99Vehx5mbm+s/yEGXDFSuXBmNRsP69ev125s0acLmzZsB8PX1zXedzZs3o9VqiYmJ0Sc+NjY23L17V5/IaDQazp07V2gMfn5++omzD/Lx8WHlypVERkYSGRnJtWvX2Lt3L+np6bi5ubF9+3Z97Fu2bMHBwQEDAwPatGlDVlYWy5cv17d19uzZfKMveQIDAwkJCSEkJIQjR47o//xwEgMQFxenf4to9uzZDBw4ENCNHHXt2pV+/frpH9EVJu+NJIC///5bP68mz9q1a/H09KRMmTKkp6ejUChQKBT6eUqCIAgvyp20agSkjCa3VA1MD3+pS2IG/JUviUlPzmb7jyEgg+cwe2SFxCif05yPTmZudwd2rtxMq6vHKaeyxaiUOemnT3Nr+AgMq1Sm2s8/ozAxweeCbm5jfGY81qWssTS2LJ4Ov0AikXlFGjZsSOfOnVGpVHTo0AF7e3sKm5Tcq1cv5s6di6OjIxEREcyYMYPGjRvTvHlz6tWrpz9u4cKFLFiwAJVKxZUrV/RtdevWjapVq9KgQQM+/vhjnJycsLCwwMjIiE2bNjFp0iQcHBxQq9UcPXq00FgjIiLyTYQF3ejLrl27+OCDD/TbTE1NadGiBTt27EClUjFy5EhatGiBWq1m2bJlrFy5EtA9XvLz82Pfvn3Url0bW1tbvL29qVSpEs/j4MGD2NjYULduXWJiYvjqq68A2LhxI4cOHWL16tWo1WrUarW+CvjXX3/N9u3bAfjpp5+wtbVFrVazYMEC1qxZk6+/q1evZsSIEQB8/vnneHp6Mnbs2HyTlgVBEJ5LxAESw06za0UYJY2zaacdgbKqrS6JMaugPyw7I4etC06REp+J53AVFuVLsudcDEeuxOHdoT65IcH0+XsJmZWrYfPDXDQ3bnDrs2EYlC1L9ZUrMSxTBoDL9y5jWcKSqNQoGlVqVFy9frFkWX7rvpydneWHhYeHF9j2LJKTk5/53JSUFFmWZTktLU12dnaWg4ODn7mttLQ0WavVyrIsyz4+PnLnzp0LXCcuLk6uVauWHB0d/VRt9+nTR46NjX3m2F6U57nXxeVFfZ+9agEBAcUdwjtF3O9X57W915osWd4xTk74qp786wg/eeWIv+TYySpZ3tBPlrNS8x2am6uV/ZedlZd8tl++dvZuvn0JqVny1agE+V97ZzmwoaucFX1H1iQkyFc6eMoXnF3kzIir+Y7feXWnPPGfibLdajs57G7YC+3Sy7zXQJBcxGf+OztHpjgMGTKE8PBwMjMz6d+/P05OTs/cVnBwMCNHjkSWZSwtLfVvHwF07NiRxMREsrOzmTp16lOPfKxbt+6Z4xIEQRAe49512DoMrh/BxHEI5Y7H0Ez5E2U7fgaNh8FDLycc3XSFq6fv0uTDWljbl+Ovs7e5l67h48bVAfhsQyjdKtXDfdo4JIXE9d59yL55k2pLl1CiVs18bbWv2Z491/dgYmiCbTnbV9bll0kkMq/QH3/88cLacnV15cyZM4Xue9YJwYIgCMJLlngDVrRGm52F5DYJ4+Bf6WSaAF2XgeqjAodHhsZx5sBNGjSvjFO7GgRcjOXzDWewr2pBj/fMmP37Ua7FG9Lgpx+oUaMUkb280ERHU+2XZZg1b56vrX3X91GhZAVOxZyihVWLV9Xjl04kMoIgCILwsuVkgUIJFtXQuk1m/wFz7vml0KWGJSUG+kC1hgVOSUvKYt9vujeUmveow6kb9xi+7hS1ypuyvKc953p54Xk3nqr/t4oWdcsTM/s7ss6fp+pPiwskMbnaXOacnIOpoSnxmfFvz/wYxGRfQRAEQXi5Uu/C6o4QeQjS7nJ4TwaXbpTHumIMJT7bWWgSo9XK7P31HJqsXNwH2hKXqWHkH6cpb16CNQMbcnvqVEreiOBIWy8+c69H1tVrJPz+OxZdumBeyFueR28f5U7aHeqX1a1H06jy25PIiBEZQRAEQXhZUmNhZVtIiYH4a4T99juhd/tQr1YCDcd/CQ8s4plHlmWObrpC1MVEWvWxoVxVM3xP3ECTq+WXvs7EzF+Acv9u9tm1ZeDUwRhmZXBt9CgUJUtS/vNxhYax7OwyShmVQiHpxi9qlqpZ6HFvIpHICIIgCMLLEHse/ugJydHQZiq3dvjyz90vsKphiNvYrkiFJDEAYf9EcebATWxdq1C3mW4F9l6NqvM/p6rcOR5M2oZ1HK/lQs9Vc6lgYcLtr74i+0oEVX9eirKQVcdztbncTL5JFbMqHLp1CPca7m98WYIHiUdLr5nirn79JMaOHYuVlZV+MTqA6dOnFyiCaW1tTVxcHAB37tyhV69e1K5dG2dnZzw9Pbl06dJzxXHjxg1at26No6MjKpUKf39/QLcg3ieffIK9vT0ODg5FTn7+888/sbW1RaFQ5KszdeTIEVQqFS4uLvpF8xITE/Hw8MjXZ0EQhCJpMnSPk7JTQe0F+6ZRsXwaDVxK8cH45iiNCk9i7t5I4fDGy1R+z4KmPd6jx7Jj7Aq7A0BiejaDjqexWv0hLst+pIKFCUnbt5O0eQtlPh2I+f2SNA+7nXYbGRnHCo4kZiXSqdaTlch5U4hE5jVT3IlMTk7OI/drtVr8/PyoVq0a//zzzxO1KcsyXbt2pVWrVkRERBAcHMzs2bOJiYl5rlhnzpzJRx99xOnTp/H19WX48OEArFixAoDQ0FD27t3L+PHjC01A7Ozs2LJlC25u+Zfonj9/Pv7+/ixcuFBfkHPmzJlMnjy5yJpNgiAIAGi1uiKPShNwHgBl3iMjyI/k6h+hHLKT1oMaFZnEpCVlsWfVOYzNlHQYas/0v84TcjORDE0OsUGnGf3dFm7cy8Dz28+xq16GjLBzRE+bjrG9PRXGji0ypGrm1djXYx+p2amYKk1xrer6cvpeTMRP5Vdo1qxZ1K1blxYtWuDl5VVgBOPo0aNs376dL774ArVaTUREBCtWrKBhw4Y4ODjQrVs3/fL4ERERNGnSBHt7e6ZMmYKZmRmgSzSGDx9OvXr1cHd3x9PTU1/nKDg4mJYtW+Ls7Ey7du30tZFatWrF2LFjcXFx4ccff3xkHw4ePIitrS3Dhg3Dx8fnifodEBCAUqnMtyKug4MDrq7P949JkiSSk5MBSEpKokqVKgCEh4fTpk0bACpUqIClpWWhlb3r16+PjY1Nge1KpZL09HTS09NRKpVERERw8+ZNWrVq9VzxCoLwlrsXCX/0gIv+EBUMQavQRodyoMTP7IoehGxkVuSp2Zk57Fh8hpSETNw/tWXxkav4nLjBpy1q0qGCghtDPmPw7p9ZN8CFlnXLkx0ZyY2BAzGwtKTqjwuRlMpC203JTiFNk4aExM7InTSr0gxDxds1q+Tt6s3T+O2DgttsP4RGgyE7Hdb3KLhf3Rve6wxp8bCxX/59n/z9yMsFBwfj6+tLSEgIOTk5ODk54ezsnO+YZs2a0blzZzp27KivEWRpacngwYMBmDJlCqtWrWLUqFGMGTOGMWPG4OXlpR81AF2No8jISMLDw4mNjaV+/foMHDgQjUbDqFGj2LZtG+XLl2fDhg189dVX+oX0srOzC/2wf5iPjw9eXl506dKFyZMno9FoUBbxDyhPWFhYgb4W5WmKRk6fPh0PDw8WL15MWloa+/btA3RJ0vbt2/Hy8uLmzZsEBwdz8+ZNGjV6sln63t7e9OvXDxMTE37//XcmTJjAzJkzn+hcQRDeURf8wW+o7jVri6oQ5keO0pJ9Fj8TGZ5Fs/9VKnJeiizLHFh7noSoVDoMU3FLqeXnfyLoqKrMRIdShHbvhUFWBvcmz6Bt7fLkpqYR9fl40Gqp8duvKO//EleYbVe24XPBh2HqYeRoc2hv3f5l3YFi8+4mMq9YYGAgXbt2pWTJkgB07tz5ic4LCwtjypQpJCYmkpqaSrt27QA4duwYW7duBaB3795MmDABgMOHD9OjRw8UCgWVKlWi9f1nphcvXiQsLAx3d3cAcnNzqVy5sv46PXv2fGws2dnZ+Pv7s2DBAszNzWncuDG7d++mY8eORf4DfdoJZQ8WkkxJScHc3LzIY318fBgwYADjx4/n2LFj9O3bl7CwMAYOHMj58+dxcXGhRo0aNGvWDIMiJtUVRq1W8++//wJw6NAhKleujCzL9OzZE6VSyfz586lYyIQ6QRDeQdpcOLIQDsyC8nWhTG0IXo22goqdmXO5EZ5O8+7voX6/epFNRJy6S8SpuzTqVJOaqnIcOhqJvZUFMzvU4Xyfj1EkJ3Fg6DeM7+OBnJ3NrWHDyLxwgaqLF2Fkbf3I8H479xuWJSw5E3sGpUJJq2qtXmj3XwfvbiLzqBEUo5JF709JAdOyjx2BeVEGDBjA1q1bcXBwYPXq1c+8aq8sy9ja2uqrXz/M1NT0sW3s3r2bxMRE7O3tAV1hRRMTEzp27EjZsmX1j6rypKSkYGlpia2trf7x1uM8zYjMqlWr2LVrFwBNmzYlMzOTuLg4KlSowA8//KA/rlmzZtStW/eJrv8gWZaZOXMmvr6+jBo1iu+//57IyEgWLVrErFmznro9QRDeQtePwP4ZUMddN8H3wl/QfCznDD/lxoYrtOhRB4e21Yo8PSYymQO/n6eslRkO7rpkp38za/o3s+bGHxspcfUSq9sP45thul9+78ycRfrJk1T+bjbmbds+MrRrSdeITY/Fo4YHh6MO07BSQ4wMjF5c318TYo7MK+Lm5sbWrVvJyMggJSWFHTt2FHqcubm5/oMcdMlA5cqV0Wg0rF+/Xr+9SZMmbN68GQBfX1/99ubNm7N582a0Wi0xMTH6xMfGxoa7d+/qExmNRsO5c+cKjcHPzw9vb+8C2318fFi5ciWRkZFERkZy7do19u7dS3p6Om5ubmzfvl0f+5YtW3BwcMDAwIA2bdqQlZXF8uXL9W2dPXs23+hLnsDAQEJCQggJCeHIkSP6Pz+cxABUr16d/fv3A3D+/HkyMzMpX7486enppKWlAbB3714MDQ1p0KBBoX19lLVr1+Lp6UmZMmVIT09HoVCgUCj085QEQXiH5WTp/lvTDfpuhcSbEBkIHeaC+zfUb2GFW6+6j0xi4m6lsv3HEIxKGNDmk/oMWR/MtpAoADI1uYyKr8wUt+F86v0JxkoD0v49TuLGjZT5dCCWH3742BC3R2wHoJ11OyKTI2lSucnz9vq1JBKZV8TJyYmePXvi4OBAhw4daNiw4EqOAL169WLu3Lk4OjoSERHBjBkzaNy4Mc2bN6devXr64xYuXMiCBQtQqVRcuXIFCwsLALp160bVqlVp0KABH3/8MU5OTlhYWGBkZMSmTZuYNGkSDg4OqNVqjh49WmgMERERlCpVKt+29PR0du3axQcf/De3yNTUlBYtWrBjxw5UKhUjR46kRYsWqNVqli1bxsqVKwHd4yU/Pz/27dtH7dq1sbW1xdvb+6mLWT5s/vz5rFixAgcHB7y8vFi9ejWSJBEbG4uTkxP169dnzpw5/P777/pzBg0apJ8L5OfnR9WqVTl27BgffPCB/rFdXn9Xr17NiBEjAPj888/x9PRk7Nix+SYtC4LwDrrgDwtVcGIlnFgBG/vqJvr28uF2mR7E3UrBUGmAfauqRTaRm6tl1y+hGBop+HC8E/P+vcrBi3e5m5JFUtg5Rn3nx5moZD4Z2Y26Fc3JiYsjavx4lFZWlB858rEhyrLMrmu7sC1rS3SabrTcueKTzVV84xRVFvtN/nJ2di5QAjw8PPxpq4YXKjk5+YW0M23aNHnu3LnPfH5aWpqs1WplWZZlHx8fuXPnzvp9KSkpsizLclxcnFyrVi05Ojr6qdru06ePHBsb+8yxvSgv6l6/Si/q++xVCwgIKO4Q3inifr86L/Re5+bI8qF5sjytlCz/1EiWf/1A9+ffPpDl2AtySkKmvOqLQPnvpWce29RJ/2vyT0P3yxGnY+UlAZflGpP+kqdtC5MzbkfLxxu1kA84NpU3/XtVlmVZ1mo08rU+feRwO3s54wl/xuRqc+XQu6HyxYSL8oSDE+SG6xrK2bnZz9X9x3mZ39dAkFzEZ/67O0fmDRccHMzIkSORZRlLS0v920cAHTt2JDExkezsbKZOnfrUIx/r1q170eEKgiC82ZKjYfMguH4YqjWGmPMQdxncZ0DTEWhliT0LTpOZko2Lp/Ujm7p9JZETO65Ry7E8Fw1ymLv7Iq1tyuPtVpWT//PCLCWRoDH/x/DGujICcUt/JiMomMqzZmJcv/4ThauQFNiVsyMmLYZdkbvoU78PSsWj3zB9U4lEpphMnz79uc53dXXlzJkzhe571gnBgiAIQhHuXYOoIKjdFiL2Q2lr8NoLFXSP/I/7XSE6IolWfWyoUKNUkc1osnI5uO4CphZGtOlbjwMRcTS0LsPCng4EfzwQy+jrHBswiWFDOgKQeugQcUuXUqpjRyz+978nClWj1TDj2Aw61e7EwZsHAehdr/fz9P61JubICIIgCEJhtFq4HaL7c9VGuom9EftB3QeG/KNPYuKjUjm1+wZ1GlbE1tXqkU0G7Ywk4U4a1TyrUaKkkg72ldkwpAnHVm+mdPgpAtr2ZtDEvkiSREZICLdGjaZEnfeo/O03T7ycxcnok/hd8SMuI47Tsacpa1yW6qWKfv37TScSGUEQBEF4WE4WbOgDy1tB6CZY2wUu74E2U6HLEjCx1B9apoopTT6sReu+9YpsDuBqyF2C91znUBUFA/8O5eDFWAD+DL7FZ9dLsfGDYfSf+wWSJJFz7x5RE77AoHRpqq1cheL+GmRP4sDNAwDUMK9BaFwofer3eeruv0nEoyVBEARBeFDSLd3q7VHBULc9bB0BBkro+AO4DNQfJssymqxcjIwNcW5v/cgmUxIyCVh3gVNl4UR6OkPdatHivXLs2RLATwciaaKqx4T+7TEtYYicm8v1j/uSExND9dW/oaxY4YlDl2WZXZG7aFipIf9E6erhuVV1e8xZbzaRyAiCIAhCnjMbYMdo3Yq9ltZwaRfUagWdFkHpGvkOvRpyl/2rz/PBCBVWdUsX2WROdi7+P5/lHzmTQ5psOqoq82WHevwTehOjmVNYpEmj9vQATEvoPpLjV6wgOyKCipO9KfmE5V3yHL9znKSsJNpUa8Pa8LU0rtQYmzIFa8q9Td6qR0uSJHWSJGl5UlJScYdSQGJiIkuXLn3qfa+LuLg4lEplvrpOgL5YZZ7Vq1cz8oE1DtauXYudnR329vY4OjoWKJT5LH788Ufs7OywtbVl4cKF+u3Tp0/HysoKtVqNWq3G39+/0PMHDhxIhQoVsLOzy7d90qRJqFQq+vX7r47WunXr8l1DEIS3nFFJKFcHFAaQkaBLYPpuLZDEpCdnE/D7BUwtS1CplsUjm/x321WuRCVztISGD+wrs+AjNTvPRHF1zHgqpidQecEPmJfTJULZN24Qt/RnzFq2pHTfvk8dfnZuNu2s2+FcwZnotGjer1FwMdG3zVuVyMiyvEOW5SF5i8O9Tl7nRCYnJ+exx/z55580adLkiSteA+zcuZOFCxeyZ88eQkND+ffff3ne/zdhYWGsWLGCEydOcObMGf766y+uXLmi3z9u3Dj9asCenp6FtjFgwAB9aYM8SUlJnDp1irNnz2JkZERoaCgZGRn89ttv+kXxBEF4SyVchZOrIFejW6H3TqjuraTPAsG5Pzw0yVarldm/JhxNVi7tBttiYFj0R+ndGymcPXCTRg0r4zukCYu9HNkefIPYsWNoGh2G+fCRVHTX1cSTs7N1xSANDKj09dSnrlUHusdI81rOI+BWAACOFRyfuo03zVuVyLzOvvzySyIiIlCr1XzxxReP3Jeamkrbtm1xcnLC3t6ebdu26Y+dMWMGNjY2tGjRAi8vL/0Ix8mTJ1GpVPo28kYbcnNz+eKLL2jYsCEqlYpffvkF0L2i7erqSufOnZ9o+X4fHx/mz59PVFQUt27deqI+z549m3nz5lHlfmXWEiVK6Ct5P6vz58/TuHFjSpYsiaGhIS1btmTLli1P1YabmxtlypTJt02hUKDRaJBlmfT0dJRKJfPmzWPUqFGPre4tCMIb7MwGWNIY9k6DXzvAbm+o3Qb6bdclM4UI8o/kxrkEmnd/j3JViy5sq8nOZeLKk5wx0+Laoy4u1mXYde4OBxasoPGdcEqNn0DV0f/9ohT7w0Iyw8Ko/O23KK0e/fZTYc7Hnyc6VbeK78GbB1GVV731j5XgHZ4j88muTwpsa2fdjl71epGRk8HwfcML7O/yXhfaVmzLvcx7fH7w83z7fmv/2yOv99133xEWFkZISMhj9+Xk5ODn50epUqWIi4ujSZMmdO7cmaCgIDZv3syZM2fQaDQ4OTnhfP/56SeffMKKFSto2rQpX375pb7tVatWYWFhwcmTJ8nKyqJ58+Z4eHgAcOrUKcLCwqhZs+YjY7958ybR0dE0atSIjz76iA0bNjB+/PhHngO60RPnJ3i+u379eubOnVtgu7W1tb7Cdx47Ozu++uor4uPjMTExwd/fHxcXF/3+n376ibVr1+Li4sL8+fMpXbro59YPMjc3x9PTE0dHR9q2bYuFhQXHjx9n6tSpT3S+IAhvmJws2DMFTiyH0jUhM1m3TkynReDUr8AoTB5ZljEwlGjQvPIjSxAATFl2koDsDN6vWRZjMyW7z91hjO9pGrh2oMLXfSlr+99bTsk7d5Lw229YfPghFp06PnV3crW5jAkYQ/mS5fmx9Y+cTzjPCPW7MZr8ziYyrzNZlpk8eTKHDh1CoVAQFRVFTEwMR44coUuXLhgbG2NsbEynTp0A3aOplJQUmjZtCkDv3r3566+/ANizZw9nz57VV59OSkri8uXLGBkZ0ahRo8cmMQAbNmzgo48+AnS1oAYOHPjIROZph0P79OlDnz4FXw98sHhmnvr16zNp0iQ8PDwwNTVFrVZjYGAAwLBhw5g6VTccO3XqVMaPH59vxePHmThxIhMnTgR0NZm+/fZbVq5cyZ49e1CpVEyZMuWp+iUIwmts6zAI2wwW1XSL3VWwBa8/oHrRhRW1uVoUBgqc21sjy3KRP+u0WpmJa06x6XY8zuYl+XloI24mpLN6oS//M5aZ6D2csmYl9Mdn37xJ9NfTMG7QgErTpz1Td/Zc30N0WjSfu3zOzms7AXCt6vpMbb1p3tlE5lEjKCaGJkXuT0lJobRx6ceOwDyP9evXc/fuXYKDg1EqlVhbW5OZmflMbcmyzOLFi/MVRATdoyVTU9MnasPHx4c7d+7oq2/fvn2by5cvU6dOHUxMTMjOzsbISFcaPiEhgXLlygFga2tLcHAwbdq0eWT7TzMiA/Dpp5/y6aefAjB58mSqVtX9VlSxYkX9MYMHD6Zjx6f/rQbg9OnTyLKMjY0N3t7e7N69m08++UTfZ0EQ3lAZ93T/NbaEEhagNIXk2/D+N9B0JBgU/ZEoyzL+y0KxaVyJOi4Vi0xiZFnG+88zbLp4h0aGxqwe25ycXJm5M1bjfWQlJZycKWNqlO/4OzNmIGs0VJn7PQpj42fq2srQlViXsqZttbZ4+nmiKqeiQZnHTxt4G4g5Mq+Iubl5oSMMhe1LSkqiQoUKKJVKAgICuH79OgDNmzdnx44dZGZmkpqaqh91sbS0xNzcnOPHjwPg6+urb6tdu3b8/PPPaDQaAC5dukRaWlqhcbRt25aoqKh82y5dukRqaipRUVFERkYSGRmJt7e3ftJvy5Yt9bWZMjIy2LhxI61b6yaueXt788UXX3Dnzh0AsrOz9RWxH9SnTx/9BN0Hvx6sWv2g2FjdIlI3btxgy5Yt9O6tW3o7Ojpaf4yfn1+Bt5Ke1NSpU5kxYwYajYbc3FxAN4cmPT39mdoTBOE1EBWsW9wuYDas8oDgX6FCfRgSAC3GPjKJATh3KIrrofFkpGQ/8jhZhhKX02ieo2TpsEYojQ35eulO+u1dAdVqUHvh/HxJUPyKlaQdCqT8qFGUqF37mbp25d4VLt27xEc2H3Eu/hx30u7QvW73Z5os/CZ6Z0dkXrWyZcvSvHlz7Ozs6NChQ74RiIf3TZo0iU6dOmFvb4+Liwv16umeozZs2JDOnTujUqmoWLEi9vb2+reAVq1axeDBg1EoFLRs2VK/fdCgQURGRuLk5IQsy5QvX77QUQ6tVsuVK1cKTIL18fGha9eu+bZ169aNnj178vXXX/Pjjz8ydOhQFi1ahCzL9OvXDzc33eJLnp6exMTE8P777+uHYQcOHMjz6tatG/Hx8SiVSpYsWYKlpSWgezQUEhKCJElYW1vrJzbfvn2bQYMG6V/H9vLy4uDBg8TFxVG1alW++eYb/QjP1q1bcXFx0U9QVqvV2Nvbo1KpcHBweO7YBUF4tSStBvZNh8M/QAlzCF4DRia6uTCOfUHx+N/nM1KyOb79GhVrlipyXowsy/x7NYGSkelUvJVF7/72lK1ixpQ/TvD++rkYSzJ1Vy7D8P6INUD66dPc/eEHzDu0p8wnA565j2k5aZgYmtCmeht+C/sNI4URbao/eiT8rVJUWew3+cvZ2blACfDwJyx9/jjJyckvpJ1nlZKSIsuyLKelpcnOzs5ycHBwvu2yLMuzZ8+WR48e/VTthoaGyuPGjXtxgb4AxX2vn8WL+j571QICAoo7hHeKuN+vSNwVOe07G1meVkqWf1TL8jRLWf7RUZYTbz1xE1qtVv5ryRn55xEBcuz1wn8mabVaed7uC7L1pL/kaWP2y1t/OCVrtVr5//zD5YFe0+Vz9RrIyQ/9P8+8ckW+2KixfKlVaznn3r3n6KTOjeQbsizL8vt/vi+P3v90P/9flJf5fQ0EyUV85otHS2+YIUOGoFarcXJyolu3bjg5OQHw999/o1arsbOzIzAw8KknptrZ2bFgwYKXEbIgCELxMLZEodWAWUXdWjFOH8Pg/WDx5K823zp/j+th8TT5sBblqxf+qvV3Oy+w+MAVVAZGVDU0pHXfemw4eZNf/rlK2f99SK3duzBv1Up/fE5cHDcGDQYDA6qvWI7B/VHlZxGXEUeuNpdq5tW4lXKLO2l3cKro9MztvYnEo6U3zB9//FHo9p49e9KzZ89XHI0gCMJr5toh3eOjzovg8AKMs+KgZE3ot01XauApVWtQhv7/14ySpYwK7JNlmcUHrvDLoas0szSjWWQOrp/WZemJ6yT9soxetd/j687tMDb676NWm51N1Nhx5MbFUWP9Okq8994zd1Ura+nzdx9qWtZk2fvL2BGxA4CWVVs+c5tvIpHICIIgCG++zCTY5Q0h68Gskq5a9a2T3KnYhkqfrgOjJ3tLM09urpYrQbHUbVQRU8sShR5zKSaVRfsv836d8jgEpWDXsipLI6KJ/3sn3hf3YFpNS8kHkhhZloka9znpQUFU/r//w0Sleq4uB90J4nbabUY5jQJg74291C9TH2sL6+dq900jHi0JgiAIby5ZhrAtsLy1Lomp31m3/U4YdPyBC/VGP3USA3Dkzyvs+y2cO1eTi7isjE0lczYNa0Z3uSQGkoId2amcD/gX7+A/KGlnR/XvZuc7J8lvK6n791N+7Bgs/9e10HafRsDNAJQKJa2qtuJmyk0u37tMO+t2jz/xLSMSGUEQBOHNJUkQ+ifIWnDoDRf+0hV+/MQfXAYWuULvo8RHpRL2zy1smlSicu389eFkWWb2zvMsP3QVAKMb6UQExRJrZcTOs9f47qwPyjKlqfbzUhQPrNWVdfUqMTNnYmxnR9nnLNUCkJGTgf81f5pXaY6ZkRm7runqx7Wu1vq5237TiERGEARBeLOkJ4DfZ3DzhO7vzUeDoTGc+QNqtoShh8Dq2Se8Bm64hJGJIc3+V3D+yo/7L/PLP1eJTsokJjKZf3wukm5pyNrkRL6yMaRkWhJVF/6Q7zVrOTeX6K+/BknC6ocFSPdXI38eu67tIiEzgb4NdBWy91zfw3uW71HT4vGrtb9tRCLzmlq4cOFrvwCbWq2mV69e+ba1atWKoKAg/d8jIyPzLUx34sQJ3NzcsLGxwdHRkUGDBj13Pw8cOICTkxN2dnb079+/QDXvkydPYmhoqC/T8LD27dvj4OCAra0tn332mX4RvEmTJqFSqejXr5/+2HXr1rFw4cLnilcQhOdwZR8sa6EbhUm4Ckd/grVdIeU29FwHff1068U8oxvh8URdSkTtXj3fBN9crcysv8NZuO8ynvaVmNapAcf8ItAaSPyqTWFo69r0GfIhNf22UPKB+m8Asd/PJSMomApfTMCoWrVnju1BH773IVu7bKVhpYbcSbvDhYQLdKjZ4Z1ZBO9BIpF5TRV3IpP3YV6U8+fPk5ubS2BgYJErBT8sJiaGHj16MGfOHC5evMjp06dp3759kSsePwmtVkv//v3x9fUlLCyMGjVqsGbNmnz9yKvNVJSNGzdy5swZwsLCuHv3Ln/++SdJSUmcOnWKs2fPYmRkRGhoKBkZGfz222+MGPFuFGIThNdKZrJuMu+6brrRl84/6ZKYPV9BVRcYdgzqd3qmR0kPKl/NnCp1LFG//1/CodXKDFpzkhWB1+jmVJXFXk5cD4sn6uI9/lVk07J6CYZkXgQosDpv2r/HSVizBssePSj90C9+z0ora5EkidqWtZEkiVWhqwBoW73tC2n/TSMSmVdk7ty5LFq0CIBx48bp6w8dOHCgQMHERYsWcfv2bVq3bq1f7n/YsGG4uLhga2vLtGn/FRXz9/enXr16ODs7M3r0aH19obt37+Lu7o6trS2DBg2iRo0axMXFAbpRhUaNGqFWqxk6dKg+aTEzM2P8+PE4ODhw7NixR/bHx8eHvn374uHhwbZt257oHixZsoT+/fvri1sCdO/ePV+NpKcVHx+PkZERdevWBcDd3Z3Nmzfr9y9evJhu3bpRoUKFItsoVaoUoKs6np2djSRJKBQKNBoNsiyTnp6OUqlk3rx5jBo1CqVS+czxCoLwjEL/hH+X6ua9eM6FXV9CchT0XA8D/nqqtWEKo1tzDUzMjfjwc0cMlf89/lEoJAa2qMm0Tg2Y10NFVqqG3avOEWcoE1FWwcQrO7nz5ZdoHiiTAqDNzCRm9mwMy5en4mTv54rvQd8e+5bpR6cjyzLZudnsub4Hu7J21LZ8thIHb7p3NpG53rdfga+E+2u0aDMyCt2fuMUPgJx79wrsexxXV1cCAwMBCAoKIjU1FY1GQ2BgoH5J/zyjR4+mSpUqBAQEEBAQAMCsWbMICgri7Nmz/PPPP5w9e5bMzEyGDh3Kzp07CQ4O5u7du/o2vvnmG9q0acO5c+fo3r07N27cAHQjKRs2bODIkSOEhIRgYGCgLwaZlpZG48aNOXPmDC1atHhkfzZs2ECvXr3w8vLS1116nLCwMJydnR973MWLF1Gr1TRv3hy1Wp3vKzExMd+x5cqVIycnR/84a9OmTdy8eROAqKgo/Pz8GDZs2GOv2a5dOypUqIC5uTndu3fH3NwcT09PHB0dqVy5MhYWFhw/fpwPP/zwifoqCMILkHBNVyMJwHkA9P9L95r1uv+BSWldnaT6z1Yc9mHBu66zY1EImWka/eOZ7BwtG0/qfp641inPJ81rIkkS+30vkp2ZQ2A5mbWu5mTt8qdM/34oK1fO1+adGTPIuniRil9PRWFi8kLijEqNYvPlzZgYmiBJEn9d/YuEzASGqR//c+5tJdaReUWcnZ0JDg4mOTmZEiVK4OTkRFBQEIGBgfqRmkfZuHEjy5cvJycnh+joaMLDw9FqtdSqVYuaNXWTu7y8vFi+fDkAhw8fxs9Pl3i1b9+e0qVLA7B//36Cg4Np2LAhoCv0mDdaYWBgQLdu3R4bS1BQEOXKlaN69epYWVkxcOBAEhISKFOmTKHPZ5/2ma2NjQ0hISGkpKRgbv7oZ92SJOHr68u4cePIysrCw8MDg/sT6caOHcucOXNQPEEtld27d5OZmUmfPn04cOAA7u7uTJw4kYkTJwK6mlXffvstK1euZM+ePahUqqdePVkQhCek1cLxn2H/DDAwglFBkBoL20ZA0i1dpepW3lDC7IVcLj4qlZN/XaOGXVlKlNR9LOZqZUb7nGbXuTs0qVWW6mVLAnAhJJYbp+5y1jiXeR2rIY8bimGFCpT97LN8baYdO0bS5i1Y9upJKXf3FxInwIqzKwDoaaNbAPVw1GEMJAOaVmn6qNPeau9sIlPj97VF7lOYmBS5PyUlBcPSpR95fmGUSiU1a9Zk9erVNGvWDJVKRUBAAFeuXKF+/fqPPPfatWvMmzePkydPUrp0aQYMGEBmZuZTXT+PLMv079+f2bNnF9hnbGysTwIexcfHhwsXLmBtbQ1AcnIymzdvZvDgwZQtW5Z79+7pj01ISKDc/dn7tra2BAcH06VLl0e2f/HiRXr27IlWqy2QhBw8eFBfJDJP06ZN9aNde/bs4dKlS4Au4cqbjBwXF4e/vz+GhoZFjqoYGxvTpUsXtm3bhvsDP3hOnz6tWzPCxgZvb292797NJ598wuXLl6lTp86jb5YgCE/nVhD8/TlEn4EaLeCD+XB0MRz7STcK038HWDd/YZeTZZkjm6+gUEi07G2DJElk52gZ8ccp9obHMNmznj6JiYlL5++VYWgUMt371MPsq8HkpqdTfc0aDO//sgiQEx9P1PgJGFaqRIUJE15YrElZSfhf86dRpUZYW1hzLu4ce6/vpW+DvigV7+4j73f20VJxcHV1Zd68ebi5ueHq6sqyZctwdHQsdMTC3NxcPwk2OTkZU1NTLCwsiImJYefOnYBu5OLq1atERkYCusc9eZo3b87GjRsB3Yd7XnLRtm1bNm3aRGxsLKBLNK5fv15ovN7e3vpRnTxarZaNGzcSGhpKZGQkkZGRbNu2Tf94qVWrVqxbt07/vHnNmjX6eT4jR45kzZo1HD9+XN/eli1biImJyXeNvBGZvMdfD349nMQA+r5kZWUxZ84cPrv/m9G1a9f0MXbv3p2lS5cWSGJSU1OJvv9cOycnh7///ltfbTzP1KlTmTFjBhqNRj+fSKFQvPZvlQnCGycrVbci773rugSm1STY8DEcXQR1PGD4vy80iQGIjUzhZngCLh9YY2pRAq1WZtyGEPaGx+DdoR6DXWsBkJiezewfTmCcA7bdatGuYXWqLV1K9V9XYWJnm6/NmFn/R25CAlUXL8LA7MWMGgFsubyFjJwMPnf5XP93gIF2A1/YNd5EIpF5hVxdXYmOjqZp06ZUrFgRY2NjXF1dCz12yJAhtG/fntatW+Pg4ICjoyP16tWjd+/eNG+u+4dsYmLC0qVLad++Pc7Ozpibm2NhoVu8adq0aezZswc7Ozv+/PNPKlWqhLm5OQ0aNGDmzJl4eHigUqlwd3fXf5A/LDQ0lEqVKuXbFhgYiJWVFVWqVNFvc3NzIzw8nOjoaIYMGYK5uTkODg44ODiQmprKhPu/kVSsWBFfX18mTJiAjY0N9evXZ/fu3Y99fPQ4c+fOpX79+qhUKjp16qSfSP0oarUa0M0L6ty5MyqVCrVaTYUKFfSJEMDWrVtxcXGhSpUqWFpaolarsbe3JzMzEwcHh+eKWxCE+0I3QU627lHRR2tgaCDcCYU1nSA7Dbx8ofcGMCt60v6zOhcYRYmShti66iYLH74Sx97zMUzwqMvQlrq3gpLSNXz6y3GqJ+RiUt2UdrUlZFmmRO3amDz0cyA1MJBkf3/KfDoQE3v7Fxprp9qdWNxmMbZlbcnKzWLntZ10sO5AOZNyjz/5bVZUWew3+cvZ2blACfDw8PCnqRhepOTkwsu4F5eUlBRZlnVl5IcNGyYvWLBAlmVZzszMlDUajSzLsnz06FHZwcHhqdv28PB4YXE+i9ftXj+JF/V99qoFBAQUdwjvFHG/77tzTpbXfyTL00rJ8pX9spwUJct/jZfl/6uq27ZjnCxnpjzXJR53r3NztXL87dR826ITM2StVivLsizfS8uSOy0OlIeP3C3/NGy/fDsgSD5vZy/f+b//K9BWTkqqfNndQ77s7iHnZmU9V9wPy4snz4qzK2S71XbykagjL/Q6z+Nlfl8DQXIRn/nv7ByZt8WKFStYs2YN2dnZODo6MnToUABu3LjBRx99hFarxcjIiBUrVjx127t3737R4QqCIIAmE/ZMgZMrQFlSN3H33g34c4BuX/2O0HwsVH6+ooqPkpGSjaSQMDZVYl7BhImbzlC7vBlDW9amkoUxABfvpNDv1+OYJ+TQQGOEvVsl0r//AsnEhLKDBuVrT5ZlokaPRnPrFtWWL0dhVLBa9rPSylqmH52OfXl7etTtgSzLLDuzjHpl6tGkcpMXdp03lUhk3nDjxo1j3LhxBbbXqVOH06dPF0NEgiAIj7HrSwj+TfdKtdMAXVJz/TBUawxdlkC5lzuJXpZldi0P4+6NFDpNdmHM1rOcuJbAZy3/W4fl6t1Uei4/hhESXkbmlCivoF7KEeKvXqXK/HkYli+fr83kv/1JO3qUCpMmYdbixc7jORx1GL8rftQvq3sx5NCtQ2TlZtHeuj0KScwQEYmMIAiC8HLJMkTsB0trKPceOPXT1US6dw3W3q9W3eF7cPkUDF7+x9Kl43e4fTkRx47WDNl4mvPRyczqakefxjUAOHsrkcFrg5CA6fWqc+1AFK3blyD+qx8p2bQJpdq3z9dezt27xHz3HSXq16dM349feLxLQpZgWcKSbnV0y2MsO7OMqmZV+bjBi7/Wm0ikcoIgCMLLkxID67vrSgsE6ZbSx6wiBM6D/d9AFUcYHACNh76SJCY3V8vJvyMxL2fMzEs3OR+dzNI+Tvok5lhEPL1XHMdAkvitlxM3D0dT3bYsVWwrYNGlC1bz5+cr+ihrtUR/8w25iYlUmTUTyfDF9uF26m3C48P5oNYHGBkYcTHhImHxYfSq14sSBiVe6LXeVGJERhAEQXjxNBlw8Dv492fd392/1T1GOjRP9yVrocdqsO36SsM6fySapLsZtBtsh315JYnpGlrX070NFXE3lSG/B2FhosR3SBMi990iR6Ol2f9qY2xlRpX/m1WgvbsLfyR1337KjxmNcYMGLzze38J+A6CXjW5NrDXn1mAgGdCpdqcXfq03lUhkBEEQhBfv1O9wZCHYdYdWX8K9SFjRSlexuo4HdJgDZWq98rDikjPJLaOktmN5JMV/a3jdTEin/68nMFBIrP20EYq4LM4G3EJd7hYpX6yi1A8/oKyY//Xv5J07iV++nFIdOxZY2fdF+aDWB6jKq7C2sCZXm8u/0f9iV86OMsZlXsr13kTi0dJrpLgrXj8JtVqtXy03T6tWrfS1jgAiIyOxs7PT//3EiRO4ublhY2ODo6MjgwYNeu5+HjhwACcnJ+zs7Ojfvz85OTkAbNu2Tb8mjIuLC4cPHy70/K+++opq1aph9tBiVYsXL8bOzg5PT0+ys7MBXbmHwiZUC4LwkKhTEL5d92fbrtBvO7ScqKtavb475GrurwmzsViSmONX4xl58gprTbLQaGX99qNX4ui69AiJ6RpW9W9INTNj9qw8h7kyg3K7fiI3KQmDUvnXu9JERxM99WuM7eyoPHPGU5dieVLqCmr96EtQTBB3M+7Su17vl3KtN5VIZF4jxZ3I5K1aW5Tz58+Tm5tLYGAgaWlpT9RmTEwMPXr0YM6cOVy8eJHTp0/Tvn17/arFz0Kr1dK/f398fX0JCwujRo0arFmzBtCtXHzmzBlCQkL49ddfGfTQK5J5OnXqxIkTJwpsX79+PWfPnqVZs2bs3r0bWZaZMWMGU6dOfeZ4BeGtd/cibOgLK1rD4QW6yb1KE90E3+Wt4PoRaDsNRpwAmw7wkj70H2X/3kjmLQumkqkRm4c3xchQgSzLLD14hd4rj2NawhC/4c1wrlGaA7+fJyMxg8bRPmgzMrCaPy9f0UdZlomeMhU5O5sqc79HYWz8UmL+5cwvhMSG6P+++dJmTJWmtKrW6qVc700lEplXZNmyZfoKzjVr1tQv259n0aJF3L59m9atW+v3DRs2DBcXF2xtbZk2bZr+WH9/f+rVq4ezszOjR4+mY0dd9de7d+/i7u6Ora0tgwYNokaNGsTFxQGwbt06GjVqhFqtZujQofqkxczMjPHjx+Pg4MCxY8ce2QcfHx/69u2Lh4cH27Zte6J+L1myhP79+9O06X8Fzbp3707FihWf6PzCxMfHY2RkRN26dQFwd3dn8+bNgK4/eb8ZpaWlFflbUpMmTaj8UKVa0P2A0mg0pKeno1QqWbduHR06dKBMGTGMKwgFxF3Wrf2ypBFc2qVbD6bPZl1dpAX14ciPUNMNhh8D18/BqGSxhLn/3B2C/SJwyDBgUW9HapQ1JVcrM3VbGN/vuohHg4rsGuNGnYrmXD4ZQ8SpuzRTHkUbGkzFiRMxfqhsSdK2baQdOUL5MaMpcb9o74sWEhvCTyE/ERilqyOXnZvNwVsHaVm1JSWVxXMfX1fv7BwZv/mnCmx7z7kC9q2qosnO5a/FZwrsr9e0MlXtzchIzWbXL2H59nUd7/TI63322Wd89tlnaDQa2rRpw+eff55v/+jRo1mwYAEBAQH6IouzZs2iTJky5Obm0rZtW86ePUvdunUZOnQohw4dombNmnh5eenb+Oabb2jTpg3e3t7s2rWLVat0bwicP3+eDRs2cOTIEZRKJcOHD2f9+vX069ePtLQ0GjduzPz58x97zzZs2MDevXu5cOECixcvpnfvxw9vhoWF0b9//8cel1co8kF5RSMfLhRZrlw5cnJyCAoKwsXFhU2bNnHz5k39fj8/P7y9vYmNjeXvv/9+7LUfNHLkSJo0aYKtrS3NmzenS5cuYmFAQShKyh24vBfcvgDnTyDpJqzrqiv4+N770GoyVHUu7ii5uTeKklqJ9gMb0KCqJbIsM2nzWTYF32JAM2u+7tgAhUJCm6vlqN8VypaVKHPvLor27Sn90OvUmthY7nw7gxI2NpQZMOClxfzzmZ8xMTShX4N+AKw7v46MnAw+qPXBS7vmm+qdTWSKy5gxY2jTpg2dOj1+xvnGjRtZvnw5OTk5REdHEx4ejlarpVatWtS8/1uAl5cXy5cvB3RzOfKKPLZv357S96ux7t+/n+DgYBo2bAhARkYGFSroJq0ZGBjQrVu3x8YSFBREuXLlqF69OlZWVgwcOJCEhATKlClT6KjH0z4vzisU+aCUlJRC6zBJkoSvry/jxo0jKysLDw+PfFW7u3btSteuXTl06BBTp05l3759TxxH37596du3LwDffvsto0ePZufOnaxdu5Zq1aoxf/78AhW5BeGdkauBU2t1j5I8v4earjDhMtw8Dn5DITIQSpaDrsvBoefj23vJbiakk56gJe1CEuq21VC5VCInV8uUrWFsCr7FYNeafPXBf28aXT+XQGpCFs0H21HNsSXk5ub7WSZrtdz+fDyyRkOV7+fkew37RYpMiuTY7WP0qtcLixIWaGUtW69sxcrMihZWLV7KNd9k72wi86gRFKWRQZH7U1JSMDEzeuwITGFWr17N9evX+emnnx577LVr15g3bx4nT56kdOnSDBgwgMzMzKe+Jugel/Tv35/Zs2cX2GdsbJwvCSiKj48PFy5cwNraGtBV5N68eTODBw+mbNmy+uraoKuonTeqZGtrS3BwMF26dHlk+08zIgPQtGlTAgN1Q6579uzh0qVLBdp0c3Pj6tWrxMXF6eN5Urdv3+bEiRN8/fXXtGzZkgMHDjBz5kz279+Pu7v7U7UlCG+Fa4fA/wu4ewGqNtLNg4k5BwdmwqWdYGype8W64SAwMi3uaFl7LJKvt51jeI4xZUyVuHSwJi41i9E+pzkaEc+nLWri3aG+/nhZlgneGUnNhKNUMa6EpKgAD/3SEvfTT6QHBVHx66kY29i8tNjXn18P/FfV2v+aP9eSrjGj+Qyxkm8hxB15RYKDg5k3bx7r1q0r8jd6c3Nz/STY5ORkTE1NsbCwICYmhp07dwK6kYurV68SGRkJ6B735GnevDkbN24EdB/ueclF27Zt2bRpE7GxsYAu0bh+/XqhMXh7e+tHdfJotVo2btxIaGgokZGRREZGsm3bNnx8fADdW0vr1q1DV9cL1qxZo5/nM3LkSNasWcPx48f17W3ZsoWYmJh818gbkXnw68iRI4SEhBRIYgB9X7KyspgzZ46+YvWVK1f0cZw6dYqsrCzKli1baF8fZerUqXz77beAbgRLkiQUCsVr/1aZILxwSbfg9//pKlGnx0OvP6DbStgyBJY1h2v/gNtE+Pw8NB/zWiQxqw5fY/r2c7SsW556TSXaDbbjWkoG3X4+StD1e8zoYsvU+4+T8lwLiSPl3GWsz/9JwrJlBdrMunyZuGW/UKpzJ0o/8Ej/ZWhUuRF9G/SlkmklANaeW4t1KWs61RJrxxRGJDKvyE8//URCQgKtW7dGrVYX+jbNkCFDaN++Pa1bt8bBwQFHR0fq1atH7969ad5cV7vDxMSEpUuX0r59e5ydnTE3N8fCwgKAadOmsWfPHuzs7Pjzzz+pVKkS5ubmNGjQgJkzZ+Lh4YFKpcLd3Z3o6OhC4wwNDaVSpUr5tgUGBmJlZUWVKlX029zc3AgPDyc6OpohQ4Zgbm6Og4MDDg4OpKamMmHCBAAqVqyIr68vEyZMwMbGhvr167N79+5CHxk9jblz51K/fn1UKhWdOnWiTZs2AGzevBk7OzvUajUjRoxgw4YN+qFhtVqtP3/ixIlUrVqV9PR0qlatyvTp0/X78mpUOTnpRt169+6Nvb09R44cof1DS5MLwltLe/8tRmVJ3dyXttPg0/0QfRaWNIbzO6DJcBh3Dtp8VWwTeR+2cN8lZvwVTss65fixm4pSZRVESDl0+/koaVm5rPmkEX2bWuc7R5ur5ciGcOwvr8XAxJiKk73z78/I4Lb3ZBRmZlSYMOGlvWqdx72GO180/AKAUzGnOJ9wnh51e2CgeDmPst54RZXFfpO/nJ2dC5QADw8Pf5qK4UVKTk5+Ie08j5QUXVl7rVYrDxs2TF6wYIEsy7KcmZkpazQaWZZl+ejRo7KDg8NTt+3h4fHC4nxer8O9flov6vvsVQsICCjuEN4pr/X9zsmW5YDvZHmRkyzn6H6eyNmZsnxkkSzPqiLL00rJ8h9eshx3pXjjLER0YoZsN22XPNrnlHzx5B3Zb36wPHf9Xtlmir/svuCgfCcpo9DzQvbdkHe+P0oOt6knJ+3cVWB/1Fdf6fb5+7/U+CPuRcgLghbI2TnZ+m2Ddw+W3Xzd5LTstJd67RfhZX5fA0FyEZ/5/8/eXYdnVb4BHP+edXcXMUZ3g3QJSHdLCAoIgiIY+BMVQUQUlZZuKQklBKW7c+QGbKy7tzee3x8HwbkNBuxlDJ7PdXHJzjnvee8zZO/NE/f9yq6RKcp++eUXli1bRlZWFtWqVePtt98G4O7du/To0QO9Xo+ZmRm//PLLE99b7tCRpFeUNgsubVDbCiTcgbLtICsZgg/CX19C7A0o1RJafQVu5R5/v+dIrxfohMDD3oJt7zbA296C9VNOkZyaxZzITMr72LF4YC3cbHPWe8nK0HL2t0vUCj+ATYsW2LV+Pdv5lIOHSNywEccB/bFr08agz/HtqW85HXGaAeUH4GzpTEx6DCcjTtK/fH+55foRZCJTBI0dOzbXSrMBAQEPpkUkSZLyTZsFCxpD1BVwKw991oOdp7o2JuwMuJSGHiugXPtCKWb3KBkaHaPXnKW0uy3jXi9DcRdrbp6OIj48lR1WWRRzMWL10LrYWZjm+vpT22+TpjPHZvgY3Du2yHZOn5ZG2IQJmBUrhtuYMQZ9jiP3jnD43mFGVB2Bs6W6rm/++flohZZOAZ0M+t5FnUxkJEmSXlWpsWDtDCZm6ihL4/EQ8Docnwtr+6jrY9r9ANX6g3HuiUBhSs7QMHT5KY4FxVG7hFq0Uq8XbNt0jUxFYFvGnpH+GXkmMekpWQTuvo5/DT+KvdUsx/nYxUvQxcXh89OPGFkZdkRkzvk5OFk4MbDCQABCk0NZd30d3Ut3p6T982/nUJS8Uot9hRCPv0iSnpL8/0sqMiIvw+YRMLMixN5Sj3VdpI7MzGugTiUFtIJ3T0LNwS9kEpOUoaHr3CMcD45jerfKvNWwJEkZGt6ZexyzWA26ElYsG1IHS5O8R5Auzf+DenvHUdE0MMc5bVwcsYsXY9OiOVY1axryUQiMDeR89Hn6lO2DpYnaCmH11dUoKAytNNSg7/0yeGVGZCwsLIiNjcXZ2dngK86lV48QgtjYWCwM1HNFkgpE/B3YOwUu/Aom5lC1L5jbQsRF2PWpupXawQ+6L1WbPr7APlx/nqDoVBYOqEnzcu6ExKXx1rJTBEUkU72hH6Nal8LMJO9/q6cnpsOv89BZ2uHZrW2O8zGzZiPS0nB77z1DPgYAjhaODK00lB5legAQlhLG2qtraV2iNZ42OVupSNm9MomMj48PoaGhREdHP9N9MjIy5IfVc1LUvtcWFhb4+PgUdhiSlDudFha1grQYddt0w/fB3A72fg1HflITmpZfqeeMX/yPhi7VfehU1Zvm5dxJSMui78LjxKdmMX9QTZqVfXwvtytfzsEm6S5W7/8PI+vstW809+6RsGkTdu3aYR4QYKhHeMDD2oPR1Uc/+Hru+bkIIRhZdaTB3/tl8ML/36ooSkngU8BeCNHtae9jamr6oKz/s9i3bx/VqlV75vtIjye/15JUAG7tBa+qYOkIb3ynLuZ1KglXNsP+b9UFvpV7Qptp6jUvsCO3YjhyM5Zxr5fh9QpqvavIpAz6/HKM8MR0fm5YBrOLSWQVc8bMMu+Pt6RL1zHfsYwM73KUHdor2zmh1RL26UQUIyNcR48y6PPohZ7Rf4+mZ5meNPRpCMCN+BtsvrmZzqU642vra9D3f1kYdI2MoiiLFUWJUhTl0n+Ot1YU5ZqiKDcVRfnoUfcQQgQJIYYYMk5JkqSXzt3jsOh1WNEJbtzvN1a2HURcgHkN1a7V6Qnq2pjO81/oJEYIwdLDwby5+AS7r0SSpdUDcOp2HF3mHCEiMYNlg2uTfDaOO5diMTV/dOG4c3vD0JpY4j19Wo6lBsm7d5N27Biu77+PmZ+fwZ4J4O+7f7M/dD8hyQ+b3k47MQ17c/tsIzTSoxl6RGYpMAtY/s8BRVGMgdlASyAUOKkoylbAGPhvM6DBQogoA8coSZL08kiOUHsiBW4FGw+1/1G59hB5BbaPgzuHwbUsdJgFVXq9kAt5/y0lU8uEjRf440I4DQNc+Ll3NcxMjDh4I5o3F5/A096S5UPq4JKi5+ydZBp0D0AxynsdZEaqhstXBRVGz6Jq9ezTRkKnI3r2bExcXXHs0d2gz5WqSWXK8Sm4W7nTvbT6XoGxgRyPOM571d/DxfLJ+sO9ygyayAghDiiKUvw/h2sDN4UQQQCKoqwFOgohpgLtDBmPJEnSS02vV0da7p2Gxh9BvRGQHAmbhqqJjZkttJkONQe98AkMQGqmlm5zj3AtMplxrUozvEkpjI0ULt1L5N3VZynpasNvI+pja2HK5u/PYG1vRsVG3nneTxMZya0flmOaWpLSzXI2/k3cvIWsm7fwmvEdipmZIR+NmadnEp0ezbLWyzC9/2exMnAlFsYWdAt46lUUryTF0FtG7ycyvwshKt7/uhvQWgjx1v2v+wN1hBDv5vF6Z+Br1BGchfcTntyuGwYMA3B3d6+xdu3agn4UAFJSUrCxsTHIvaXs5Pf6+ZHf6+eroL/frlGHSbQvR5a5EyaaFEw1SQjFiOK31+IeuR+AUJ83CPHtQpa5U4G97/NwJ0lHfIagqpv67+5LMVpmnc3EzBg+rm2Jp40RGQmCWzsFrhUV3CpmH4359/fabt4CzM9f5HzLT/Ds7JFtWklJT8f1/Q/QensT98nHOTpfF6TwrHCmhE+hrnVd+rr0BSBVl8rE0IlUt65Of5f+BntvQzLkz5GmTZueFkLkug/+hV/sK4SIBd7Jx3ULgAUANWvWFE2aNDFIPPv27cNQ95ayk9/r50d+r5+vAvt+R15WF+xe2QzlO0KP5ZAWBwdnwPH5YGQCNQdCow/xtfOiqCwdPXwzht/O3uO77lWyHf/jQjgz/zyLn5M1ywbXxtdJLVKXEp+BvbhH5WY+WNubZ3vNP9/r9AsXuH3uLLf9WtFsTFs8Sto/uEYIwb0xY0kWgoDvpmP5rwazhtIkpQn25vYPWg/MOjsLbaiWD5t9SFmnsgZ/f0MorJ8jhZHI3INsf5987h+TJEmS8iP6GpxcqP4yMoWG49Tt1IdmqomNJhUqdoUWX4BDUUlfVOtPhfDRpouUcLFGrxcY3V/vsvhQMJP/uEIlHweWDqyFo/XDqR8bRwvqdfZ/5H2jfpqFzsQcbeOO2ZIYgKRt20jetQvnoW8ZPIn5Peh32pVsl60+TIY2g223tuFq6Vpkk5jCVBiJzEkgQFGUEqgJTC+gTyHEIUmSVLQIofY6uncaTi6Cit3g9Slw+wDMqac2ewx4HZp8BN4514C86P68HMGHGy5Q1sOWNUPrYmSkIITg+93X+fnvmzQv68bMXlWx/VfLgdM7b+PgZoV/dbc875t6/ARphw5yu0QHKnWonO2cLjGRyClTMS9bFtdcetgVpL/u/MXHBz/GxtSGJr5NHhxfc3UNYalh/NT0J4O+/8vKoImMoihrgCaAi6IoocDnQohFiqK8C+xC3am0WAhx2ZBxSJIkFWk6Lez8COy81JGX8p2gdGtIDIFt78G1P8ClDPRaDWXavnCNHfPjyK0Y3l55mvKedvz6dl1sLUzR6wUfbrjAxjOhdKrqxbfdqmSr1nv3SizHNgdRo3WxRyYyZr4+RNfqQaJXI4pVdM52Lvqnn9ElJOAzdw6KAdfFxGXE8dmRzyjnVI7aHrUfHNfoNawKXEUxu2LZkhsp/wy9a6l3Hse3A9sN+d6SJEkvhVt7Ycd4iLkONQapozKadNj9Pzi3EsxsoMknaoJTBHYi5cXf1YYafo4sfLMmtham6PSCDzecZ9OZewxpUIKJb5TLUfPl6G+3sLA2pUbb4o+8t97RjYvWjaler1i2e6QePUr8qlXYd+2ClQGLbwoheHv326Rp0vi83ucP1sUA/BH0B5FpkXzf5HvZPucpvfCLfSVJkl5JaXHwx/tw+Tew94Nea8C7BuyZpK6N0aRDnXfUaaQXuJjdo4TEpbH4cDAftymHu50F696uh5GRQnhiOh+uv8ChmzGMblaKsS1L5/iQjwhOJCYkhYY9AzA1y7sAnt2KFVw/dhvwo1iFhzu2hFZLxNdfY+zsjMcnnxjoCVW77uziatxVBpQfQAWXCg9jEIIfz/yIt403zXxzdt+W8uelSmQURWkPtC9VqlRhhyJJkvRsMhIg+ADUHw2Nx8O51bBhMGgz1Omjpp+AR8XCjvKp3Y1No//i48SlZtG+ihfV/RwxMlI4FhTL8JWnSdfo+KJDBd6sXzzX15/ecQdTc2NK1/bI8z1Sjx3H8vARwtJ8ca1UAc9SDg/Oxa9bR9bNW3hOmZKj11JBK+1Ymp5lejK2RvY1ODtv7yQmPYaPan+EsdGjqxFLeXupEhkhxDZgW82aNWXfc0mSiha9Hi5vUjtT91mn9kMac0ldwLu6F9w5BCUaQdsZ4Fq6sKN9JieC43h39RlSM7UsG1yb6n7qiNLms/cYv+ECHvbq6EyAu22e96jUxJuSVV2xsM59Ok2flkbYRx+hs7HjplVNatVwezCqo09NJWb2HMzLlMG+c6cCf77/Kmlfkol1J2Y7lq5NZ8apGZRyKEXPMj0NHsPL7KVKZCRJkoocTTqcWwVHfob42+BRCdLjwcQCDnyrbqk2s4Z2P6hrZIr4OoplR27z9R+BONuYsWZYXSr7OACw4MAtpmy/ShUfe5YOqp1te3Vu/Mo7P/J83LJlaCMiCHnjHbSpVgTUetgRO3bJUnSxsfjM/MGg61K0ei1j945lZLWRObZVb7y+kci0SL6s/yUmRvKj+FnI754kSVJhSY2BZe3VDtSeVdXmjeU6wsV1alG7hDtQqQe8/jXY5L0rpyhpW8mTmJRMBtYvjrONOTq9YNrOqyw4EMTrFdz5qXc1zE3ynmaJvJ3ElcNhVGnmi5Nn7lNC+rQ0YhcuwqphQ+5oK+FdxhFbJwsAdCmpxC1bhnWjhljVqmWQZ/zHjuAd7AvdR8viLbMlMunadBZdWkQll0rU86pn0BheBTKRkSRJes4s00LV31g5q1NIjT6ECp3VnUkLm0PUZbWxY79NUKp54QZbAIQQrDkRQoeqXrjamvNBqzKA2hBy9Jqz/H01ijYVPfihZ9VHJjEAF/aGEHwuhrodS+Z5jZGVFcXXr+PqyRh0e1Oo9a9dTbHz5qJPTsblneEF8mx5SclKYd75efja+vJGiTeynZt9djYx6TF8Wf9LuVOpAMhERpIk6XlJCIEdE6h1fRc07wjmttBrFaREwZ8T4cQvYGoJXReplXlfgg+59CwdX2y7zNqTISSmaxjeRK3AGxiexMhVZwiKSeXD18swsunjN2lkpmu5dSaagJpuWNo8eupJ8fLj7JkwLJ3Au4y6BkcTFUX86jXYNGuGVXXDbbcGWHttLXeT7zK/xfxsC3mDE4NZfmU5Hfw70NCnoUFjeFXIREaSJMnQksJh72R155FiTIhvJ4opxpB4T51COrcKtJlQsQu0/BLsfQo74gIRGp/GW8tOcTUimXca+/NOY3UUZfeVSEauOoOthQnLBtemcWnXfN3vxslIdBo95ep75nlN0vbtJG77nbDXBpOamEXxpg+Twcivp6DXaHB9b/SzPdhjRKVF8cuFX6jnWY/63vWznZt3fh7mxua8U+WxLQSlfJKJjCRJkiEJAUtaQ1IYVOsP9UZy+2IIxU4tgn3TQJepTis1Gg8uL0/piIjEDN746RCpmVoWvVmT5uXUxbZbzt1j3Prz+LvasGxwbdztLPJ9z7uXYzEyUvDwd8j1vMjKIur7H1DMzblsnYqjhxXW7hmAmuAk79qFY79+WJQp88zP9yguli58UucTKrlUynb8dORptgdvp3vp7vjaFq0eWC+ylyqRkXVkJEl6IaTGwqUNUP1NMLVQkxTv6upIy+EfqXN8KWRGQ/GG0G7mS5XA/MPV1pxynraMbVGaOiWdydTq+GTTJTaeCaWKb87Gj/nhU9YRrwCHB40k/ytx+3Y0oaFkDp1E+g0dLQYFEBR9EV1SEhGTv8a8dGncxn1QEI+XJ41eg6mRKR1Ldcx2XAjBNye+wd3KPUc9GenZGK6xRCEQQmwTQgyzt7d//MWSJEkFTa+HY/Ngur/aVuDWX+rxSt3hzhGYXQcOTCfd0l3tizTw95cuibkYmkh8ahbGRgprhtZ9kMSMWXuOjWdCeatBCTa8U++JkxiAyk19qdrCL9dzQqMhdu48TIuX4FyUFx4l7fCroG7RTtiwEV1cHB6TPsfIIv8jQE8qU5dJ161dWXt1bY5z66+v52rcVUZUHYGtWd71caQn91KNyEiSJBWaiEvw+xgIPQklGkOTj8G7Jhybq66DSY1WWwx0msP5u9CkbJPCjrhAaXV65h8IYu6+W9Qt6cTCN2uhKArRyZm8veIUZ+4mML51GUY0efLELT05i6Bz0fhXc8PCJvcCeEk7d5J15w66tyaSelND0wHlATBKTCR2/nwsa9TAqrphO4LPOz+P4MRg3K3csx1Pzkrm57M/U9W1Kp1KdTJoDK8imchIkiQ9KyFg92cQcwPaTFfXwpyYDxsGQXI4+NWHTvPUrdSKAnf3FXbEBSokLo2hy9VFvY1Lu/J5e7Wf0IXQBIavPEN0ciaz+1Tnjcp5L9J9lMAj4Rz97RYeJe3zTGTsWrcmIySMHcHeuPhaUez+aIzNpt/QJSbi+cWkp3rv/Loce5mFFxfS3K85Tf2aZju34MICEjITGF9rPEbKSzUR8kKQiYwkSdLTyEqD82vAJUBtHdBjOWSlwt2jMO81iLulroFpOx3KtnsptlLn5mZUCp1nHwbgx15V6VjVG4Azd+MZsOgEthYmrBlWlxrFnq6xpRCCwCPhuPrZ4uxtk+s1+sxMjMzNCS35OqkXgmg1LACA9PPnsTh1CuuGDTE34NrJ5KxkPj34Kdam1kyoNSHbuYjUCJZeXkqb4m2o5FopjztIz0ImMpIkSU8iIxEO/wQnFkBmErw2Rk1kMpNh83AI2gdO/tD7VyjTurCjNbjizla0qeTBO439KemqJhp/XAhn7LpzOFqZsnxw7Uf2THqc+Ig0EiLTeK1b3olI6PDhOA4YwOWDZniUtMcrwBF9Whr3xr6P3sYGr6lTnvr98+Nq3FV0Qsf0RtPxtMk+6rQqcBUAgyoOMmgMrzKZyEiSJOXX2VWwYwJkJUOpFlB3hLoO5q8v4ehsQIEWX0C9d8H45f7xuutyBFV9HXC3s+DbblUAyNTq+HHPDebsu0UVXwcWvVkTFxvzZ3qfS/vUKsj+1XNv0ZB+6TKpR46SUbwKybGVqHm/im/k1KlowsJIGj0KExeXZ4rhcWp51GJrp605qvQmZCQ8GI0p51zOoDG8yl7uv2mSJEnPSqcBoQcTc9BroHgDaDIBXMvBmeXw29vqQt4yb0Dzz8Dt5f7A0ur0TN91jfkHguhY1Ysfe6kVciOTMhix6gyn78TTpbo333SpjJnJs68H0ekEvuUe9kr6r/gVy8HEhJMJZbBztaR0bXcyg4JI2LgJh969iCxf/pljyIte6Fl+eTm9yvbCwiRnfJOPTwagZ1nZ3dqQZCIjSZKUG50Wzq+G/d9CQCto9z3UGKjWhrm5BzbUV9fBuFeEnivBr25hR2xw50IS+HD9eW5EpdChihffdVdHYsIT0+k8+wgxKZl80aECb9YvXmDv2bRf2TzP6RISSNq9B1GzCQlpZrToWQITU2MifvgBxcwM1xEjuHb5coHF8l8rrqxgxukZuFm50bZk22znghKD+PP2n9T3qk8N9xoGi0GSiYwkSVJ2Og1c2672Pkq4Cx6V1DUwAMkRsH0cBG4Dh2LQaw2Ubg1GL/9OlND4NHrMO4qdpQk/9a5Gu0qeGBkpXLqXyHtrz5KQnsXaYXWpWdypwN4zMToNOxfLPBsrxq1chUhLI8ijKXYmFpSu5U7itt9J3r0H52HDMHHNX+uDpxGTHsOcc3Oo51mPNiXaZDsnhOCzQ59hY2bDZ3U/M1gMkuqlSmRkZV9Jkp7ZuVWw7T2wdoXO86FiN9CkwZFZsO8b0KZD8/9BvVFg8uRF3YoaIQSKouDtYEnv2r6MaFoKdzsL9HrBz3/d4Ke/b2BtbsKC/jULNInRafWsn3oK79KOtHkn990+jj17kBGXzJ1wB2q19UCXmEDEpEmYBwTgMtxwvYyEEEw8PJEsXRYTak/IkWjturOLCzEX+LTOp/jYvhx9s15kj01kFEUxFkLonkcwz0oIsQ3YVrNmzaGFHYskSUVI0D5IiYbK3aFCF7B0hIDX1XP7psLJhZCRoNaDaT8TXA3bq+dFERKXxqg1Z5napRLlPO34omNFQF0nM+bXc/x+IZzaJZyY07f6My/q/a/I4CQy07QE1HLP9bwQAhNXV+6U74oSEUrZ+p7EzpuJPi0Nr+++w8jSskDj+bett7Zy+N5h3q78Nv4O/tnOpWnSmHFqBsXtitOtdDeDxSA9lJ8RmRuKomwElgghrhg6IEmSpOcmORJ2ToDLv4FnVTWRsbCDch3g9iHYOgrig9Xpo4YfgE+tl7YezH8FRafQb+FxkjO0hCWkU87TDoC7sWmMW3+eE7fjeL9lad5tWirP3kfP4sqhMIyMFHzK5qw/o42JIeLrr3EYMJBrR5MoXskZa5MswjdsxLphAyzKlC7weP6tZbGWhKWE8XaVt3OcW311NRGpEcxtMRcTo5dq0uOFlZ/vchWgF7BQURQjYDGwVgiRZNDIJEmSDEWnhdNL4O+vICNJTVJee0/tlRS8D/ZMgvDzYOmkLuQt176wI35uhBDsuhzBB+vOY2yksGpoHSr7OABwOyaVHvOPkpiu4ZsulehVO/e+R89Kr9MTdC4an7KOWFjnrOQbt3QpyTt2klCrCxmpGso38CJ80iT06em4jhptkJgAwlPCsTK1wt7cnuFVh+c4fyfpDnPPzaWeZz1e83rNYHFI2T02kRFCJAO/AL8oitIYWA38oCjKBuArIcRNA8coSZJUsFKjYedH4FUd3pihLui9vlNd4Bt7E2w9ofU3UK0fmL9aDf4u3kvknZVnKOthy+y+1fF3tUEIwbpTIUz+PRBFgXVv16OKr4PBYrh7OQ5Npo6y9XK2NNAlJxO/eg02zZpy+JYZNo5GuJvFcXvHTmxbtsSyUkWDxJSmSePtPW9jYWzB2nZrc7Qa0As9/zv8P0yNTfnytS/zXKAsFbx8rZEB3gAGAcWBGcAqoCGwHTDsGJ4kSVJBuHcaTi6CjrPBzhMG/wne1SElCtb0UhMZx+LQ/ieo3ANMDbfG4kUUEpeGr5MVlbzt+bZrZTpW88LcxJjUTC2f/HaRLefCqF3ciWndKlPCxdqgsfhWcKLHp7Vw8sz5PjFz5qJPS8OofV9it6TSpG8Z4ubPQDE1xf3TTwwW0z8NIWc3n51rv6QdwTs4E3WGz+t9joe1h8HikHLK1xoZYC8wXQhx5F/HNyiK0sgwYUmSJBWQ+Dtw4Fs4uxLM7dTKuzau4FMDbuyG396B9DhoNhHqv/dK7ET6r0M3Yhi5+gyr3qpDRW97etTyBSAxXcOw5ac4cTuOtxqU4OO25TA2wHqY/zI2NsLVN+dImC4xkfg1a7B9/XVuJboCofi4agnbvgPHvn0x9TBMAnE++jwrrqygdfHWNPLJ+bGXnJXMtye/paxTWTqX6myQGKS85SeRqSyESMnthBDCcJORkiRJzyLmJvw1SU1W9Fqo/TY0Hg/WLuoOpV0fw8X14FQSBmwBD8NMSbzoZu+9yXd/XqOEszVWZsYPjl8OS+TD9Re4EZXMDz2q0qma93OJJyEyjRPbgqjWqhiuftmTGcXSEq9p0zApVow9S6Nx8rIm7delADi9OcAg8Wj1WiYdmYSZsRkf1vowx3mdXseH+z8kPiOemU1nYmxknMtdJEPKTxWn2YqiOPzzhaIojoqiLDZcSJIkSU9JCAg9rf7ewU9d61KpO7x7Etp+C1bOEPg7zK0HFzdAzSEw/MgrmcQkpml4c/EJpu+6RusKHmwd1eBB08et58PoMucIEUkZfNe9ynNLYgBuX4zhxqkoTMxyfjwZmZlh93orQhLtSU3IpMZr9iSs34Bty5aY+Rlm4bGxYkxVt6p8Xu9z3Kxy9ntaGbiSw2GH+aDmB1Rzq2aQGKRHy++ITMI/Xwgh4hVFkX9akiS9OHQauPArHJ8PERfgw1vqyEvb6Q+vib4Ou/8H13eAW3novRZ8ahZezIXsSngSh27G8F7zAEY3D8DYSEGvF8zae5Pvd1+niq8Dc/pWx9vh+a4VunwwDAd3Kxw9sq+PSd63j9TDR3AdOYILe0OxcTLHasdiknU63D4cZ7B4FEXhs7qf5bou5lzUOWafm009z3oMKG+YESHp8fIzImOkKMqDjfyKojjxklUEliSpCAvaD7PrwJaRkJUK7X7IvtMoNRY2vgWza0Pwfmj0IQzb/0omMVqdnvWnQgCo5+/MwfFNGduyNMZGChkaHW8tP8X3u6/zRiVP1g6t+9yTmKx0LQlRafiVz14hWGg0RHzxJSkH9pOqMSXqThL+JYxI/n0bDj17GGQ0JlOXyfA9w9l5e2euSUxcRhzv7X0PW1NbvnrtK7lLqRDlJyGZARxVFGU9oADdgK8NGtVTki0KJOkVo82EDYPAxBJ6roIybR/2PRICzq+B3Z9DWizUHQH1R6k7ll5BSRka3llxmiO3YmkQ4IKnvSVe9xOV8yEJjLvfDHJsi9KMbl6qUD6Yw24mgIBiFZ2zHY9bvhxteDjeP3xP4NFIEOB8fhtGVla4jR1rkFh+u/Ebh+4dol3JdjnOCSH46uhXxGXEsaLNCtytc68+LD0f+akjs1xRlNNA0/uHuryoFX5liwJJekXE3wHHYmBiDt2WgGcVsHR4eD41Fja9Bbf+BrcK0HvNKzkC84+bUSkMX3maoJhUJneqiKf9w5GWvVejGLr8FJZmxszrV4PWFQtv67CxiRE+ZR3x8Ld/cEwbE0P0jz9h3aABFk1bcPl/x/H0s4Tlv2Hfpw/G9vaPuOPTScxMZOHFhZRzKkfbEm1znN91Zxd77u5haKWhVHWrWuDvLz2Z/E4RXQXi/7leURQ/IcRdg0UlSZKUG0262rjx8Ex1oW6776Fk44fnhYArW2D7h+ooTKvJUGc4GL+6s+H7r0fz7qoz6IVg4Zs1aVrm4YLV3y+E8f6683g5WPLbiPo4F3C/pCflW84J33LZp5Xi1/6KyMrC7cMPuXIonPSkLKoaXQJjY5wG9C/wGIQQTDgwgci0SKY1mpZjZOpY+DE+PvAxFZ0rMrxKzuq+0vOXn4J4o4DPgUhAhzq9JIDKhg1NkiTpPm0WHP4RjvwEmUlQqYda9+XfrmyBQzMh7Aw4+UOfX9WCd684BfBztuLn3tUe7EoCWHnsDhM3X6KKjz2/DKhZ6ElMamImOq0eW0cLlH/VqnHq1xdz/5KYBQRwYdlRXDzMsFg7F4fevTArXrzA44hOj+ZU5ClGVBlBDfca2c+lRTNu/zjszO34ufnPmBrnbJ8gPX/5+WfKe0AZIUSsoYORJEnK1fG5sHcyFGsATSZAiX8VJUu4C9vHq7uRnAOg9TSoMRBMLQot3MIWlZzBqmN3GdMigEalXWkY4PJgZEGnF0z+4wpLDt+mTgknlg6qjaVZ4dc+Ob8nhPN/hTB0ZiNM7sejz8jA2MEBuzZtuH0xhuS4DEppD2FkZYXLsGEGicPNyo2FrRZSyaVStuManYZRf48iVZPKunbrcLF0Mcj7S08uP4lMCJBo6EAkSZKy0WkgMxmsnKBiV7D3hYpdHp6PuQn7v1FHYgAaT4CG417Jyrz/FhiexJuLTxCXmkW7yp4EuNs+SGKCY1J5d/UZLocl8UZlT77vUQVzk8JPYgAighNx8bV5kMRkBgVxp19/fGb9jFX16lw9Eg6A7dFNuIwZialnwS7aPh99nlMRpxhccXCu616mnpjK5djLfFb3MwIcAwr0vaVnk59EJgjYpyjKH0DmPweFEN8bLCpJkl5dQsDl32DvFMhKgYF/gLM/2Puo5zUZasuBIz+DkQlU7gkN31cr9L7i7iWk8+biE+j0gt9GvEaA+8Nt6LdjUhm05ASxqVl8170KXat7vzBbhjNSNUTeTqJyE58HxxJ/24wuLg5Tbx/SU7IIOhdNCaNbmFmZ4TSgYGu2pGnSmHhoIunadHqX7Y2VqVW288fDj7P++np6lO5BjzI9CvS9pWeXn0Tm7v1fZvd/SZIkGUb8bdgzSU1kHEuoHaj/naDcOaLWi4kLAv9m8Mb34FSisKJ9oYTEpdFrwTFSM7WsfKsOlXwe7ubZfPYe4zdewNLUmCUDa1GzuNMj7vT83b0ci14rKF5Jna4RQpC8928sq1fH1N2NG4fCEAKcTm3CvlMnjMwLbj1PmiaNobuHcifpDj82/TFHEnMn6Q4f7P8AbxtvxtYwzFZv6dnkZ/v1FwCKolgJIdIMH5IkSa+k9ASY1wgyE6HJx2rhun/61qREwZ8T1eq9dt7QZz2UblWo4b5orM1N0Oj0rBlWl8o+Dg+Oz/r7Bt/9eZ1qfg7M6vP8K/XmR9SdZABci6kjSJmBgWTdvIX7xx8BEHgkHCujdOzSQ3Hs07tA33vK8SlciL7AV699RVO/pjnO/3TmJ7J0Wcx6fRY2Zja53EEqbPnZtVQPWATYAH6KolQB3hZCjDB0cJIkvQLSE9QaMJYO0OJzKNEYXO4XtUyJhjNL4fDPkJUMtYaq15jn7Iz8KtLq9Kw7FUqPmj44WZux54PG2FmoO2n0esFX9xf1tijnzqw+1bAwfTHWw/xX9deLUbq2O2YW6kdS/NpfUSwtsevQgeS4DCKCEil5528c2rXDvETBjcBpdBpORpykf/n+dCrVKcf5nbd38uedPxlWeRilHGWh1RdVfqaWZgKvA1sBhBDnFUXJ2cdckiTpSQUfhPVvqlNEFTpBrSHqcSHUpo7bP4CMRCjeEFpPBY9Kj7zdqyQ0Po1Pf7vE/uvRmJsY0bWGz4MkJiQujbG/nuPUnXi6VvdhWtdKmBjnpyNN4bCyM8PK7uHKBddR72JeqhQmjo7cPXgPAOeo8zgPmVug72tqbMqUhlMo51Qux7lrcdf49OCnVHGtwrDKhtkhJRWMfFWJEkKE/GdRmM4w4UiS9EpIj4cdE9SpIhsPcCn98FzsLfjrC3U3kk9ttfGjV9VCC/VFtOlMKBM3X0KrE/yvXXm61ni4SDYwPIk+vxwjNUvHlx0r0L9usRdmUW9uLuwNISUuk3qd/VGMFIQQGDs7Pyh2d/XAHcyykvCsVw7zgILbLbQvZB/1vernqBUDamXf9/e9j7mxOTObzsTcuHBr7EiPlp8UPURRlPqAUBTFVFGUcUCggeOSJOlldXoZ/FgFLqyDeu/CyOPgXl6t2nv4R5hbH67tUAveDdohk5j/mL33Ju+vO09Fb3t2v9+IwQ3UqRYhBFvO3aP3L8cwMTZi++gGDKhX/IVOYgCCzsVw7XjEgyJ4IUPeIv38eQCEXhB/LwnL9GjcP5pQYO95PPw4o/4exbzz83Kcy9Rl8t7e9whJDmFm05myXkwRkJ8RmXeAHwFv4B7wJzDSkEE9Ldk0UpJeYJp0MLVU+yL5N1OTGJ+a6jTSjT2wcwLE3lSnkTr8LHcj5aF9ZS90esGIJv4PpovSs3SM+fUsuy5HUsnbnp97V6O4i3UhR/p4Qi+ICUl+0JYg684dUo8cwcTLE6tq1Qg+cYdMvRkVneIx8/F5zN3y517KPT45+Ake1h68WeHNHOe/OfENpyNP83m9z6ntWbtA3lMyrPzsWooB+j6HWJ6ZbBopSS8gTTr8PRnuHoOhf6kjLN2XqudSomD7OHUaycIBeiyHch3gBR9FeN72Xoti8aFglg2qjZ+zFaObP5xiScnU0veXY5wPTeS95gGMalbqhV4P829x4alkpmnxLuMIQNR3M8DUFNcR6l6S8xvPY6wzo+KojgXyfjHpMYz6exSJWYmsaLMCe/PsDScXXlzIhusb6BLQhW6luxXIe0qGl2cioyjKeCHEt4qi/IzaWykbIcRog0YmSVLRptPAmWVqEpMeD9XfBL0ejIxAr3vY/FGvhdfGQNNP1G7W0gNCCKbvusbc/bfwcbQkIV2Dk/XDRbFRSRmMWHWGC/cS+aFnFTpXK5hRi+fl7pU4AFx8bci8dYvk3btxHjYMUy8vdGlpxMbqsDVNwaZCmQJ5v/XX1xOcEMx3Tb6jnHP2Bb47gnfw45kfec37NT6r+1mBvJ/0fDxqROafdTCnnkcgkiS9RPR6WNRKbeDoWQW6LQH/puo00vU/1cW8kZcg4HW1Q7Vr6cff8xWj1ws+23KJVcfv0q6yJ191rIjjv5KYO7Gp9F5wjOiUTCa1r1DkkhgAcysT7FwscC9uR/gn0wBw6t8PgOA1u8g0c6B6nYLrXN69dHeK2xWnuV/zbMcvxVzi00OfUsqhFN81+g4To1e3W3pRlOef1v1pGoQQy55fOJIkFWk6LRibqKMu1i7Q7geoPlCdKgrcBvu/hYgLYOcDHWZBtX5yGikP03ZdZdXxu3Sv4cO0rpUx+ldH6H+SmMR0DaveqkvtEi9Wpd78Kv+aF+Vf8wLAvmMHTNzcMHF1RWg03Nh5EZxeo1zXOs/0Hmn6ND4++DGf1PkEF0sX2pRok+18clYy4/aPw8bUhoWtFsqid0VQfgri7Qa6CyES7n/tCKwVQrxu4NgkSSpK7h6HzcOh+xJ1FKbvevV42Dn4faw6OmPlDK9PgZpDXunu1I+i1ekxMTZibIvSVPCyp31lz2w7j/4KjGTk6jOYGhuxemhdqvg6FF6wz0AIdcXCP89mXbcu1nXrApDw22/EmHjh5ACWdk8/3ZiclczsyNnc09yjg38H6nnVy3Y+PiOeMXvHEJYSxuLXF+Ns6fzU7yUVnvysCHP9J4kBEELEA24Gi0iSpKJFr4dTS2DpG5CVCtrMh+curIeFLdQkpskn8ME1qDdSJjF52HQmlEbf7iU1U4uFqTEdqnhlS2K2XwznnZWn8bCzYNPw+kU2iQGID09jwej93Dh6l4ivJpNx/TqgJjh3Vm8nyb4k/g2KP/X9hRB8cvAT7mbdZVL9STmSmDRNGiP2jOBs1Fkm1p1ITY+az/I4UiHKz0SgTlEUPyHEXQBFUYqRy+JfSZJeQWHnYOMQddu0tRsMPwLWzmqH6r1fw5Gf1KJ2neepHaylXOn0gm93XmX+gSCq+TmQkqnF2jz7j+fFh4L5ensgFb3s+GVATdzsinYyGHYzAa1Gj9HRP4lftQq71uogf8q+fYSnqbuJytbzeur7/3z2Z/aF7qONfZsc7QeEEEw4MIFLsZeY0XgGrYrLvl1FWX4SmU+BQ4qi7AcUoCEg6zVLkgTxwWrS0nEOVOmlNnm8uAF2fw5JoVC5l7pOxszq8fd6RV0OS+ST3y5xPiSBdpU9+a57lWw9kf7ZuTRn3y2alnFlZq9q2FuaFmLEBSP4fAw2DmZo1/6CVb26WNWqBUDswkXEurfAwc0SO5ena3AphCA0JZQWfi1oTesc52edm8W+0H0MrjhYJjEvgfzUkdmpKEp1oO79Q2Pu15aRJOlVlBIF4eehVAuo0BnKvAEmZhB+Qd1Sfe0PcK8I7X+EgBaFHe0Lb/Xxu1wMTWBK50r0qeOX7VxsSiYTNl5kT2AkrSt4MKtPtSJTI+ZRhBDcvRxLQHEd+qQknAcNAiAjMJC4S8Ek1vOjTl2Pp763oih8/drXKIrCoQOHsp3feXsnCy4soKlvU96r/t4zP4tU+B5VR6asEOLq/SQGIOz+f/3uTzWdMXx4kiS9MDKS4NRiOPg9ZCbCoJ1QrB5kJsMfn8PZFWBqDQ3GQpOPZU2Yx7gemUxpd1smd6rIuFZlsm2tBgiOSWXgkhPciU1jXKvSjGhSKtvOpaIsMSodAKM7V0FRsKyufszEzF9AvFNZAEpUcX3i+x4NO8oPp39gfK3xua55OR99ng/3f0g5p3JMbzwdI6XoJ4XSo0dk3kedQpqRyzkBNDNIRJIkvXguboBtYyArWe1A/cb34FkVTvwC+6ZCWizUGAhNJ4LNk38AvUrSsrTMPpfB6V0HWPVWXer5O+dIYv6+GsnwlWdQFJjXrzqtK3oWUrSGYWlnRv2upXC4l4R93QkY29iQdvYsybt2kdxkPKbmxjh5PVmLhQvRFxj510g8rT3xd8i5HisuI47Rf4/G0dyRGY1nyEaQL5FHJTK77/93iBAi6HkEI0nSC0ivh3OrwKk4tJkODr5wfD6sGwDJ4WpC03c9eOfsIixldz4kgbG/niMoRsfbjUtSq7hjjmv2XIlkxOozeNpbsGRgLUq6vnx1TcwtTajW0g9Qp9KEXk/EF19i5OTEPeFHyXJOT9TsMi4jjrF7x+Jg7sDyNstxtMj+fU3MTGTU36NIykxiaZul+Nr5FuTjSIXsUeNqH9//74bnEYgkSS+YW3sh+rpa3K71NHjzD4i9AbPrqLuR7H2h+zIYulcmMfmw/lQI3eYdITFdw3vVzfm4Tbkc611WH7/L0BWnKOZkxa/D6r2USQzAnZN3uPrxN+izsgBI/O03Mq9exeKtsQC4F7fL9720ei2j/h5FXGYcUxtOzVELJkufxcCdA7kQfYHJDSZTxbVKwT2I9EJ41IhMnKIofwIlFUXZ+t+TQogOhgtLkqRCo9fDvilwYDqUaARvboPEELUeTGYieFWHTnPBrWxhR1qkuNia06CUC9/3qMr5k0dynJ+99ybTd10jwM2GNcPq4mLz8k597F5yFccwQfHg21iUKU3cipUY2dkR4VQVuEOJKi75vleqJpVG3o3oGtCVOp7ZqwBrdBoWRS/iZsZNvqz/JW+UfKNgH0R6ITwqkWkLVAdWkPs6GUmSXjbpCbBhMNz6C0q3hjbT4Nf+ELgVHEvA65Ohaj91lEZ6rNiUTLZfiqB/3WI0LeNGk9KuuU6ZTNt5lbn7btGmogc/9Kyabfv1yyYjNYtMvSm2lllYlClN6rFjZF69in2XLly4EoeTlzWOHvlbHxOVFoWblRvDKg/L8X0VQvDe3ve4knGFj2p/ROeAzoZ4HOkF8KhEZpEQor+iKL8IIfY/t4iegaIo7YH2pUqVKuxQJKno0WbB3NcgJQJaTAKPyrCsPSTchfqjoOEHYJlzTYeUu+CYVPotPE5EUgaNAlwo5myd64ftt7uuMXffLVqUc+Pn3i/H9upHifx9L2CKc92qCCGImTUbI2tr3D77jMRPT+BfI3+F42edncWii4v4rN5ndAnokuP8qsBVHLx3kBZ2Lehbrm8BP4X0InnU35gaiqJ4AX0VRXFUFMXp37+eV4BPQgixTQgxzN7evrBDkaSiIzEUY226WgumWl/o9xskhsLKLqDTQJ/1aodqmcTk27pTIbT76SBJGRoW9K9BMefcRxgmbb3M3H236FjVi3n9arz0SYwQghubDgNQvFNDMi5eJO3UKZwGDyImIpPMNC2eJR//83v55eXMvzCflsVa0t6/fY7ze+7sYdrJadR0r0kHB7kK4mX3qL8184C/gLLA6f/8OmX40CRJMihNBhyaCbPrYp94GYQAh2KwbTScXAiVusO7p6C0rHz6JLacu8f4DRfwd7Nh27sNaF7OPcc1yVmCz7dcYtnROzQq7cr0blVe+iQGAJ0OXUA1AJz8HEnYsBHFzAynvn25dToKIyMFvwqPbtz469VfmX5qOo19GvN1w68xNcpe5fha3DU+OfQJ/vb+/NDkhyfa/SQVTXlOLQkhfgJ+UhRlrhBi+HOMSZIkQ4u8DOsHQsx1KNGYLDMH2DpKLWrnVgG6LYYKXUB+CDyxyj4ONC3jytx+NXJd67LzUjifHEwjWXOH7jV8mNKlEqavQhIDKCYmNPmkHbWTstBGRZH422/YtW2Lkb09F/aexbeCE1Z2Znm+PighiCknplDdrTozmszIkcTEZ8Tz7t/vYmVixZwWc3CwcDDwE0kvgkdV9m0mhPhbCDFcUZQSQojgf53rIoTY9HxClCSpQF3bCRsGgZGp2iPp3mmqnfkY9FlQdwS0+lou5n0KJ2/HUc3XgRIu1iwZVDvHeb1esOBgENN2XsXbWmH1269RyefVmQZPOXiIjKuB2HbriaOHHSFvf4DQaHAaNJDQa/HodQLvgNynL/VCj4JCSYeSrH1jLT62PjkK2qVp0hi4cyBRaVHMaT4HL5unbzgpFS2PWuz7HequJYCN//o9wERAJjKSVJRos9R1MI7F1V5IJZvAjgmgSSXarREeHT4H7+qPu4v0H5laHZO2XmHNibv0qePHlM6Vcr1m5Kqz7AmM5LVSzgwonv5KJTFCpyNy6lRS0iDGpB5l/TJI2b8flxEjsChbltvrrqMoUKFR7snHzDMzQcDYGmMp51wu5/2F4KODHxGUGMS3jb7lNe/XDPxE0ovkUf/sUvL4fW5fS5L0otJp4cjPsLyDug5Gr1V3Ih34FlzLwNC9XC03ViYxT0Gr0zNk6SnWnLhL3zp+fN6+fI5rrkcm03/hCfYERjKyqT/LB9fB3OTV+hGavOcvsoKC0HR+m6vHo0jcexAAp4FvAhB2IwHPUg6YWeT8t/VvN35jyaUlJGQm5LneZW/IXvaG7GVA+QG0KdHGcA8ivZAeNSIj8vh9bl9LkvQiuncGto6GyItQ7DU4sQB2fw4WdtB7rVorRlHg+r7CjrTI0ej0NJuxj5C4dEY1K8UHrcpkO6/V6Zl/IIiZe65jbKQwrWsletbyy+NuL7eEdeswcXUlwbYkFtZxGO9eh3WrVhjb2aHT6okJSaFaq5zfmx3BO/j8yOfU8qjFxLoTc713aHIoXxz9gmJ2xRhTfYyBn0R6ET0qkfmnoq9C9uq+ClDC4JFJkvT0dBrY9SmcmA9mNtDiC3WB747xatPHHivASf41fhpCCBRFwdTYiLIedvStU4x3GmdvUpicoWHI0lOcuB1H0zKuTOtaGTc7i0KKuHBlBAaSevgwzkPf4s7leOxM09EnJuDQswcAybEZANg6Zf/+nAg/wSeHPqGUYyl+aPIDZsY5FwGnalJ59693ydBmsKDlAkyNTXNcI738HpXIdPzX77/7z7n/fi1J0otApwUEGJlARgLUegt8aqlrYTKToc5waPmlulZGemL/JCjjW5ehZnEnFvSvkWO6IzYlk74Lj3M1IplP25ZjSIMSGBm9WlNJ/2bi7o7ToEHY93+TzEkXsYy6gnlAKazr1wcg8nYSAM4+2ftKmZuYU8OtBtMaTcPePOd6opj0GAbtHMTtpNtMfm0yZZzK5LhGejU8avt1kajmK0nSfVGBsGUkvDYGyndQdx+dWgS/vQNu5aHjz7K54zO4EJrAe2vPERyTSnBMKjWL5+zQfDE0kWErThGTksmsPtVoV1nunDFxcsJ9wnjSkrJwcDTC5tJpHIZ0e/C9CwmMQzFS8CiRvVFkFdcqLHx9Ya73TMxMZOifQ7mddJtvGn4jeyi94h41IiNJUlGQFqdOI13aCIoRGJupSc2aXhB/G4o1gD5rwdy2sCMtsk7fiWPQkpNYmhmzZGAtmpbNXkZfrxesOnGXr/+4gr2lKaveqkvtEi9kAfTnKn7dOkycnLBt0QIrOzMaJq4nNeEidu1+BEDoBSGBcfiWc8Lofi2d7099T2hKKFMaTMHCJOd0nF7oGfrnUIISg5jZZCbNizV/rs8kvXhkIiNJRVn0NVjeCZLDoEJnaD4Jzq2CX/uBqVX2Bb3SU8nU6hi2/DQWpsasHVaPEi7Z2w2ExKXx8aaLHLoZQ0VvO+b2rYGvk1UhRfvi0GdlEfXdDKyqVcO2RQvSYpJIPnAIx65dMHFWq/fGhqWQlphFiTfUbtcbrm9g6eWltCvZLtckBuDnsz8TGBfI2BpjZRIjATKRkaSiTa8DoYO3/gY7L7XJY+wNdRSm8zxw8C3sCIustCwtRoqChakxI5uWolUFd3wcsyco0cmZ9Jh/lNjULEY1K8WYFqUxfoXXw/xbzNy56JOScOjdC4AzSw9ytfpEerXwfHBNSGA8AN6lHfj16q9MPj75kTuUNt/czMKLC2nh14JBFQYZ/iGkIuFRlX238Yht1kII2YlLkgqDXg93j4BffXArByOPQ+gpWNsHUqOh2WfQaFxhR1mkxaZkMmTZKfrVLUa3Gj4MbpBzh1dEYgZ9Fh4jJiWTNUPrUrO4nEr6R1boPeKWLMW8dGlsGjdGl5RE5LnbKBbeWNer9+C6yOAkrB3MuaA5xeTjk/Gx8eH7xt9jZZpzRGvn7Z18dvgzqrhW4dvG38oeStIDj6vsC9AF8ABW3v+6NxBpyKAkScrD7cPw15cQckxd1Pvae7DtPQjcCrZeMGALlGhY2FEWaQlpWfRdeJwbUSnk1QLpYmgig5edJCYlk7l9a8gk5j/ili9DZGTgNe0bFEUhbuUqoqxK4VfCHOV++wuhF9y9Eot/NVfKODnRr1w/RlUblWsScyP+Bp8f/hx/e391m7WR3GYtPfTYXUuKoswQQtT816ltiqLI7teS9DylxcH2ceqCXoAmH4OlE/xcHdLjocFYaPwRmL6atUoKyq3oFN5ZcZqgmFR+7l2NtpU8s50XQrD1fBgTf7uEmYkR696uRy2ZxOTg2KsXRuYWWJQrhy4pibDVm9FXnIBLxYdF7yJvJ3HD8jw1/NviYe3BhNoTcr1XmiaND/Z/gImRCT80/SHXREd6teVnjYy1oiglhRBBAIqilACsH/MaSZIK0vF5ahJTc4haG2bHeLh9EHzrqMXuitV7/D2kRxJC8N7as4QlpDO/Xw1alHfPdl6r0zN23Xm2nQ/D3tKUFUPqUN7LLo+7vZqEECAE5iVL4vbB+wDELVtOrLEHAH7lHiZ9m0/sYGfZX0hKCWQ+c3O9X7o2neF7hhOcGMw3Db+hhL0s4ijllJ9EZiywT1GUINSqvsWAtw0alSRJanuBlCgo0xpqDgb/5pCRCMs7QloMNP9cnV6SnaqfSXRyJk7WZhgbKYxoUopK3vY5dh3FpmQyYeNF9gRG0rmaN190rICdhZze+K+kbdtI3LIVzylTMHV3QwhB3JIl2JVvQqXG3niUVAvbhaeEsyzjZyy1tvzQfEae95t8bDJnos4wpcEUWStGytNjExkhxE5FUQKAsvcPXRVCZBo2LEl6xZ1aok4luZaF0q+DLgv++gLuHAZ7Pxj8J/jWKuwoizQhBCuO3eGbHVepVdyJBQNq5JhKAkjJ1NJ93lGCYlIZ2dSfca3KyIWmudAlJRE5ZSpGNjaYuKjbq5N37kSflkaxOiVw7a1W3g1LCWP4nuFk6jMZyed5ThX9HvQ7W29tpYN/B9r7t39uzyEVPfndfl0DKH7/+iqKoiCEWG6wqJ6SoijtgfalSpUq7FAk6ekkhcH6QepiXt+60GM5nFkGf36m9k9q+IG6HkYWt3sm8alZjN94gd1XIqlb0onP2pXD3MQ4x3V6vWDCxgsExaSyoH8NWlXwKIRoi4ao6d+hS0jAd8F8FGP1exm7dCnCLwD9G33RafUYmxix9tpaIlIjaHl9INWaVs71XqciTvG/w/+jkkulPLdiS9I/HpvIKIqyAvAHzgG6+4cF8MIlMkKIbcC2mjVrDi3sWCTpqfzaDyIuQo1Bal+kbaPh+k51ZKbbYnCvUNgRFnkHb0QzYtUZUjO1jGjiz4ev5z7CcvhmDJ/8dpE7sWmMaOIvk5hH0ISFkbB5MxaVKmFZWU1O0i9fJuP8BRJ7fszeb8/S+4vaOLnbMKb6GErfq8OdhEx8yjrmuNf1+OuM3jsaJwsnZjWfhaWJ5fN+HKmIyc+ITE2gvBAiz5oykiQ9I50WjE2gWn9wCVBbDMxvAEIPjcZD4wnqeemp6fQCBahdwokhDUrQqLQr1f1yfpACTN91ldl7b+HtYMl33avQpZr38w22iIlfvRr0ery+mfrgWOwvap+kZM+KGMUn0GN/J2a1mEVZp7JkXbPAzEKLq1/2kcXTkacZ9ucwzIzNmNV8Fk4WckeY9Hj5+cl4CbWOTLiBY5GkV09KNPwxFiwdocPPULUv/DkRTsxXC951mg1OJQs7yiLv5O04xq0/z9y+NSjvZceYFqVzvU6nF3yy6SK/ngqhXWVPpnWtjLW5TCAfx23cOBz798fUXd3plXrkCMk7d+L05gCO30kj2jqEFG0KZsZmCCFIiErDtZhdtpGwy7GXGfnXSJwtnVnSegneNjJ5lPInP39DXYAriqKcAB4s8pWVfSXpGYWdhQ1DIO4W1HsXUmNhbW8IOQ5l20G3JWBiVthRFnnbL4YzZu05ABLSs/K8LjFdw7j159l9JZKeNX2Z3LkipnlVxJMAEBoNqUeOYNO48YMkRuj1hE/6AsXMjPDmzUldnEJg8RNMaTCFkvYlSY7LID1ZQ4kqLg/uczryNCP2jMDU2JS5LebKJEZ6IvlJZCYZOghJeqVkpsDOj+DsSrCwh16rQZsB8xuqi31bfKFW7JU7Y57ZjovhjFh1hrIetiwdVBsP+9wLBobGp9Fsxn6ytHreaezPR23K5nqdlF3M3LnEzJlLyW1bMQ8IACB59x40d+9i8fl4vt//G1VoycAWPWjm1xhQ2xIAuBdXa/CcizrHsD+HYWNmw9LWS2WtGOmJ5Wf79f7nEYgkvTJMLdUFvZV7qCMxOz9St1U7+EG/jVBKdvQtCCeC4xi+6gyVfexZPbQuNnlMEQWGJzFk6UnMjI2Y0b0K7at4PedIi6bMoCBi5szFplmzB0mM0GqJmTMHTE3x69SLXtFHMYm0pWGNh8Xhb1+IAcDV15bNNzcz+dhkrE2tmdpwqkxipKeSn11LyTxsHmkGmAKpQghZ0lKS8kuvhwPTofoAsPOEt/bAwe/VURgjE2j1NdR5Ry7oLUC1SzixemgdKnrb55nErD8VwmdbLmFqZMSiN2tSp6Tzc46yaBIaDXeHvIViaYnHZw+3R8evWsVfxtdxGP0GZS0saObXDPyyvzYxOg07FwsWBS7k57M/U86pHD81+wkPa7krTHo6+RmRebCsXFFXZnUE6hoyKEl6aQgBV7bAoe8h/Ly6LqbrIvhtGFz9HRyKQc8V4FmlsCN9KfxTH6ailz2jm5eivr9Lntf+/NcNZuy+TmUfe2b1ro6fs+zhk19RM75HGx6Oy4gRmHqqRQQTUmP56sYs9nQ0poJzCHXCIji9Npx6nf0fVPQVQhAfkUa6bxQLzv5ME98mfN/ke9kEUnomT/TPv/tbsDcrivI58JFhQpKkl4QQ6g6ko7PUrzvOBht3mFkR0uPUaaWWX8kWAwXk7N14xv56jtuxadQp4ZRn9d27sWmMXnuWcyEJ1C7hxLJBtbE0y1kMT8qbQ88emHp54jRgAAChyaGM3NiPoIAMWptV47NWswg9mULYjQQ0WboHrwu/F0tmmpZDWXto4tuEbxp+I5MY6ZnlZ2qpy7++NEKtK5NhsIgk6WVx9xgcmwvFG0L3ZXBqMWwZCSjQey2UaVPYEb4UhBDsuhzJB+vOIYCVQ+rQICD3kZig6BQ6zjpMlk7PZ+3KM6BeMbkz6QloIiIwcXbGvEQJzEuo61k0eg3/O/I/7mli+fiIE71/WYxiYsLNU7cwszTBp7Raqyc8JZyvNv1MRVrQuEZthjcdJFs9SAUiPyMy/25yoQVuo04vSZKUm5CT4FpG7Ug98jiYWsPfX8HpJeBTG3qtAhu3wo7ypREUk8q3u65iZ2nK6qF1KeFinet1l8MSGbb8NCiwZljdPIvhSbnTp6UR1KEjph4elNiyGUVRSNemY2liyUBRj+SVR6ndtRuKifqxEnMvFU9/exQjhUxdJm/veRv/mAYYWcA7zWUSIxWc/KyRGfQ8ApGkl8LFDbBpqFoDpkInuPW3Or2ky4JK3aHjHFkbpoAEhidhbKRQ2t2WtcPqYmVmkuei3r+vRvLOyjPYWZiycEBNmcQ8hbjlK9AnJeE65WsEgomHJhKTHsO8FvPwXbIHLe44D1O7w2iydKQnZeFewo6krCRG/TWK4MRg2mnG4FXKWSYxUoF67Jiqoig+iqL8pihK1P1fGxVF8XkewUlSkZEeD9veg41D1L5IxRuqu5J2jAcrZxh5EroulElMATlzN54e84+y9MhtANxsLfJMYm5GpfDBuvO42Zrzx+gGcmfSU8gMCiJm/nysGzbEomljJhyYwNZbW7E2tSbx4AEyzl/AoUd3jCzUOj3aLB1+5Z2wc7Hkq6NfcSbqDJ9U/QxNPHj42xfy00gvm/xMDi8BtgJe939tu39MkiSAmJswtwGcXgrV+sGgHXBwBvz1BZRsCu+eBNfcS+JLT+67XdfoNvcIpsZGDKxf/JHXXotIpteCY2h1guWDa+Nul3tBPClvQq/n3rhxiMxM3D/+iE8PfcrO2zvpXro70xtNJ2H2XIAHC38BLG3MeGNUZdbpf2Hn7Z30KtOLBuYtAHDxtimU55BeXvlZI+MqhPh34rJUUZQxBopHkooeS0ewcoIOP6prYFZ2gdCTUKGzutXaSO6IKSifb7nEsqN38HOyYv079R6ZmOy8FM47K89gZWbM8sG1KekqP0Cfhj41FdtmzXHq04fdXGHH7R30KN2Dz+p9Rvz69aSfP4/7xx9hbPuwAeS9uHA+P/EZxyOP0yWgC+NrjefYhmBAjshIBS8/iUysoij9gDX3v+4NxBouJEkqApLC4I9x0OJzdWHv2wcg8hJ8FwDaTHUtTLW+hR3lS0UIgZudBVV87Fn3Tj3MTfJOEJceDmbStiuUdrdhyaDaeDtYPsdIXx76zEyMbGxwHjEcIyMj2go9RhjRqngr9OnpRH//A2b+/jj27//gNScjTrJnajDOFtX4oH8D3qzwJoqikBSbgZGJgoW13G4tFaz8TC0NBnoAEagdsLsBcgGw9OoKvwDzGsC1PyDysnrsxp+wsKWaxLSeKpOYApScoWHZkdsoisKIJv78NuK1PJMYIQQz/rzGpG1XqOLrwPq368sk5imJrCzuDhrM3SXzGPn3SPbe3YuRYkTbkm0xMTIhYtIX6OLjcZ8wHuV+LaRTEaf4ZPvn2GW6UKtcZQZWHPhgYW/4rQQ8SsjRGKngPXJERlEUY2CK7HQtSagF7v6eDAe/A2MzGLRT3WJ9bB7snKAWuxt4CFxKFXakL43bMakMW3GK65EptCzvjpeDZZ69NLU6PSNWneHPK5E0KePK3L41ZKG7ZxD1w0zSz5xhdYk7HDJOpIF3gwfnUvbvJ3HLFuzatsWmUSMAFl9azA+nf6BGnLoWpnGzqg+uT03IJDNVi1tx2dlGKniPTGSEEDpFUYopimImhMh6XkFJ0gsp9pbaaqBYA+g8Dxx8IWi/msS4V4L+m2R9mAJ0LyGdPr8cIywxg5k9q+L1iJGVtCwtY9ae488rkfSq5cuUzpUwMpJbfJ9W8r59xC1ZQlhJO7aUSmB8rQn0LaeOMuqSkgj7dCLGri54/O8zUjWpDNo5iMC4QMo5laN9Um8SbTNx8X24JinsZgIAJavk3TJCkp5WftbIBAGHFUXZCqT+c1AI8b3BopKkF4lOozZ2dCkF/X+DEo1BUdSaMRuHgIW9TGIKWHBMKp3nHCZDo2PJwFo0LZv39/ZEcBxj1p4lLDGDdxr7M6F1GVmn5BlkBgUTNu5DMuwt+ax9KsOrj6R/eXUNjBCCe2PfRxcTg9/yZUSZpPPezmEExgXSxKcJM5vOZN6I/fhXd8v2ZxAfrn50uPrZ5vqekvQs8pPI3Lr/ywiQ/xdKr5bo62pbAd/a0OILKNlEPb77czg8ExQjGLBFJjEFzMNOrQuzoH9NapdwyvO68yEJ9Ft4HL0QLBtcm8alXZ9jlC8nXUI85mXLkDiqKz1N7zK8yvAH5+JXriL18GHs2rUjsbwPvX7vSbImmakNp9KuZDsA+n5Rl+S47F1sQq/G4+BuhYmc6pMMID+Vfb94HoFI0gsn+hosbg1ZKVB7GBibqOtkdoyHEwvU1gMfBKojMtIzS0zXMH7Deb7uXAkXG3MOfNj0kdNDx4JiGbnqDDYWJmwaXp/iebQmkPJHCEF0UgQzUzfw1fJlFDcypva/z+t0xC5ejJG9PQ5TJjFg5wASsxJZ1GoRNT1qPrjOwd0KB/eHncTTkrIIv5VI1ZZ+z/FppFdJfppGbgPEfw4nAqeA+UII2UBSevnc/As2DFZ3IQ3cDr61ICsN1g+EG7vAuyYM/B1M5Y6YgnA8KJZhK06TmK7htVIuDKhX/JFJzPRdV5m99xYuNuYsHVhLJjEFYP+CScT+tpG/uhnzZoU3KeNUJtv5lP0H0IaHY/Plx/T4vQd3k+/ybaNvsyUxF/eFYmxiRPkGXg+O3TgZCUBATTlqKRlGftfIuPKwjkxPIBkoDfwC9M/jdZJUNCWGwuEfwcRCTVY8KkF6AqztA3cOQ+MJ0ORj8tw+Iz2RhQeD+Hp7IE5WZix6sybNy7nneW1KppYP159nx6UILEyN2Prua49cBCzlz+k/V+L84zp0npYs77QqRxIDEL9yJTg60DPtJ5KVTMbVHEebEg87uAshOLn9Nl6lHLIlMunJ6j4RJy+ZbEqGkZ9Epr4Qota/vt6mKMpJIUQtRVEuGyowSXruziwHt/LgUxN6LFcr8prbwt1jsKY3pMep62QajCnsSF8aEYkZTP4jkIrediwdVBsXG/M8r9XpBX1/Ocb50ESGNizBh6+XxcwkP6WwpEeJSY0mY+JUsqyNqLbkV5xcAnJckxkcTOqRI2xvZE2akZbZzWbTyKdRtmtS4jNJT8rC8z+Ve2PvpeDoaY2JqVwfIxlGfhIZG0VR/IQQdwEURfED/tlXJ7dkSy+Hk4vgj/eh5hA1kbF0UI/vmQSHZoK5HfRZD6VbFWKQL4+Tt+Oo7ueIh70F07tVpn0VLywe8UGXkqllzNqznA9N5IsOFXjzMT2WpPzL/PoHnJL0aD8dgZNfziQGIHzK12iNFbZWzuSXVoup5VErxzW3zkQB4OyTvRVEzL0UPP0dCjxuSfpHfv458wFwSFGUvYqi7AMOAuMURbEGlhkyOEkyOCHg0A9qEuNTS205AJCRBJtHqudKNISRx2QSUwD0esHSw8H0mH+UPYHq2onuNX0fmcQkpGXRd+Fx9gRG8U5jfwbUK/a8wn2p/RH0B+GJ9yBLg2P/flTsOzLX6+JPHyf94GF+qwsDm7yfaxIDEB+RBoB3aYcHxzJSNaTEZeLgJqf/JMPJz4jMDiAAKHv/62uAEEJkAjMNFJckGZ4QsKo73NytFrnrvVrdgRR+AVb3hOQwCHgdeq1WdyxJzyQhLYvRa89x4Ho0tYs7Uc/f+bGvSc/S0X/RCS6FJfJt18r0qOX7HCJ9+a25uoZpR76mhHMAq79ZjaVJ7olGZGokf09+mwrGUO6tsXSvmHd3GlMLYwJquWerHxN6NR4AFx9ZuUMynPz8dF4khBgMnAe4PxKzFWhuyMCehqIo7YH2pUrJEvFSPigKlGoBnpWh6UQwMoJrO9TdSnot9F4LZdo8/j7SYyWma+i36DiX7iUxulkp3mtRGuPHVN5NzdTy7uozXLyXyM+9q9G+itcjr5ceT6PTMPyv4Zy4d4yJmxSajhycZxJzKuIUM34ZxP8CtSS+UY/u9YY+8t4NugWg1+mzHYsITgTAu4xDgcQvSbnJz9TSPUVR5gAoiuII7AZWGjSqpySE2CaEGGZvL+t6SI9waRPsnQp6HdR9B5r/D4Qe1r0Ja3qBLguG7ZdJTAEKjU9DCJjerTLvtyrz2CQmOUNDj/lH2XstmnGtSsskpoB8cfQLjocd44s/Hah0U4tRZGyu1225uYURWwcyYrtaeaPG+G8eed+Y0GS0WTqMjLN/pAQeDsfT3x5zK9nxWjKc/BTE+0xRlG8VRZkH1AC+EUJsNHxoklTAhIAD38HeyWDtCvVGgoWdWitmRWd1a7VLGXhrtyxyV0BOBMfh42hJBS97/hjdMF+vuRCawOClJ4lJyeL9lqV5t1nuC1Cl/NMLPUaKEW9WeJOGx1PwO7sLxz69cR44MNt1QghmnJrBsivLGL/fGpf4JHxm/Yype941YIQQbJx2GmtHc/p9We/B8aSYdLLStXgGOBjoqSRJleeIjKIoXf75BRwH6gJnAXH/mCQVLev6q0mMV3UYsltNYpLCYVZNNYmpNRRGHpdJTAFZfvQ2PeYf5Yfd1/P9mn3Xoug69wgpmVpm9anG6OYyiXlWf9/9m/f2vsfN+JuUVFwp/utRjOztcRs/Ptt1Wbosxh8Yz7Iry2hMGWqeT8WyShVsW7R45P2TYjLQavSUqpE92QkJjAOgWIW8W0xIUkF41IhM+/98fRYwvX9cAJsMFZQkFbhrOyFwG1TtCx1nq+tjQk6o9WHSYtQ1Mo0/LOwoXxr/VN4FGNao5GOvz9DomLj5EhvPhOJoZcbmEa/h52z12NdJj7Y9aDsTDk7AxdIFa1NrwATFxASf2bMwsrB4cF1CRgLDdqvNHzv7d2Lw3GDStTo8vnx8h5qoO0kAFKuQffF2fKS6i8mtuF3BPZAk5SLPREYIkffydEkqKrJSwcxabfpY711oMUlNYkJPw9J2YG6jdrT2b1bYkb405u2/xey9tyjubMXqoXUfW3l31+UIPt9ymYikDFpX8ODjtmVlEvOMhBDMOT+HeefnUdK+JPNbzsclyxxjRxtKbtmMievD5prhKeGM+GsENxNuMq7mONruTSHm9AZc3n0XizI5K/z+1/m/QjC1MM6RsCRFp2PtYC4L4UkG99jFvoqiLFMUxeFfXzsqirLYoFFJ0rMSAjaPgFm1IGgfWDnB61+DYgx7p8Cilmrn6mH7ZRJTwJyszGhV3p0/xzZ+bBKz8tgd3l5xmoikDOb0rc68/jUo5ixL2T+rq3FXmXd+HnU86rCy7UqMl2wkuGtXtHFx2ZKYNE0aQ3cP5WbCTaY0mEJPk3rEzJqFRZXKuIwc8dj3EXpBYnQ69q6WGP+nynJIYBzucjRGeg7ys/26shAi4Z8vhBDxiqJUM1xIklQA/qkP41ML3Cuqx2Jvwbb34PZBtVJv96XgIOuSFIS0LC3XIpKp6utAp2redKvh88imjwArjt7msy2XCXCzYfXQurja5t2eQMofIQRaoaWsU1m+qP8FnUt1JnnPHmLmzEExMQGd7sG1Wr2WcfvHcSfpDl83+Jp2fq25XrceioUFXlOmZKsHkxfFSKHvpLpkZWizHY+PSEWbpcfW2SKPV0pSwcnP9muj+9uuAVAUxYn8JUCSVDj2TlWTGK/qMPhPsHaBE7/Az9XVJKbuSBgfDKVeuFJIRVJiuoY2Px6k85wjbDxzDzMTo8cmMd/vvs5nWy5TwsWaVW/VkUlMAUjMTOTDAx+y4soKALoEdCFu8RLujRqNma8v/rt3PxiN0el1vL/vfQ7eO8jQSkPp4N+ByKlT0aem4v7RBMz9/fP9vhY2pti5ZB95O7v7LgCVm/kU0NNJUt7yk5DMAI4qirIeUIBuwNcGjUqSnlbMDTixAAJaqRV5U6Nh01AI3n+/m/V28KlR2FG+NNKytPT55Rh3YtN4t2kputV49AdXYpqGqTsCWXsyhBrFHFk7rC6mxrLx47O6FneN3n/0RqPX4GntiaIoZN64QdR332Fevhx+v/yCibO6GFcv9Hx17Cv2huylX7l+jK4+mvSLF4lfvQabZs1w6NkzX+8phGDn/Et4lrKnagu/bOei7yZj7WCOnbNsTSAZXn7qyCxXFOU00PT+oS5CiCuGDUuSnoIQ4BIAo06rXaujrsDCFmqBu4YfQKMPwVT+YC0oSRkaes0/xpXwJL7vUYUu1R+dxEQlZdB34XFuRKXQsrw7P/WqJpOYArAvZB/v7X0Pc2NzPqv7GZ0DOgNgHhBA8fXrMQ8ohZG5OuIlhGDkXyM5dO8QHfw7MKH2BIRWS9j4CRg7OuI5+at8TSmBmqwEnYvGs1T2cgWpiZnE3UulSgs5bSs9H/maIhJCXFYUJRqwALUD9j/dsCXphXD1Dzi3GjrPVxf2nl4G20ar5zrNg6q9Cze+l1BIXBoOVqbM7FmVTtW8H3ntzagUus49Qmqmlu97VKFzNe98f2BKeUvISGDJpSU4mDuwrPUyitsXR+h0pOzbh02jRlhWrPDg2rCUMEbsGcGtxFv0KN2DiXUnAhD9449kBQfjOfkrTJzyX/Pln27X/tWz148JPByOXi8oXdujAJ5Qkh7vsYmMoigdUKeXvIAooBgQCFR41Osk6bm5vgvW9lF/r9fCHx/AyYXg5K8u6PWsXKjhvWy0Oj3pGh0VvOxZNrj2Y0dVbsek8ubiE2h1epYPqU19f5fnFOnLKy4jDgUFRwtHFrRagF7oH/RMCvtwPEnbt+M1fTr27dsBcCD0AKP/Ho1O6OheujsTak9AURQyrl0ndvESrBs0wL5r1yeK4e6VONxL2GHrlH1B762zUTh5WePiY1MwDytJj5Gfcd2vUKv6XhdClEBtFnnMoFFJUn4FblP7IzmWUNe/nFmmJjEBrWDkCZnEFLCQuDQafbuXjrMOczMq5bFJTHRyJoOXnuReQjozelSRSUwB2HRjE41/bUyjXxtxOeYy5sbmWJpYok9N5c7AQSRt345j374PkphLMZf4+ODH6ISOtW+s5X/1/oeZsRmasDBCR41CMTHB88svnmiELCEqjZiQFIpVzF4ELzYshZiQFAJquhfoM0vSo+RnakkjhIhVFMVIURQjIcReRVFmGjowSXqs2FuwfiDYeMBbe+Dg93BstrrdutcaMJab6wqKEIIvtl1h6ZHbKAqMf70s/q6PrvfyV2AkX2y7Qkh8GrP6VKN1Rc/nFO3L6V7KPWadncXvQb/jaO7I1IZTqeCiDowLIQgZPoK0EyewrFoVt/Fqleqdt3cyfv94BIJFrRZlu/7e+x+guXcPn59+xNTryZpyGhkr1OviT6n/TCud/D0YgFI18+7NJEkFLT8/6RMURbEBDgCrFEWJAlING5Yk5YNTSaj+Jrw2Rp1OurIZUGDgHzKJKWBTtgey9MhtvB0smd+/BhW98+5HpdMLPv3tImtPhmBtZsyyQbVpVNo1z+ul/Pknieng34GxNcbiYvlwdEuflISJmxvOb7+N29gxAKy5uoYpx6dQ3K44Pzb7kZL2D1tFxP6ykPRz53CbMAHb5k9ehsDG0YLqrYrlOB4TkoKZpQkObrIys/T85OenfUcgHRgL9AXsgS8NGZQkPZImHe4eVSvytvxSLXJ3ZTOU6wBdF4GJWWFH+FIRQlCjmCMxKVl836PKI6cghBB8vOkC606F0qq8O992q4yDlfzzeFrJWclk6jJxsXShS0AXepXtRRXXKtmuEXo9xvb2eE3/Vt25B+y9u5cpx6cQ4BjAwlYLcbJ4uIg34+pVor//HvOAUjgN6P/EMSXFpHPjVCRl63pi7fCw/k9ceCqJ0enU65L/GjSSVBAeu0ZGCJEqhNALIbTAH8DPQohYw4cmSbkQAvZMghVdIPw8rOwClzaozSB7LJdJTAHadj6Mtj8eBKBleQ9+6Fn1sesovtl5lXWnQqnu58CCATVlEvMMzkadpcX6FrTd1JbotGhqedTKkcRoY2O507cfSbt3oygKipER1+Ku8eGBD3GzdMuRxGiiorg7dChGdnb4LlyIYvzkfZCCz8dwbHMQ6SlZ2Y5H3EoEwLes7HYtPV95JjKKotRVFGWfoiibFEWppijKJeASEKkoSuvnF6Ik3afNgt/ehuPzoPhrsOkdCDkO1fpBpzlqM0jpmen0gs82X2LUmrOEJaYTGp+O8WMq9Qoh+GbHVebvD6JmMUd+fbvec4r25ZSYmchHBz4iTZvG5/U+x9Uq59Sc0Gi4O3gI6RcvYmynTvVdjrlM3+19MVKM+OX1X7IlMdr4eIK7dEUXHYPXN1MxdX+6BblB56Kxc7XExcc22/HrJyKwsDbFWe5Wkp6zR00tzQI+QZ1K+htoI4Q4pihKWWANsPM5xCdJD+2bChd+hYpdIWg/pMVAs4nQcFxhR/bSCI5JpfOcwySkaWhZ3p2fe1fD4jHdixPTNAxdfooTt+NoXNqV+f1ryEJ3z0Cr1/LBvg8ISw1jbou5NPBukOt1YZ9+Sua1a3h8/j+s69TmQOgBPtj3AQoKc5rPybYmBiDy6ynoYmLw+u47bJs9XaPUjFQN4TcTqNg4e/HD1IRM7l1PoPrrfo9tTyFJBe1RiYyJEOJPAEVRvhRCHAMQQlyVhayk5y4jCc6uBI/KcGWLWi9GFrorcFfCkkjL0vF+y9KMalbqsVNJR27F0OeX4wCMaOLPB63KPHb0Rnq0+Ix4TkeeZljlYbkmMUIIIqdOJWnrNqwbNsSxd2+WX17O9FPTcbV05fsm31PVrWq21yRs3EjS779j16E99u3eeOrYrh4NRwgI+M+upFtnowEoUVUu6paev0clMvp//T79P+eEAWKRpNzptGBhB22mwYZBD3sm+dUp7MheGsfCtDQWghbl3dj5XkNKuj56eiBLq+er36+w4tgdXGzMGNOiNP3q5tzFIuWfXqg/cl2tXFncejFVXavmea19+w4oJqbYjHiLiYcmsuXWFmq412Bmk5k4WDhkuzbr9m3CJ32BRfnyeE2e/EwxuhW3w87VEg//h7vWhF5wfGsQtk4WuBeze6b7S9LTeFQiU0VRlCTURpGW93/P/a9lb3bp+Qg7q26tbv4/NYmxcIB3T4GN/JdfQdDq9EzZfpXFFzJ5rVYMDQNcH5vEXItIZuTqM9yMSqFLNW8mtiuPk7Vc1Pss0jRp9PmjD542nvzQ5AequVXL9br0CxcwL1MGy0oVsaxUkU8OfsK2oG20KtaKqQ2nYmac888h4qvJIATeM39AMXu2PyevUg50+aB6tpG6O5diyUrXUrmpD4ocjZMKQZ6JjBDiyZezS1JB0WmoeHEy7DsJplbw2zvq8X6bZBJTQM6HJNBx9mEAvGwUahZ7/G6TI7dieGfFaZIytExoXZZ3GpeUPZOeUWJmIkP/HMqtxFu0LtEaC5Oc/04UOh2RX39N/Oo1WNevh++iRSy5vIRtQdvoXKozX76We0WMxC1bSD18GKfBgzHz88v1mvyKDE7CztUi25ZrUBf5AlRpLptESoVDVg2TXkybhuESexKsXMDGTe1k3W4m+NQo7MheClHJGby1/BQA7Sp70tkjEUuzR//b5XJYIn1+OY6iwKYR9anu5/g8Qn2pXY+/ztA/hxKXEceEWhPoV75fjms0kZHc7tkLbUQEltWr4/ndd8w4NYNlV5ZRx6MOn9b9NNd7xy5aTNT06RhZW+MyYvgzxanT6Nn8wxm8SzvS7t3sW8BvnIrC2dsGC2vTZ3oPSXpaMpGRXjwpURB8gGSbEtimBKu7k+q8AzUHFXZkRV5yhgYrMxNcbcyp6uvAO439qVHMkX379j3ydamZWkavOQvA76MaUMEr78q+Uv5dirlEXEYc3zf5npbFWuY4L4Qg/ONP0EZG4jR4MPoR/Wi9vTtR6VF4Wnsys+lMzI3Nc7wu7eRJoqZPB8D/z10Y2zzbluhrJyLQZukpUzd7R+uIoPu1Y8rL2jFS4ZGJjPTiSIsDc1t1BKZce2xOLwVjc3j9a6j1VmFHV+TdiEymx/yjtKnkyeSOFfllQM18vS5Do6PvwuPcik7lx15VZRLzjJKykriYdpGG+oa0L9meyi6VKeVYKs/r7d54A5vGjUjt0oyB2/sRlR5F14CuTKw7EROjnD/Cs0JCuDt4CAAlt2/HxNk5xzVP6p/pI78K2e91+2IMABUaPlmvJkkqSDKRkV4MQsCq7urvnUrAxfVoTB0we3sPuAQUbmxFnBCCOftuMX3XNQCq+znmu9bH2bvxjFh1hvDEDD5uU5aOVb0NGepLLzkrmaF/DuVK7BWKBxenvX/7XJMYfVoaMXPn4Tp6FA5duxCUEET/33uRpk1jTvM5NPRpmOv9NZFRhAwfjtBo8J0/D/OSJZ455oTINO5dS6BqC1/MLbN/ZFw9Eo6ts4XsrSQVKpnISIVPp1G7WN87BY4l1P8Wb8gpzyHUl0nMM8nQ6Bj76zl2XIqgrIctiwbWwtvBMl+vvRKWROc5RwD4X7vyDG7w7B+Kr7KgxCDe3v02EakRDHAeQHv/9rlep42J4WbzFojMTExcXUnv0oy+2/uiEzoWv744zx1NuqQk7vTti+bePdzGj8emceMCiTs5NgMnL2sqNc1eBC8hMo3UxCyqv/5si4gl6VnJREYqXJoMmFsP4oLAwQ/ig8GvPgzYStaBA4UdXZEnBEQkZdC6ggez+lTDJB8Vd1MztfRbdJyzdxMwMzFi8Zu1aBDg8tjXSXkTQjDpyCQiUiP4sv6XON7LfaF0xrVr3B3yFiIzE48vv4AOLRmxcyApmhR+avpTnkmMPjOTO/36o7l3D5/Zs7Ft1rTAYvct70Tv/+Ws2XTtuDrdVLKqW45zkvQ8yURGKlxnlkNcMLiWheirULwhDNgKRrLE/bNYdCgYB0tTutbwYeWQOlib5++velKGhh7zjnI1IhkbcxMWvVmTOiWffY3Fq04rtPjY+FDTvSadAzqz796+HNfoUlK43b0HipkZXt99h0WbFjRc25B0bTpf1v+Spn65JydCqyV0+Agyr1/HY9KkAk1irp+MwKOkPXbO2Ufx9Do9gYfDcPSwwq2YbR6vlqTnQ35aSIVDpwG9HuoMg66LIP42WDpB77UyiXkGQgim7gjkq9+vcOpOPEC+kxiNTk+fX45xNSKZ0c1KcemL12USUwCuxl3F1MiUiXUnMqraqDyvM7axwb5zZ4qtWsn+cjpqrqxJujadd6q8Q+eAzrm+RghB+KefknrkCC6jR+HYq2eBxa3V6Diw5jp7V1zNcS7kajypiVlUbuYri+BJhU5+YkjPX0o0zGsAv78H4Rdhy0jQZsLA38Fcds59WhkaHY2m72X+/iDqlHDis3bl8v1arV7Q/udDXLqXxNgWpXm/VRkDRvrqWHZ5GT1/78m1uGtYmVrlWjwwee9eknbvRpeQgOcXkzhgfodPD6m1YQZVGMTIqiPzvH/Cr7+SuGUrtm1a4zpiRIHGHnQ2msw0LZWaZF8bI4Tg8PobWNqaUqaORx6vlqTnR04tSc9X1FWYc3++3acWLGymLuQY+je4Vyjc2Iq4IctOEhKXTrvKnszsWTVf62FATYCmHM8gKFHPR23K8k5jfwNH+mrYemsr3536jgDHAEo6lMz1mn+K1mFkhN/ixayxvsiPZ37EwtiC3zr+ho+tT66vA0i/dJmIr6dg6ueH93ffFXj8lw7cw9zahOKVso/KXT8eQXxEGvW6+GNqLgvAS4VPJjLS8xN7C1Z2BcUY2v8I+78FXRa0ngbe1Qs7uiIrU6vD3MSYtxqUpGt1H7pUz/vD77/SsrQMXX6KoEQ97at4ySSmgKy4soJvT36Lm6Ubc5vPxdQoe9VbJT2dyG+nE7d4MaY+PhRbuYIdqSf48dCPeNt4s6LNClytcm/FIYQgZtZsYmbPBsB7xncoxgWbUCREphF+M5GqLXwx+k9CfPlQGChQVbYkkF4QMpGRnp8buyEpVE1czq+BxLvq+phK3Qo7siJrw+lQfvzrOtO7VaFp2SfbPRKdnEnHWYcIS8ygVxkzvumd+44Y6clkaDNYHbgaF0sX1ndYj5NFzqq3lgcPErfpN6xq1cJnzmwOJpzm00OfUsqhFEteX5Kjg/W/xS5cSMzs2Zi4u+M7by4W5fI/hZhfyXEZeJd2yHVaKSkmA+8AhxwJjiQVFpnISIYXewvsvKHuO+BZGdb2hfQ4aPShTGKeQURiBuPWn8fWwoSqvg5P9NoD16N5e8Vp0jU6ZvasikPiDcME+QrR6XXcTLhJGacybO20laj0qBxJjC45GcXYmLTmzSlVsSJOffqQmJnIV0e/wsrEisWvL35kEpOyfz/RM77HvFw5SmzcgGKghfG+5ZzwKeuYY01PTEgKqQmZ1GxTzCDvK0lPQ6bUkmHF3IAFTeHcSnWX0rL2ahLT8itoNrGwoyuy1p8KocG0vwH4tG05LEzzP7VwPiSBAYtPkK7RsXhgTTpVk9V6n1VMegztN7dn0K5BrL26FlNjU7xtsn9fNWFhXK9Vm6Tt28HY+EES0+9+24EZTWbgaJF3I864ZcsIefsdjKys8Pnhe4MlMfeuxxMZnAQi57mgc9EA+JSVvZWkF4dMZCTDibwCyzuC0IFnNfi1L+i1agLz2ujCjq7ISkzXMHPPDVxtzVkxpDa9aue/smpyhoZhK9Su10sH1aJZWXdDhflKEEKw/vp6mq5rSkhyCK2Lt6ZnmZxboFMOHebWG+0A0KemAhCcGEz3bd25nXSbj2p/RAPvBnm+R/j/Pidy6jeYFvOjxJbNmBUvbrBnOrjuBltmnkWInJlM8IUY3IrZ4uAuWxJILw45tSQZRthZWPKGmrj0XgNnl8O17VC2nTqlJD2xE8FxRCdn8kZlT7a8+xo25iZPNBKz6FAwX/1+BYCfelejSRlZkfVZfXroU7YFbQNgWsNptC3ZNtt5odUS/vnnJG7cBID39zOwa9uW6zsXMGqzWlPmo9of0bdc3zzfI/LrKSSsW4d5uXIUX7MaIwsLAz2NOhoTG5pCrTeK51gDEx+RSmxoCjVay2kl6cUiExnJMI7OVpOYAZvByAROL4WKXaHb4sKOrEi6GZVCj/lHcbAypZ6/My425k/0+n8nMSOb+tOhiuxWXBC+eO0LKrlWolOpTlia5OxhpUtOxsTJGYvy5fGZOwfF1ZlpJ6axNnItrpaufFH/izwbQAIk/fkn8StXYlGxIsXXrkExMeyP7BPbgjEyUajcLOeOpJN/3AagQiM5FSm9WGQiIxU8IdSdSXWGg40rzLv/g7rpp4UbVxF1ITSBwUvV6aCvO1XCydrsiV5/JSyJqdsDqeJjz+qhdfNd6VfK27Zb29AJHZ1KdaJ32d45zusSE8m4cgXrevVwHTsGtw/eJ1OXSeO1DUjVpOJh6sGSNkseWSdGZGUR+fUUMDLC95cFBk9i4sJTCbuRQMmqrlhYZ98unpqYSfCFGJy9bbB1MtyIkCQ9DfkTTSo4WWnqmpgGY6FsW9CkwfyGkJEAfTeCs6xR8qSCotWRGL0elg+uTaPSudcWycule4l0mXsEU2MjZvWpLpOYZ5Sly2LwrsGcjz5PWaeydPDvgJGSfQpGl5DAnTcHknntGiV3bMe8RAkiUiPovKUzqZpUanvUpr95/0cmMQARU6agjYzEc8oUTBzzXgRcUOycLXDxteG1bqVynDv/VwjaTB3NBxb8Vm9Jelbyp5pUMPQ6mF1HrQ0Tcx0yXoOlbSE9Ht7cBiUaFXaERZKXgyUWpsase7sepd2frDlfhkZH93lHydLqWTa4Nr5OcoHms8jSZdFvez8C4wIp61SWRa8vypHECL2esIkTybx2TU1Aivnx9bGvWXttLaC2HBhdfTSHDhzK831EVha32rdHc+cuti1b4NAl9z5LBc3EzJhuE2pibJL9mVITMjn7511KVHHB1Vc2iJRePDKRkQrGugFqEtPgfWgwBjaPgIS7agVfmcQ8sYuhiQTFpNCxqje7xzbG1fbJ1sT8fiGMTzZdJF2jY3zrMjR+wpEcKafFlxYTGBfIe9Xf461Kb+V6TeTUb0jZ8xfOQ4eiad2Ahr82JDkrGU9rTz6q/RHN/Jo98j1ST5zg7oA3ATDz98d7xowCf47c3LkcS3pyFqVq5FwAfvN0FABVclk3I0kvghc+kVEUpRPwBmAHLBJC/Fm4EUk5pETD1d/B2hWa/w92/w/OrYJK3aHGwMKOrsi5G5tGl7mH8Xe1oXVFjydKYoQQTNp6mWVH7+BuZ87wJqUY3kRO6RWEht4NcbV0pWvprrme10REkLBhA2bFiuH6/lg6belEclYy3Up34391/5drw8h/S9iwgfCJnwHgNu4DnN/KPVkqaEIvOPXHbSKCEnNNZO5cisHC2hSv0g7PJR5JelIGTWQURVkMtAOihBAV/3W8NfAjYAwsFEJ8k9c9hBCbgc2KojgC3wEykXnRmNtA6dbQ5CM4uwIO/wi2nupojPREQuLS6LngKBqd4KM2ZTE3yf/2aq1OT5e5R7gQmkir8u781LvaE23PlnJKzEzkxzM/0qZEG2p51KKCS87Gpvr0dDICr2JVvRoB+/eBXs/Iv0YSlBjEkIpDGFNjzGPfJ+3s2QdJTMk/fsfc//kln+f/DiEiKJEarYth8p//X9KTswgJjKfca56PTcQkqbAYekRmKTALWP7PAUVRjIHZQEsgFDipKMpW1KRm6n9eP1gIEXX/9xPvv056keg0YGoJvdfC7YOwdRRYOcOQP8HMurCjK1LuxKbSePo+AH7sVfWJ6rzcjEqh14KjxKRkUdXXgfn9a8gPnmcghOCHMz+wJnANGbqMPIvV6RITCR35Lll37+K/aycXM4IYvGswGr2G4nbFGV398YUf0y9e4k7vPmBkRLGVK55rEqPV6Di84SYuvjbU7pCzQ/e5v0IAKFdfbteXXlwGTWSEEAcURSn+n8O1gZtCiCAARVHWAh2FEFNRR2+yUdSfxt8AO4QQZwwZr/SEksLUBb6vfw0VusDG+0PhfTeAQ/6rzUoqB0sz/Jys+Lx9eZqXy3/F3aDoFN5cfIKkdC3fda9Ctxr5734t5ZShzeDdv9/lePhxAGY3n00jn5zrvDKuXCG4izrN5DZ+PMlGWby39z00eg3dS3fn/Rrv51gM/F+a8HDu9O0LRkb4LfwFq+rPtwv8yd+DAajUxAcjo+yJb+TtJM7svINPWUc8/e2fa1yS9CSU3MpQF+gbqInM7/9MLSmK0g1oLYR46/7X/YE6Qoh383j9aOBN4CRwTggxL4/rhgHDANzd3WusXbu2oB8FgJSUFGxsbAxy76Kmxqmx2KYEcbLGTPxCNuEedYDAsmOJ9GhSIPd/Vb7XKVmC8FQ9AY7GpGsFlib5G0kRQjDvfCbHI3SYKPBuNXOquj3dv01ele91flxIu8CKmBWUtyxPL+deWBrlLHRnHBGB07RvUTQakvr3I7l2dWZFziIoM4hhrsOoZFXpke+RkpKC0+3bOMyegyIECUPfIrNGDUM9Up60GYK0aLD1IccI3s0dejKToHR7BVOroju6J//ffn4M+b1u2rTpaSFEzdzOvfCLfYUQPwE/5eO6BcACgJo1a4omTZoYJJ59+/ZhqHsXKdd2QEoQ+NWnlnMqnD4AlXtSrsskCqrSxKvwvf5u1zUWHgqiopc9QzrWy/Gv4rz8U18mJkVHZR975vStjo/j02+vfhW+149zIPQAdmZ2jHYbzaCsQdia5b3VOPPWLYIVBd/Fi9BULs2w3cMIygyiiU8TRjUf9dj3OjJ7Do6z1Jlyn7lzKNe0aYE9R35pMnWYmue+hiomNIXLiSeo2Mibxm3LPOfICpb8f/v5KazvdWE0jbwH/Hsfn8/9Y1JREXoK1r0JTv7g3xT+/BRcy0KnuYUdWZHy+ZZLzNp7kwyNng9alcl3EnM8KJZmM/YTm5rFyKb+bBn52jMlMa86vdAzdu9YRv41kt+DfgfINYnRxsUR1LkLmbduYe7vT+mDBzCuXpkuW7sQGBdIy2It+anZY//NRebNmzjMnw+A39Kl2BZCEpOamMmaL49zdPOtXM+f2XUHgKot5ZZr6cVXGCMyJ4EARVFKoCYwvYA+hRCH9LQ06WrfJAdf2Pu1eqzHcjCSO2Tya++1KJYdVT8sjn/SHHe7/JV9D09MZ9DSkwCsGVqXuiWdDRbjqyBVk8obm94gNiMWF0sXRlYdmeMaIQQRn08iYd06AOLXrMVj4qckGGfSeFVjALqX7s7/6v3vse+niYwkqF17FMB3wXys69Yp0OfJr8MbbpIcm0HxSi45ziVEpXHjZCROXtbYu8oEWXrxGXr79RqgCeCiKEoo8LkQYpGiKO8Cu1B3Ki0WQlw2ZBxSARECLm2ESt3UYndbRqjHx14Ge7nA9En4OVlR39+ZoY1KPlES8/oPB0jL0rFySB2ZxBSACQcmEJsRS8tiLZnWaBqmRtl7DOmSkrheW002jJ2d8Zo6BeuGDTkdeZpPDn4CQMtiLfOXxNy7x53+AwBIadsGm0aFUygyLiyVGycj8a/mmusi3j1L1Oai9bvmbFUgSS8iQ+9aytlNTT2+HdhuyPeWDGDvFDjyM5jbP0xi3vpLJjFPICopg+RMLf6uNqweWjffr9t89h5jfj0HwLhWpWkQkPNf0lL+aXQaTI1NGVhhIBVcKjC8yvA8rzUrVgxTX1+1caOicCL8BEP+HALAiKojHvnafwi9nnsTJqAJC8Nz8leccym8P78bpyIBqNsp5zZvTaaOyOAkHD2sKFZBJspS0fDCL/aVXhCXN8OBb8HIBLbdr43R/kfwyXURuZSLW9EptJ55AI1OsHtsIwLy2Tvp9wthjPn1HK625oxtUZreteW6hWex4soKFl9azIRaE2hdojU1PbL/PyyEIPr7HzDxcMexTx+KrVyBiasrQgjG7x/Pjts7AFjWehnV3R+/XVpkZXHrjXZoQkKw79IFh27dYN8+QzxavsSEpuBewg4H95zTRoFHwgCo3T5nTRlJelG9VImMoijtgfalSskh0QIVewvWv6lW63UoBiHHoNZbsv3AEzgWFEvvX45hamTE7D7V8p3E7L0axburz2JjbsKm4fVl48dnEJsey6Qjk9gXug+Aii4Vc1wjtFruvDmQ9NOnMfXxwbFHD0xc1T5VXbZ24WbCTQBWtl1JFdcq+Xrf0DFj0YSEYFayJJ6TvyqYh3kGbd+pRGa6Ntdzt85EY2ZpkmurAkl6Ub1UiYwQYhuwrWbNmkMLO5aXyuH7rQac/eH2ISjTFt54Ps3sXgbRyZn0WnAMgPkDatA0HxV7hRBM23mNefvVXSV/jm2El0POeiZS/uj0OlptaEWWPosKzhWY0nAKPrbZp0SFVsutVq+jCQvDPKAUxVatQjFV18x8uP/DB0nMqX6nMDd+fP8rIQQR//uclL//xrJ6dYotW4piVBgbRVUhV+O4dy2eCg29sXXKuS4rK0NL2I0EytTxKIToJOnpvVSJjGQAQkDD9yElAq7vAnM76LmysKMqUsxNjSjrYcvQhiXzlcQAfP1HIAsPBWNrbsL3PavKJOYZaYWW2p61cbdyZ1L9Sblek/z332jCwrAoX54SmzYCaq+lD/d/yNHwo7hbubOl05Z8JTGaiAhuNlG3VZuXLUuxpUseJEWFQafRs3XmOQBsHMyp2DjnurZ/tlyXrp3/qtKS9CKQiYyUt2NzQTFSF/Ne36UeG3VabrPOp+m7ruLvakOX6j5sHF4fa/P8/XVbe+IuCw+ppeNPTmwhGz8+g8uxl0nTpFHZtTLTGk3DzswuxzVCr0efkoJdq1ak9e+P+4TxAJyJPMOw3cPI1GVib27Pxg4bsTZ9fP+wxK1bCf9M3cVkVbcufksWF3rfq+PbggCo19k/1yQmLSmL0zvu4OJrg285p+cdniQ9E5nISLk7vRR2fqQmMYmh6rGhf4ONnDt/nOjkTAYsPkFgeBIATcu44Whtlq/X/nIgiK+3BwKw/p16Mol5SnqhZ/Glxfx4Rp0WXdFmBVXdqua4TpeSQnDnLlhWqoTrmPfw+PQTdHodXx2ZxMYb6qjMx7U/pnfZ3o9NRnRJSURMnkzS1m0AeM/8AbvWrQv2wZ7Spf1qzdFqrXLvgbZ7sVoBo15nf5R8FmaUpBeFTGSknDJTYNt76jRSzbfgr0lq5V7v598LpqgJT0zntW/+Ri/gjUqezOxVFVPj/K2L+Or3Kyw+HIyxkcKB8U3xltNJT0wIweRjk1l3XS1e52/vzzeNvqGsU9kc12YGBxPUpi0Adm3bYurrixCCjls6cidJnWaZ2WQmzYs1f+z7Zt2+za32HUCjwcjODv9dOzFxdCzAJ3t6KfEZaDJ1lH/NM9dkLDUxk9Br8XiWssevvNxyLRU9MpGRctp6v39n5Z5qEuNUEoYfKdSQioqf/rqJXsBXHSvQv17xfL1GCMG49RfYeEYd+frrg8YyiXlKGr0GPzs/FBQGVRzEu1XfxdQ459qUxK1bCRs/AQDb1q1xGzuGkOQQhuwaQnhqONam1hztfTRfU0IZgYEEd+8BWi1e077BvmPHAn+uZ2HjaMGgbxvkef7S/nsgoGGP0s8xKkkqODKRkXKy8VC3Wl/ZrH7dcY5cF5NPU7tU4q2GJfB3zV8HWJ1e0GDa34QnZuDrZMmO9xphk8+1NNJDmbpMPj30Kf+r9z/6lO1D33J9MTHK+X0UQoAQGDs6YWRtjde0b7Bt0QIhBKP+GkV4ajhtS7RlcoPJj01ihFZL5JSpxK9eDYDLiBEvXBITfiuRzDQN3mUcMTXL+XdYCMHFfaE4eljh4is7REtFk/yJKT0kBAg9tJ4KrmXg9zHgXgmK1SvsyF54vxwI4sK9RH7uXS3fSQxAnSl/EZOSibmJEfvHNc1340jpofiMeEb+NZKLMRdpVawVrYq3yvU6oddzd8gQnAcNwqZRI8qcPvXg3ORjk7mVeIuPa39Mn3KPb/2muXeP2737oI2KwtjFBd/587CsUKHAnqkgaDJ17Jh3gfRkDUO+a5hrInPh71Ay07TU6VCy0BckS9LTKryiBgagKEp7RVEWJCYmFnYoRdOB6bCqm1oA7/cx6rG+6wo1pKJg/akQvt4eyLbzYWRodPl+3TsrThOTkomNuQlXvmwtk5incCvhFp22dOJizEVGVh2ZZxKTFXqPq+UrkHb0GKmHs0+T/nz2Z9ZdX4e7lTu9y+baVSWb1KNHudm8BdqoKOw7dqDUn7teuCQGYOP006Qna2jarywWNjmn1zLTtRxafwOAgFpyy7VUdL1UiYwQYpsQYpi9fc5GaNJjxN5SO1knR8KVLeqxgNfBzqtw43rB7b8ezYcbLgCweeRr+d5ltO9aFDsvRwBw9ONmGMsk5okJIXh/3/vEZcTxce2PeafKO7lel7xnD7datADur4cZ/+GDcyfCT7DgwgIANnXc9NhRifTLl7k7aDAAXt99h9e0aRhZvXjVliNvJxEbmoK9myXlG+T+d/jSfnVNVo02xbCwLrwaN5L0rOTUkqTa94363w6zYF0/9fe9VhVePEWATi8Ytlydntj2bgMq+eQvgT50I4Zhy08DsP/DJthayA+RJ3U55jIVXCrQJaALVd2qPrJdQNbt2wA4D30Ltw8+eHA8U5f5oPnjr+1+zbXGzL8JIQj/f3tnHR7F1fbhe+JGPEGCBElwd3cnuBQtpVAKb6Fu8LWUutCWCrS0xSlQoDgUd3cNBBIgQJC4++75/piwSHaTDZDNJjn3dXHtyJmZZ4bN7m+f88iHasfrklOn4tKr5zPeRf4REaqm/vd7W38vKE2mltPbb2Jta0nT3rKvkqRwI4WMBIL+g/MrwLsmnJgL8WHQaTroyfaQqAghEELw0wv1ydBojRYxp2/GMGLuUQCWvNyUCh65F1iTPM5vZ39jXfA6lvRYwos1XzQ4LjM6Git3d9xGjlTTq8s89EwkZSQxZOMQAIZUHUINjxo5XlObns617j3ICAvD6623cB854vncTD5RvUUZrGwtcXTRX4X44v4w0pIyaT3EX8bGSAo9RWpqSfK0KFCqDvSfAxdXq5uaTShYk8yY5PRMKn64maikdLrVKkVAXeOm33YE3qffbDU+48Pu1Wjl55mfZhY5hBC8uftNZp+ZrUuRNjTu7kcfc7VFS26OH49iY/OYiDkfcZ4Wy1oQGh/KAL8B/F+z/8vxuinnLxBUpy4ZYWFYurnh8dLo53lbzxWNRsu1MxEAVGtWWu+YsCsx7P/nKk7uttRu62NK8ySSfEEKmeLO4Vng3xVGb4KTCyEjGTp/Cla595MpjiSnZ1LjY7Vdw6LDN4w6Jj41A98PNjF20Qm1d9LguoxvWzkfrSx6aIWWD/Z/wI6bO/B28GbHwB3YW2WvtaOJi+PGoMHErlyJtY8PnuNffczjsOzyMoZtHoZWaJlQd4LBvksPiFm5khuDBgHgOmggfocOFmjPpNzYtfAS//1+nosH7ujdnxSXxtofTgPQZoi/rOIrKRLIqaXizL4ZsOszKFMf3CvD8T/V7U1eKVi7zJjBcw4DMLJZBd7tmr1a7JOkZmho+sVO3fpW2cX6qbiVcIub8TfxtvdmU79N2Fll796siY3lSjO1VID7i6PwfvddFKuHH3EzT85k7oW5ACzotoCGJXOuVB23cRP3snomlZ8/D8fm5l2GIC0lkyvH7+PkZkvtdvo9LbuXXAag9RB/Ktb1MqV5Ekm+IYVMceXqDlXEAJSuC7OzPqQHLwJr+UWrj883BnIhLJ4XGpfjs761LJgBcAAAYCpJREFUch0vhGDYn0dIydAwuaMfb3WWlVPzyq2EWyRnJFPVvSoLui/AxsLGYEyHRYkSVFi6lJQzZ/AY89Jj+w6FHWLuhbl42Xuxps8aXGxzjmm6PmQIqWfVbLQqO3dg7WPeUzCaTC0L3j8AAtoOq6r3GWVmaLhzNRYXL3vqtM/eOFIiKaxIIVMcSY6Gvweoy4MWQMhuiA2F0vWghnlVJjUnhjQuh6WlwpudchckqRkaxi48wambsQTULSNFzFMQHBNMv/X9ANjcfzPlSpTTOy41KIj7X31NyQ8/wKFBfRwa1H9s/7G7xxi/Yzy2lrZGiZiIX37ViZiK69aZvYgBCDpyj8x0LW6lHPCtrT/26sCKq2Skamg1xs/E1kkk+UuREjKKogQAAVWqVCloU8ybQ7+or+2mQLUA+CyrUdyodQVnkxlzKDiSqKR0AuqW4cPu1XMdL4TghT+OcOZWLJ2qezNzSL38N7KIsSJoBZ8dUT2GE+tNNChi0q5d43qfvgAkbN2GXdWqj+0PjArUpVh/2erLXEXMvc8+J+ZvteyA3+FDZtP4MTdqtCpDuRruOLnpj227fTmai/vv4OPvim8dGWQuKVoUKSEjhNgAbGjUqNG4grbFrOk0DRqOBrcKMDerEmqPGWDvWpBWmSVfbArkz/3XcXOwpmN1bxxscv6TiU5KZ+Tco1y8E0/nGiX5c1QjE1ladNh7ay+fHfkMN1s3FnRbQCVX/XVO7n/7HdHz5gHg/tJLeE2e9Nj+5ZeX88XRL9TlXsup6ZFz9d3kU6d1IqbK7l2FQsRkZmjYt/wKNVv5ULKi4To4R9Zdw8rWkh4T65jQOonENBQpISPJBa1WbUPQ5l1VxJyYD7eOgq0zNJHa70n+t/QUm87dBWDlqy1yFTEJqRl0/mEvUUnp+Hk78fuInINJJY9zO+E2TtZOtC7bmuru1fm14694O3jrHatNTyf52DEAys+bi2OLFo/tvxpzVSdi5nWdl6uISbt6ldBhw8DKiirbt2FdWn/qsrlxcksolw7eRWgFJSvqr4UTcTOB+9fjqdLQGxs7+ZEvKXrId3VxYuUouLQBXHyg7jA4Mlvd/m5wwdplhpy/HacTMWendcHFPueU20yNll6/HCAqKZ3/61mdsa1ltdS8cCfxDt1Xd+ejZh8xuOpgVgQY7vGVcf8+Vm5uVFy1EpGejmJj89j+0PhQ+q/vD8BvnX6jcanGOV5baLWEvaVW/K0wf16hETHpKZmc2HQDz3JOdBilf8pTk6llzQ+nAKjbUf/0nERS2JF1ZIoLkcGqiAGoMwT+GQ6RV6DD/8maMXqoUcaZ5pU8OPF/nXIVMQBz9l0jNCqZQQ3LShHzFEzYoRZgtLG0yXFcWnAwwW3bEbd5M0A2ERMYFUivNb0A+Kr1V7TyaZXj+URGBsEdOpJ29SolOnfCoXHOosecCDyo1oopV83dYCbX9nmBZKRqaNq7IqUqyR50kqKJFDLFASFgbVal3v8dh/OrIGgz2LlAyzcL1jYzY++VCMYuPI6FAsteaYanU+4i75/jN/luaxCVvRz5bpDhnj+S7AghaPtPW67FXaNJqSb0rdLX4Li7n3zCtV4BAKRduZptTFRKFOO2qVOkn7b4lF6VeuV47bRr17lcpy6Z99TmnT4//vgMd2J6EqJTAWjU01fv/ohbCYScCgegftcKpjJLIjE5cmqpOBB7EzRpULkDePnDv2r3Xt4JBkv5FnjAlDXnWXr0JgBhsSmUdcu9q/GHq8+z7Jh6zMcBOcdhSLKTkplCckYyJWxK8FP7n/SOEenp3Bg+gtTz57FwdqbMN19Ton37x8ZEpkTScWVHtELL6Jqj6efXL8frhr44muSjas8rt5EjKTV1yvO5IROg0WixsFCo3qI0Zau66Y17iQpLZPNsNYW89xv1sLSUv1klRRf5LVYccKsAjcZA9d6wYzrcO69OL1nl7MYvTkxYcpL/Lqi/zNdMbGGUiPlr/zWdiDn0QQdZsTcPRKdGU8KmBA7WDvzU/ieal2luuHmhtTWugwaS6O1N2Z9mPlatFx6vN/Nq3Vf5X73/5Xjt8BkzdCLGZ+aPOHfr9uw3ZCI0mVpWfHmcinU8aRJQEc+yJbKNib2fzPLP1EDodsOrUq6au6nNlEhMihQyRZ2UGLCwVtOt712AAz+AlT30/L6gLTMbwhNSCbqfAMCWN1pTrZThNNYHbDp3l883XcLGyoKjH3bEzVGKQmMQQvDb2d/47exvAOwfsp8WPi30jo39918SduzE643XcRs8GLfBg/WOe1Bv5v+a/h9Dqg0xeG1NfDwh3bqjiY4GoMq+vVh768+KMleOrLtG9J0kPMs5YaHHyyKE4O9pRwDoPKYG/k1KmdpEicTkSCFT1Nn4JlxcC5NOw0I1voARq8A2+y+54op3CTs2TWoNgL2NZa7jQ6OS+N9SNRNk/ujGUsQYSYYmg6ZLm5KhzQBgcv3JuNq56h2bsHMnd6eqXaltq/pnK3T3gBP3TnAq/BTDqw/PUcSE/ziTqDlzALBv1JDy8+ZhYVO4/t9CTodzZvtNvH2d6fyS/mnMwKxmkVWblpIiRlJskEKmKHNhNVxcA2WbwP4ZkBINDV4E35wzOYoT328LokZpZ7rXNj7l9pstauO9la82p7GvdNsby/8d/D8ytBnU86rHX13/wtZSfyB15O9ziJg5E8XGBr/9+7B00Z9tc/TuUSbtmoSjtSMv13pZ7xghBDfHjCH5sOql8Jw4MVvhvMKAVqNlx7xAAFoO0F+5PCE6lQMrrmJfwpq2w/ULP4mkKFKkhIxsUfAImWmwKqtxXrkmcPhXKFUHev9csHaZEfMPXueXXcE0KO9qtJD5cPU5Np+/RxNfdylijOR0+GnqedXjy1ZfMqrGKGp6Gg6KFunpxK1dC0CFZUsNiphzEecYu20soBa883LI3slZk5DAtYDeZN67h33dulRYshjFOvdUenMkI01Dq8F+WFlbUMbPVe+YPX9fJjNDS5+36mNthGdRIikqFKlQdiHEBiHEKy4GPvyKFXu+Vl/rj4LzK9VU67E7CtYmMyIiIY3pG9RfuLOHG1eBd9yiEyw7dguAOSNl1V5jiE2NZdy2cWy8thFLC8scRYw2JQUsLSnzzddUXLMa+5qGx364/0MAfmj3g96CdykXL3KlcRMy793DrlYtKixfVmhFTMTNBGzsrajZ2oeqzfQL7nvX47h5MZrqLUpTqqL8/JMUL4qUkJE8QsePYeJRsHWCxPtqLyVZ+A5QO1MP/VOdavh9RANKudjlesynGwLZHngfgHOfdJFxMUby46kfSdOkUdKhZI7j0kNDuTF0GAlbt2Jfty521Q0359wRuoObCTdpUaYFnSt0zrY/5dw5bgwYCID3u+/iu3yZ4YwoMycxJpUVXx5n0ZRDCCH0jtFotOxdGgRA0z6yGKOk+FGkppYkWUQEgVtF8PRT2xC4V4I6+jM+iiPRSem0quLJC43L0a1W7lNKR69FMe/gdQAuTO+Kk638szGGoOggVl9dTV2vujQp3cTguLgNG7k7ZQoiI4OM8PAczxmeHM6be97EztKOGW1nZNufdOQIN0erU6per0/G4+Uxz3YTBczxzTcANQPJkBg7+V8okbcSadTDF0cX+WNFUvyQn8hFjbjbMKsJlK4LXb9St1Vqn/MxxYibUcn4uNnzSW/jitfFpWQw5A/Ve7N0XFMpYowkND6UFza+gJWFFV+1/srguPCZM4n6fQ4oCuX+/AOn1q0Njk3XpNNxZUcAAioHUMLmYeadNjWVW69OIPnIEVAUKixehEOjwt15PD4yhcD9ahZSqcquesdoNFpObwvF2cueJgEVTWidRGI+yE/losbm99TXHt/Dlf/U5RaFL0sjP9gdFM5L84/zw+C69G9QNtfxaZka6k7fBsB3A+vQorJnfptYJBBCUMKmBG82fBMPew/KlcjerFCbno6FjQ2a6BhsKlemwuJFWLkbDp4WQvDG7jcAGOA3gI+bf6zbl377NiGdHk4xVVz9b45TU4WFC/vCAOj8cg0sLPR7Yy7sCSMzXUuzPpUK7fSZRPKsSCFTlIi4AkGbwK8LeFSG439ByVrgLn+p3YxKZsyC4wCUdM49JuZaRCIdvt8LgJWFwqBGsnNwbggh+OX0L2SKTMbVHseomqP0jgv/4UdSTp2i3Ny/8HjlFUqVKpmtWu+TTNw5kQNhB6jiWoVpzacBanDw3Y+nEb9BbYbq3DsAn2+/fb43VYDU7VgOxULBv7H+ejDXz0ZwYOVV7BytqVw/e9aWRFJckEKmKPEg3brFZFjcF1Lj1KDfYo5GK+j4wx6EgHmjG9GySs6eFSEE/1t6GoDedcvw0wv1TGBl4SZNk8bYrWM5E3EGJ2snXqv3mt5xcevWEfXHH1h5eSHS07Ep65PjeTO0GXx77FsOhB0AYGH3hSiKgjY5meAOHdHExmLh6Ejpr77EuUuX535fBUHEzQRCTofTrE9lmvetrHfMjfORbP7tPAAdR1fXW+VXIikuSCFTVBACev6gZiiF7IK7Z6HecGg8tqAtK3DWng4jQyMY3rQ8HarlnD2TlJZJwC8HuBaZxIR2lXm/WzUTWVl4SdOkMeq/UQRGBeLr7MvaPmuxtMhexyRq3nzCv/0WxcGBylv+w8LR0eA5hRDMOTeHWWdm6bZtHbAVZxtntMnJXGnVGpGcjNuwoZT6uOiI9dj7yaz4UvUc1mztQwn37N5DoRVs++si1naWDJ7SGFfv3PuCSSRFGSlkigJpCRBzA8rUA0sb2PQWOHpBn1m5HVnkydRo6d/AB19PR+qXc811/HurznEtMolGFdx4r6usjmoMUSlRBEYF5tiwUWi1xP7zDwAV5s3NUcSA2j9p5ZWVALzd8G1G1RyFhWKB0Gq5MWQIIjkZ10EDKfnRR8/3ZgqQjDSNrk9Ss76V9IoYgO3zLpKRpqFuh3JSxEgkSCFTNFg5GoJ3wIjValxMUgS0eQ+KefBfcHgC09ZfZMFLTWhYwS3X8bsvh7Pp/F261izJnJGFO+PFFJwOP42fqx/eDt780uEX2pVrp3ec0GpRLCwoOXUK1mXKYJtL5e2/L/3NyisrcbdzZ12fdbp+TClnz3JjyAsAODRpQunPPnuet1PgPBAx9TuXp2E3X71jwoJiuHpCTVFvMVBWMJdIQBbEKxqE7AZrR7XTddBmsLCCdh8WtFUFzqcbL3E4JIrIxLRcxyanZ/LSguPYWFrwVf86JrCucHMo7BCj/htF82XNiUmNMShiEnbt4sbgIcRv2YJTmza5ipgDYQf4+tjXWCqWrO+7Xidiko4cITSrPoxzj+6U++vP53k7ZkGrQX6U8XOleX/9cTHBJ8NZ+6Mau9XnjXoGM5kkkuKG9MgUdkIPg9BAjT5wYCbYOsO7wWBRvDXq3APX2XclglHNK1DaxT7X8VNWq4GTr7arjLus2psje2/t5bVdajDv0h5L9fY5Akg6dozbE9WpJsUu90yx5Ixk3trzFgCzO83GxVYttZ+4bx+3XhkPQNnZsynRoWjVRUqOT8fa1pJK9TypVN9Lbxr11RP32fbXRQD6v9uQ0pVlGwKJ5AFF6ttOUZQARVH+iIuLK2hTTMf8bupr6bpw/zw0m1DsWxGkZmj4+r9LVPR0ZGrPnOuJxCVn0OKrnaw9cwf/kk682cnPRFYWTnaG7tSJmD+7/Eltr9p6x0UvWsTNUS+CtTW+q1ZRol07g+fUCi1LApcQsCaAlMwUJtWfRIsyLQBI2L1bJ2LKz5tb5ERMZoaGpZ8cYdvciyiKotfLIoTg5H+hALQfUU2KGInkCYqUR0YIsQHY0KhRo3EFbYvJ6P8XJIXDoayu1k1fLVh7zIA9QRFkaATvd6uKrZXhLsBCCCYvP82duFTsrC1YNq6ZLCqWC83LNMfawprF3RcbbACpiYsjbsNGAEpPn459rZyrKP906ifmXZgHwAdNPmB49eEAxG/ZQtgbbwJQYelSHBrUf163YRYIIdgxP5C05ExK+jqjGJgqOrDyKlFhidRq60ONVmVMbKVEYv4UKSFT7EiMgDqD4NYxiA+DdlPAwXB11OJCt1ql2P9ee3xcDU8pabSC6h9vIT1TS6fq3vz1YvYOyhKVwKhAhmwcwuiaoxlefTgnR5zUK/hCevUi8344fgcP4Lv0b4QQWNjkPE13N/Eu8y7Mw8fJh9W9V+Ng7YAQgrDJk0nYrnZrr7h2DXbVilYafHKEYPaE3QBUbVaKRj18DY49t+s2AK0HS2+hRKKPIjW1VKyICYUZVeDYnzA3qzx7jd4Fa5MZ8Nf+a5y5FYuPq32OwZAdvt9DeqYWQGYo5UBwTDBDNg4BYMHFBaRkpugVMdf69Sc9OARtQgKaiAgUa+tcRczFyIt0+VctYtejYg8crNVU4nvTp+tETJnvZxQ5EQOQkQoWVgoVannQ8UXD058X96ttCio38JJF7yQSA0iPTGEkIxV+ysqsuab+qsPCGrwLf3+ZZyE9U8vnmy4BcP2rHgbHzTtwndCoZACCv+iOpcz+0EuGJoN+6/sBMMh/0GP9jR4lZtky0i6pz73y9m1Y++RcrRfgXtI9XtikplKXdCjJ5AaTEUIQOmIkKSdPAuB3+BBWbrmnzRcmosISWf7ZMWoMVujydUvsnQyLvdtBMez5OwiAJgGVTGWiRFLokBK/MPJT3YfLV7aqr2+cLxhbzIhfd10FYGyrigZjXYQQfLoxEIAdb7XBSv7KzYZWaFl+eTkpmhS6+naltGNpgyIGQJuqprf7rlyJTbnce1KladLovEr1Inbz7caOQTtIv3WLy9Vr6ERM+QXzi5yIAVj+2TEA4kLJUcSc2XGTdVmp1s37Vca9dM4FBCWS4oz0yBQ2MlIg8Z663HisWgCvdD1wLl2gZhU08w9e5+ddwQBM6mg4lqDxFzsBsLWyoIp3CZPYVtiou0gVynW86vBRs490adBPEvn77zi1a0eJzp1wbN7MqCkgIQSNljycyvuu7Xfc/eQTYpf/o9tWFGNiAFbPOKlbdq1o2AuYkpjOwVXqe7nT6OpUbVa8/7YlktyQQqawYW0PbwfBnTOwTI1dYOiyAjXJHHCwUbOT3u1aFRd7a71jus3cpyuOd/6TriazrTAxfvt43bKfqx/WltmfpcjIIHrRIiJm/kTEzJ+oFngRxYi6RUIIXbwNwNkRZwjp2Yv0kBAAPCe9htf/9Lc4KOxE3ErgbrBaFuLFr1py4uxhg2OXTjsKgLOXvRQxEokRSCFT2MhMgxKlYPfn6nq9EeBcfFMyMzRazt2OY2DDcvSp54OddfZ066S0TOp/tl0X3Lv7nXbYWMkppSf59PCnHLpzCIAtA7boFTFJhw5xc8zLuvVS06cbJWIAOqzsQGRKJABHhh4hqGYt3b4Kixfh0LhoZo4lxqTiWdYJ+xLWBEyuh5Ob4TpPR9aFkJqUAcDIz5qbykSJpFAjP80LE3G34XNvWDEK7mXFxPQt3o0hFxy8wYDfDvHvydt6RczeKxHUnLZVJ2IOfdCBip4y3uBRMjQZpGhTCKgcAMC/vf/Fx0l/wG76bTUV2K5WLSptWI/bkMFGXeOX07/oRMyqgFXcrPNweqnqqZNFVsQEHrzDwg8PkRyfzpjvWuNVzvB0ZtDRe7rCdy983MRUJkokhR7pkSlMrJ+svqZmVS5uMKrgbDED7sSm8MVmNVumV93sLvjrkUm8OE8Nrmxf1Yu5LzaW/WmeQAhBgyUNaOzYmO+dv+f8i/qDxkNfHI1zzx649u2Lc48eWDo5GXX+DE0Gk3ZP4mDYQQC2DdhGYsBwtFn7q50/h2KtfyqwsCOEYPfiywDE3kvG0cWwJyYxJpUd89Ug9I6jq+NRxrjnK5FIpJApPAgBIWqgKtZZHoVuXxecPQXMrehkWn+rpp73q++Dg032t3L7GXsAGNKoHN8MlI0g9fH23rcBOJ50XG9Qb+zqNdydMgWA5KNHcR0wwGgRE54cTseVHXXrr9V7jcQeL5AZrnZvrnr6VJEVMekpmfz55j4AKtf3wqdqzhlY//2uCsi6HcpRTcbFSCR5QgqZwkLQZvW1dD0I3qF2uLYpnlMkWq0gODwRe2tLutYsyY9D6mUbk6nR6paliNHP3lt72R66HYAfyv+AhfL4THP6rVs6EWPh6EilTRtRLA23fHiU5IxknYjxsvfi7w5zSRw4Ridi/Pbvw8I+92aehZXI2wm65c5jc27REHoxivBQdXwrWb1XIskzUsgUFryqQYvJUH8kzGoM5YtnIODSozdZfeo2S8Y25eL0rganiob/pWZ+vNyqoinNK1TEp8cDMKzaMKxTHnpGRGYmifv249S+HZaurpScOgWXgACjz3sn8Q5d/1Wzwuws7djRezNB9R72SfJdvgwrL/0ds4sCSbFplPFzo/UQP2q1LZvjdKYQgo2/nAWg+6v6G3BKJJKckUKmsOBRGbp8BqtfUdf9OhesPQVAeqaWKWtUF/yd2BQqeemf4jh2PZqj16MBeK9bVZPZV5iITIkkoHIA95PvM7b2WPbs2QNA4sGD3Hp5LJZublT8dxX+RwynCetj4cWFzDgxA4DWPq15Z/Y9gj5XRYyluzt++/aiWBXdj50ja0M4uSWU2m19aDM05/deZrqGOZP3AlC6sguV6hVdcSeR5CdF9xOlKJGWACtfgo4fwbmswmEt3yxYmwqAmtO2ANC1ZkmDIiYmKZ3Bc9Qv38kd/XLsfl0cEULQcElDFBS+afMNY2uP1e2L27CBO+++B4ClhztWpUrl6dxTD0xlfch6WgRqGXfAHseo3aRl7XPq1JGyv/xSpLuL710WxIW9am+k6rl0qdakC52IAej1Wt0cRkskkpwoUkJGUZQAIKBKlSoFbcrz5dIGCN4Ojh7quld1MLJ2R1Hh6LUoMjQCgN+GN9Q75rutl5m1Wy2uNqp5Bd7q7G8y+woLP5z8gQytWqekpsfD2A0lOVknYkp++AHuL76Yp/OuurKK9SHr+XFOJj7RAEnqeW1s8Dt0CEunoh3PlRyfrhMxPf9XJ8c0a4DLq4VueeJv7Yu0wJNI8psiJWSEEBuADY0aNRpX0LY8V3Z+qr5aZMUxdPqkwEwpKLxK2NK/gQ9jWlbUG3Nw+V68TsS0r+rFp31qZRtT3EnOSGbBxQUA7Bm8Bw97D90+YWdHhWVLSTp0KM8ipu/avoTEhTwiYsB31Srsa+Uc5FpUSEvOwMraAkcXGyo38Ma3tqfBsUIIZk9Qs+2c3GwZ8VlzKWIkkmekSAmZIsn1/ZBwV12+c0Z99S9e5fUXHLxO88qezBhY12DgZLeZ+wF4q7M/k3PotVSc2X1L/QLtU7nPYyLm3qefUSIsDJsvPschjy0CLkVdIiQ2mCUzNNhkqtsqbd6EbaXi0a157Y+nCQuKodekuoz4vDlWeooyPsq/3z7stzTsk2ZYygrTEskzI4WMuRN2Qn3tNwfWjAeXclCMfsF9tjGQuQeu4+lky4n/66R3TNvv1C/oMi52UsTkQM9KPfFz88PP9eEzilu/npilS3EAFDu7PJ0vQ5PBi6sGseJHjW6b/5HDWLq6PieLzZtNs84SFhQDgFsph1xFTFpKJvevq5li1QcqWNvK+C2J5Hkgfw6YO63ehA9uqgG/AJ7FJ+7jSoyGuQeuA/D7iAbZ9gshqPbRf4RGJQOw4+22JrWvsLDo4iJqL6zNwosL8Xfz101lJOzcyZ333gcgduxYowvdAZzYu4L/OtVh4SMixu/QwWIjYm4GRnHjfBQAfd6sj7NH7jVxVnx5HIAmARWxsCo+P0YkkvxGemTMmQurIewkdP4Utk9Tt/WbU7A2mZCfT6UCMHNIPRr5uj+2b/Wp27y14qxuff977fVW9y3OCCEYv308h++qWVwKj395Jh1UG0SW+/MP7ms02Y43xK51v1D6/dk88OvYVKqkFssrRp5CFy8HAAZPbZxrYC/AnqVBxEekANCouy9794Xmq30SSXFCfvKbM9unQdxNtfhdRpI6reRUfGpNjK5py5zz6fSt/3gDw6S0TJ2IqeTlyH+vt5Zp1nro8m8X7iXdA2Bx98XU864HQMr5C2hTknEdOADrsmVxat0asurI5EZKSDCl358NQHS3RrT4cVGxEjAA96/H41nWiSH/1wTPsjl7sYRWsPzzY0TfUbO4+r3TAEX2+5JInityaslcSYxQRQzA+RXqa8BPBWePidBqBS2/3sWqk7fxd7PkyufdH9uv0QpqTtsKQLNK7ux6u50UMXoIig5i24BtdPXtytFhR3UiJm7DBm4MGkTEzz9j6++Px5iXjD7n/W2buNFTrfB7v6wjLWcuLnYiRqvRsuqbE6z76XSuIubqifvMnrhbJ2IGT2lMmSquJrBSIileSCFjrszIqoXTaTpcUb+4qdLR8PgiwrurzhEWm8I7K88iINsXZcAvBwAo6WzLsnHNCsBC82fBhQUM3DCQ6NRoZrSdgYO1Og0St2mTrlaMlYdnnirsxm/dRvTkdwBY2taC5lsPPn/DzRwhBL/9bw8A7rl0p973zxW2/XVRtz5uZhu8yuc+BSWRSPKOnFoyd+qPhB3ToEz93McWcq5HJvHvqdsABH3ejcMH9j+2f8uFuwTeVbM+9r/Xodh5A3JDCMHW0K18f/J7QK0b8yDNWmg03HlbFSLOvQPw+fZb486ZkcHlBg0hQy2id7C6wqe/XyiWz37z7HO65bZDDQfdH14bwvnd6vu4y9ia+DUqme+2SSTFGSlkzJUPw0Bo4NRidb1m/4K1xwS0n7EHgCGNymWbLrodk8yrS04BsO5/LbGR9Tey8X8H/4/1IesBmFx/MuWcywGqiNEmJ+P9wftok5PxmjjR6HMGd+qsEzHTh1oweNhnxVLEpKdm6rKUXp3VzuAzOL/nNqe2qIG8XV6WIkYiMQVSyJgjJxdCrQFg5wIn5qnb6g0rWJvykZOh0VTwcCT4i+4sPXaTUc19H9svhKDVN2qtmPZVvahbztX0RhYCRtcczeE7h5nRdgYNSj5MV79cuw5uI4ZTasoUo8+VsHMnt//3mm598AeWBFTuTX+/oi+on+TU1lDqdijHi1+1JC05A0tLwyJ63/IrAAx4ryGlKrmYykSJpFgjhYy5odXChsmQEg0t34Botew+jobLnhdmwmJTGPCbmh584+ue2UQMPPTUlHaxY/5LTUxoXeFh582dtCzTkl2Ddz22/eaYMaDVEr9+g1FCRhMXx5Wmj8cejZtsyYZ+G/F18X2eJhcKjq6/xonNNzi67hoTZrfHyc3W4NjdSy4DYGGpSBEjkZgQKWTMjQv/qq+3jsFvLdXlmv0Kzp58ZuIStWT7O130xxx0mLGHG1kF77a83sZkdhUWkjOSeWnrSwRGBTLAbwCftPhEty9m5UqSDqkiscKSxbmeS2RmPiZi3h5ryS0vhZoeNYuliImPTOHE5hsADPkoZwGt1WgJPHAHgBdyGSuRSJ4vMtDA3AjL6sWi1UB4VtZDly8Kzp58ZNO5u5y9HQfAxHbZO5anaQTXItXU1bPTuuDiYG1S+woD/df3JzAqEIDBVQfrtguNhuiFCwGouG4dtrl0hHdau5bLtWoDoNjbs2r+MG55KQzwG8DyXsvzyXrzZvV36t9i094VcS9tuHv39bMRumymOh3K4laqaHf6lkjMDemRMTfOLlVfb2Slt35wU42VKYL4lVRTWOe/1DhbM0iNVjB+u+qJ+aB7NVzspYh5klvxtwhLDAPg3KhzKIpCZkQE13r3wePlMVRcuZKkQ4ewq5pzW4vkU6dx3KKm+NtUqECl/zazYnFdAD5u/nH+3oQZEn0nCSc3W5r1q8zuJZdp2N3X4NidCwK5fEQtOmhjb0XjnhVNZKVEInmA9MiYE0JA6XpQtglkJIJ75SIpYlIzNIxdeIJKno4c+bAj7at6Zxvz5/5ruuVXWhePTsp54XL0ZUo5laKOVx1md5xN5r17XKpWnaut26CJiSF8xvdY2NtTomPOtYcy7t4ldJgaSF7m+xlU2vIfQza9oK47lsFCKV4fEdF3k1j26VHuX4/Ht7Yn435sYzBDKSUxXSdiWg3yY9yPbbBzlIJbIjE1xetTytyJuQHDV6kZS/DwtYgx8e9T7Lh0nwPBkZRy0d9x+ev/1MDJwE+7ZvPWFHfGbx/PoA2DSEpPYnH3xbQu25rrg7KmlSws8H7vPaqeOpnree5/8y3B7TsAkO7nx1fO+6mzqA6Xoi8B8G1b42rNFBXuXI1l2fSjANy/EY+do3WOHa3nvaMWZ6zfpTx1O5YziY0SiSQ7cmrJXLh5FOZ1gQmH4Pif6raGowvUpPwgPjWDXZfDAWjrr79vVOAdteidv5uFbAT5BEfuHuHQHbXZo62VLYqA+B3b8T+wn7hNm3Dp2dOo86TfukX0/PkAOHXryoSmwYRe2wSAt4M3KwNW4m7nntMpihQx95JY871ap6hSfS8a9fA1ODYjTcOSjw7r1pv3q5zf5kkkkhyQ3xLmwsU16mv0dYgKVpddfAyPL4RkaLTU+WQbAKNb+Bp02b+14gwAAZWkm/5R4tPjGbdtHAA/t/8Zeyt7bgx5gZQLF7BZvdpoEaNNTSWkcxcAyv76C/1jv9E1l9zcfzPlShQ/74KTmx3WdpaUqeJK9/G1DY67czWGNd+f1q0P+b/GxbJAoERiThQpIaMoSgAQUCWXDA2zJEJ15+OQVS/Gt3XB2ZIPxCSlk5iWydAm5Vh27BbTAmroHffnvmtcvpeAk60VtTxlM8hHuZt4FwB7K3val29P3MZNpJxVu4Db+FYw6hw3x48nae8+3fqdBuW4t0EVMWdHnS12MTH3rsexe/Fl2gzxzzEeBmDrnxcIPql6E1287Rk2rSkWORTHk0gkpqFI/RUKITYIIV5xcSmEAbLR18DOFYJVjwWt3ixQc54n2wPvU/+z7dyPT2V671rc+Lqn3i+M+/GpfLFZFXSLXm4if+lmIYRg6oGpVHWvyuyOszk67CiRv//OnXfU3kk+P3yPha3hQm0AIj2d0BEjdSLGdfBgbPb8y8ANAwEY6TGyWIkYIQTrfz7Dv9+cJPpOEjsWBhp8vwmtYNaru3Qipnn/yoz4tLkUMRKJmVCkPDKFmoxUcKsAlzaq6xXbFqw9z4kxC47rYmIiE9MN9khKz9TS9MudAAxoUJYG5d3Yc03v0GLH4I2DuRx9mbZhzlRZfpT0731waNgQS09PPEa/iHOPHjker01JIaj+w5YFZX/9hRKdOjF803AAuvt2p4koXkXcLh28y63AaADaDa9Kzdb6p3F3LAgkKCszCeDFr1rmWN1XIpGYHilkzIU+v0JEEGz/COzdwLLw/9dkarQ6ETNrWAO61SqVbYwQgqvhiXT5UfUUWFkofD+4rkntNGd+PvUzl6Mv439bUG7xAtKAyFmz8fl+Bv5PdAfXx/3vviN67jzderXz58DKioA1AdyIvwGo2Ul79uzJnxswU0p42uFR1omASXVxdNEvTEIvRulETOkqLvR5vT6W1tILI5GYG4X/27Ko4N8VvGuoQqaIZCvdjUulZhlnfFzt6VmndLb9SWmZ1Jy29bFtV7/obirzzJ6g6CD+PP8nnU9pGbdVC4DHK6/g/ZZx046XatWGzEwAHJo0ofzCBSiKQr91/XQiZl3fdfliu7ly43wkZ3feouXAKgyZ0hjFQGp/UlwaG39R448GfdgI7wrOpjRTIpHkASlkzIFfGoKbL9QepK576w+ELUycux1LSrqGaQE1qVM2e8xSREIaTb7cAahemC/71WZw4+KXLZMTpZ1KM7z6cGqUUGDrAsr+/htObY2bcgzp1l0nYqqeOY2FnVqv5/i94wTHqllxuwfvxtO+aDYjfZLUxAyWfnqUlPh0AO5di8ezbAmD4zfPPgeAT1VXKWIkEjNHCpmCRpOpplvH3VbFDEDFwt0c8XZMMr1/PUhtHxfWTGyBlZ6gyK4z9yEElHS25cD7HbCWgZOPcS06mLQWAQxr1Yqys36Fnm/kGtD7gIiffyb9xg0AKu/YoRMxt+JvMWbrGABmdZxVbEQMwL/fndSJmH7vNKBMFVeDYzPSNYSHJgDQe3I9E1gnkUieBSlkCpoH3a5r9oc7WfUpnEoWnD3PgQlL1MJiPq72ekXMtHUXiE5Sv1SOfNhRZic9Qdi0j0n7ZyUAKSHBRguYB0TO/g2AKrt3YV1andJLyUyhxxo1KLhzhc60KVu4xXJeqdq0JFdPhPPCR7lnw53ffRuABl0ryMwkiaQQIP9KC5pz/6ivbd5RO1+XKAOF/Is9PCEVgN9HNtS7f+HhUAA2T24tRcwTpMZEEZ8lYs409cB/+/Y8HZ9x/z4ANpUr60QMwLLLy3TLM9rOeA6Wmj/xkSks/ugwZ3fdomF3X4Z+3NSo99vhNSEANOrpm88WSiSS54H0yBQ0tfpDyE4I2aWu+3UuWHuekfjUDO7Hp1GtlP74g/kHrwPQpKI7NcrI2IMHJB0+TPzm/1jd3xvrmgprm1uw/q09KBZ5+xO9N/1TADwnTtBt23d7Hz+e/BGAQ0MPFYt6MY9W4D2w4ip1OxgXf7Xh5zO6ZWsbWZBRIikMSCFT0NToC5a2sHqsut7ugwI151kpYWvFpA5VqOWTPcA3LjmD6RsCAfhmQB1Tm2a2aJOTufmSGrtSY9RM5rxUh7XdF2GVRxGTuP8AibtUQezcuTNCCN7Y/Qa7bqnbRtccTQkbwwGuRYXMdI1OxNRoVYZWg/2MOm7P0iBuZtWWGf1Ny3yzTyKRPF+kkClIziwFSxso3/ThNucyBWfPMxKbnM6523G81dlfrwt/2F9HAGhZxYOKno6mNs8suT1pEgnbd+jWW1fuSHu/rk91rlvj1D5M5f6Yg2Jjw/LLy3UiZmb7mXQs3/HZDTZjMjM0XD0eTtWmJSldxQVFUWg/oppRx675/hR3rsYCMOC9hgZry0gkEvNDCpmC5MCPkHj/Yd2YIUsK1Jxn4WZUMm2+2w3AnJEN6Vrz8eJ3EQlpXMzqar14TNNsxxc3tGlpaJOTsfWvSsL2HeyqZ8mKlvDxrb10rJB3wRHS7WH9Hac2aiDvjBNqLMyGvhvwdfF9LnabK3eDY1k9Qw0yT4pLo/87+uOz9BEflaITMbJmjERS+JBCpiCJvqbWjDmzVF2v1qtg7XkGRsw9CkCP2qXoUuPxrKu1p8N4458zAMwYVBcLA0XIiguZMTFcbd6CklOn4j5qJK/67OBKghpg2qF8hzyf7+Yrr+jSravsVj0w/db1I02TBlDkRcy963E6EWNfwpqG3YxroAlqfZnFUw8D0KiHrxQxEkkhpOhH/ZkraYmgzYRStSEpQp1iKqQZPFsu3ONmdDKgtiJ4dFpJCKETMR2reTOggf6eNsWF8J9+4mrzFgBEzpqFpYsL15LULK7dg3fnOYvravsOJO1TWxVU+m8zmV6uDNs0TFf0buuArTkdXiS4ktVGoP3Iaoz5zvhMOK1Gy9x31GfnVb4ETXpVzDcbJRJJ/iE9MgXFg5oxsTfV15K1Cs6WZ6R5ZQ8A9rzTLtuXyF/71Syl9lW9mDu6scltMyfSrl0n6rffAXAfM4aS772LEIKR1UdS2ql0ngrUJR05ys3Ro3XrVfbuxbqkN11WdeFu0l0AFnRbQBmnwhtzZSwNuvliaWNJjZbG32t6SiZ/vrlPtz54SvF+b0okhRkpZAqKxPvg6Q+RV9X1ocsL1p6nZMHB63SuWYrAT7viYJP97bTzslrX5LO+hVeoPSuply6RsHs3rn374jFuLHa1a+PcpQvfHf+OBiUb8GrdV7G3sjf6fAk7dnD7tUnqiqJQect/WJf05uODH+tEzLlR54p0jZ7k+HQibyVwamsoncfUpOWAKkYdFx4az86Fl4i+k6Tb9uqsdvlkpUQiMQVSyBQUtQaARxX4oy2UbQwlCl813w9Xn2PZsVtsPHeXVRNaZNuflqnhyLVoXB2sKevmUAAWFixCCOI3bebOO+8A4Dl2LN5vv63bvyhwETtCd7B1oHHTPyIjg5iVK7n/6WcAlJwyBfdRIwH47vh3rAleA8Afnf8o0iJGqxXMf++Abn35Z8d4+fvWuR53YV8Ye5cGAeDgYkO56u50Gl34+5pJJMUdKWQKgp2fwf0L4K+WjMfV+OBEc2LZsVsA/Dmqkd79o+cdB6BmMSx8l3H/PsFt2+nWXYe+gGJjo1v/89yfgPGBuJFz/iDixx91654TJ+hEzLwL81gUuAiAn9r/RPMyzZ/RevNmxZfq+8rJzZYeE+rgWdYp12PuXYvTiZgarcoYnZYtkUjMHylkCoL9WSXi3Supr63fKjhbnpLlx9TYnia+7rg52ugdc/haFAAzh9Q3mV3mgCYxiYywMByaNiX56FEqrl+Hnb+/bv+eW3v4+fTPALzT6J0cz5UWHMy1XgG6dStvbyosWoiNry8A1+Ku6ar2rui1guoe1Z/vzZgRWq0gKTaNJr0qsmNBICM/b55rL6T01ExCL0Sx7a+LALQcWIV6ncqbwlyJRGIipJAxNRlqHyIUSzg6R132LnzubQ8ntWDYjEF19e4fmZWO3b++D14lik9xsZjly7n3yXSq7NtLud9/w8L+8diXhPQEGpdSA0u/a/sdfm6Gq85qk5IeihgLCypv3YJNuYel9mNTY+mztg8Adb3qFmkRExWWyPLPjlHGz5WeE+vw8vetjWro+OcbDwN6y9VwlyJGIimCSCFjalJi1Ncmr8BRtUtxYUq71mgFV8MT6FyjJD8Mrkt5j+yxLydDY9h/NRKA97oVLxf+vU+mA5B87DguvXo+tq/18tZYKpZ81forzr94Ptdz3Rr/KgAOzZpRYcH8bPt/PfMrAG3LtuWXDr88q+lmy5Vj99g+T21tcS8kDms7S6NigO4Gx+qWB09tjFe5ot+eQSIpjkghY2pS1F4uZKrFyugzu+BseQpenHeMA8GRfNW/NkOb6P91O3mZmlq+dFxTSrnYmdK8AiV+2zYA7OrWySZiTtw7QWxaLAA1PWvmfJ7Nm4n4+Rddkbvyf8zJNiZdk84/QWrn9B/b/Vhkg3uT4tJ0IqbNC/7UaFXGqHtNSUzXFcnr9FINKWIkkiKMFDKmxq0iDJwPq15S1yvnvZJrQTF7TzAHglVPy+BG+rsJbzp3l7DYFACaVfQwmW0FjdBqCZv8OgClpkx5bN+p+6d4aav6/720x1KcbQwHP8dt2sSdtx/GzZT784/HgoQfcDbiLACdK3TG2tL6me03N+IiUggPjadcNXf6vlWf62cjqd2urFHHBh68w+7FlwGwtrWkatNSuRwhkUgKM1LImBobB6jV/6GQcS5dsPbkgYWHbgCwZmILLPW0GbgemcT/lqq/gjdPbl3sWhFU2rCe5DNnsK/7eNxQSJzafqBlmZbU9qpt8HghhE7EVFi2FIf6hoOkl19W6w69WPPFZzXb7NBotCz5SG0bUL1FadqPqIaPv5tRx2q1QidiqjTypsuYnL1fEomk8COFjKk59KvakgCg8diCtSWP1Crjwv34cOqX1/+l0n7GHgC61SxFjWKScp165QqhLwzFqlQpKq1dg63f48G7ofGhNC3VlH1D9uFmZ/jLWJuSQlD9BgDYN2yYo4iJTIlkW6g6jVXHs85zuAvz4o9JewGwsFJo3r8yipGCODUxQ9dywNbBiq5ji28RRomkOCGFjKk59LNa1RegZr+CtcVIMjVaQqOTeadrVb7qr9+j8PvekIfLI43vPFyYSb1yheu91ayh9GvXsu2feXImcy/MZZD/ID5u/nGO54r49Vfdcrk5vxscl6HNoP2K9gCMqjGqyMXG3AmORasVAIz/qa1RmUkAB1Ze5exOta6Rg4sNIz4t2rV0JBLJQ6SQMSWp8Q9FDIBvq4KzJQ+0+XY3KRkaZgyqS/XS2T0tWq3g6/9Ud/78YtRP6farEwBwHTKE0tM/eWxft3+7EZYYBkAFZ8MFD0VGBmHvvEvCVrW6r/+J41g66S/wdvL+SUZvGa1bf7fxu89gvXmRlpLJ9rkX6T6hNt1frY21naXRIubE5hs6EVO+pjsBk+rlo6USicTckELGlATveLg86VTB2ZEHUjM03IlTa9+0q+qtd8yk5WqWUr1yrrSvpn9MUUEIQcT33+M2YgTuL48h+fiJbCJGo9XoRMy6Puuo5FpJ77kSDx7k1ssPpxdLTp1qUMSEJ4frRIyHnYfRbQ0KC+tnniY8NIFbF6OpVM/L6ONi7ydzdL3qDRv9TUscXYpPzSKJRKJSpISMoigBQECVKsY1kDM5EarXAgtr8KhcsLYYybA/jwDw7cA6egN8V5+6zaZzaqPChWOamNQ2UxO/bZsuM8nC0RHPCRNwHz4cgJjUGHqu7kl/v/4MrT6Udxu9S7ty7SjvrD9F/VqfvqQFqSXzURSqXTiPYmlp8NodV3YEIKBSAF+2/vI53lXBE3s/mfDQBEAtWmcMQgiWfHSY+EhVZFeq5yVFjERSTDHOd1tIEEJsEEK84uLiUtCm6KeSGtuAi3FppOZAUpoGgD71ymTbJ4TgrRVqGvBnfWriYl/00oAfEPHLrzoRA+A+apRuOTAqkDb/tCEhI4HTEaexVCwZVXOUQRGTcT9cJ2LKz5tL9UuBOYqYxYGLdctFTcRoNVr+nqaKZf+mJbG0Mu4jad3MMzoR02VsTbqNl4G9EklxpUh5ZMwarRZ2f6Eu+5h3MKwQgiVHbzKoYVnGtq5IeXcHbK2yf9GuOa1OnzQo78rI5r4mttK0WHmqNXHKz5uLY4uHnb4jkiMYsnEIACUdSrKw20KsLAz/WcVv2crdrDoz3u++89i59LE+ZD3fHv8WgL97/P1M92BupKdmAtCga3li76fQ8UXjWnXER6YQFqRWyB77Yxts7eXHmERSnJGfAKYieCfcUFND6W3e5eSnbwhkwaEbrDsdxqoJ+r9oMzVanTfmxyH1TGid6YlasACP0aNxGzr0se1CCGytbJndcTZnI87yWv3XDJ5DaDTc//obYhar3hULR0fcRo40OP5W/C16rOmhW29Xth11vIpGqvXVE/c5uCqYpNg0Wg/xp06HctiXsDGq7tC1MxH897va3qHruFpSxEgkEilkTMaW99VXn0ZqUTwzZeWJWyzIKnz301D9tUyC7iXQdabajM/H1Z4KHo6mMs+kiMxMQoePIOXsWaxLlca5W1fdvrMRZxmxeQRdfbsyo+0MWpdtbfg8QnC55sOpD58ff8C5e/ccr/3Vsa8AKGFdgr97/k1Fl4rPeDcFT1JcGgveP/jYthLutkbHtoSHxutEjE9VN6o0LNqB5RKJxDikkDEV8bfV125fF6wdOXA3LoV3V50DYHQLX3xc7bONydBodSKmWqkSbJxUOFLI84rQaLhc62HNHJsKD+Nd4tPjGbF5BAAhsSHZjn2SkM5ddMv+x45i6Zx7scD9Yar37uDQg4W+VowQgvjIFJw97XEr5YCLtwNNelXEq7zx/Y+i7yax8qsTADTu6UuTAP2ZYBKJpPghhYwp0GQ8bBLp5lugphjizK1Y7Kwt2PZmG8JiUgymUc/aHQyAhQL/vd660H/JGiI9NFS3XPXkCSwcH3qddobuBKBXpV581forg+cQGg0hnbuQcecOYLyIuRh5EYCmpZoWiecbfCKcw2tCaNi9AsM+aZbn4w+vDeHUFvX/w9nTTooYiUTyGFLImIKkCDXlWpsB9sb1jDElcSkZ9J11kN51y/Dz0Pr4l9T/S1kIwcwdVwEI/LRbkfiSfZLwGTOw9PCkROdOlJwyBdcB/R8TMQBONmqtl8n1Jxs8T8bduwR37KQGeQOVNm82SsQIIXh779sADK02NJfR5s+RdSGc/E8VIWX8XPN8fHJ8uk7EdBhVjfI1i08jUolEYhxSyJgCBw9VxABYmtcjj01Op96n2wFwssvZtgexMyWdbbGzNpwuXFhJOnqMqL/mAlCiYwfcRz0Mxs3QZtDt3250qdCFSfUnMafTHEo7Pd7wU2g0BLfvQGZ4+GPb/Y8ewdLIkgCzzswiLDGMEjYl6Fih4zPeUcFy43ykTsT4NS6JW6m8x1LtWnwJgCYBFaneInsJAIlEIjGvb9UiS5bnwgy9MTO2qfVMyrnb83kfw7U40jO1TN8QCMCW19uYxDZT8miV3dJffolN+cdrwPxy+hfCk8PZe3sv7zd5nxY+2bO5ErZu1YkYj3HjsPbxwaVvHyzs7Iyy4e9LfzPn3BwA/un5z7PcjlngXsYRB2cb+r3dANeSeQ9wjw1PJvR8FAANuxlu8yCRSIo3UsiYgp2fqK8NXixQM/QRUKcMS47cZPubbXNMf110+AYAjX3dcHO0MZF1piPzvipAPP/3P1z7P97M82rMVeZfmA/Asp7LDJ4jca/atbnKrp1YlzHee5CckUzzZc3RCnUa6ts231LOuVye7DcnkmLTWPDBQcbNbMOA9xvi7JE9aDw3ou8msWz6UQCqtyhtdN8liURS/JBCxhScXKS++jQoWDseITwhlU3n7tKzdmnOTuuS61TR55tUF/8Pg+uZwDrTIITgastWeE2ehGOzZviuWoV9rZrZxu26uQuAV+q8gout/imixAMHiVu3HiBPIgbg+xPf60TMrI6zaFO2cHq8NBlarhy/x65FaiuOu8FxVKiV95iWG+cj2TRLzZ6r1caHNkP9n6udEomkaCGFjClIV/vIUC2gYO14hFbf7CY9U4u1pQUjmuXstn/znzMAVPZypJy7+dbAyStx//6LJjqae59Mp9r5c9hYP2yxcCvhFgsuLKBThU709+uPq60rQ6oNyXYOkZFB0uHD3HplPACuL2QfkxNJGUmsuLICgO0Dt1PKsdQz3FHBsn3+RUJORejWy9c0rm/SA4QQzH17P2nJasXf0lVcaDus6nO1USKRFD2kkMlvhHi4bGEe7vGYpHTSM1UPQE4iJjVDQ+MvdpCQVUp+xqC6JrEvv4lZ/g/3vvgCMtQA7Mo7tqM8ImIuRl7khU0vALD5+mYODzusV8QAhL37HglbtgDgMW4s3m+/nSdbll1Wp6qmNJ1SaEVMWnIGkbcSqdXGh4SoVLq/WgdHV5s8Z7UdWh2iEzED3m9ISd/cs7wkEolECpn85or6JYen+bjHf96lplD/YqBy7wMaf76DhDT1i+Xwhx0o7ZL3WAdzxLlbV9KuqEHOji1aYFP2YRNPrdDqRMyoGqN4te6res8h0tO59eoEkg4dAsB3+TLs6hjXQiAyJZIVQSuYe34u6dp0AHpX7v3U91NQpCZlcGFfGEfXXcOrfAn6vFmfQR82furzndl+E4CXZ7TGzqnoNiCVSCTPFylk8puQ3epr1R45jzMh8SmqOOlVp7TBMZfvxetETMiXPbA0og+OOSPS04lZ/g/3v/ySMt9+Q6mPP9Y7LikjiZoeNbkcfZl3G79r8HxxGzbqREyFJYuxr1cvdxuE4PCdw4zfMV63rW3ZtjQt3RRH68LV5uHBNNAD0lIyn6nv0d2QOADsnKyliJFIigmffPIJTk5OvPPOO890Hilk8pvkaPW147SCteMRvhtYh+l9aubo+v9ll1rB97fhDQq9iAG4MXwEqefVPj2KnnTopIwkXvzvRT5r+RnftPkGHyefHM+XsFsNAPbbvw8rL68cx2qFlpVBK5l1ZhYxaWrX5nbl2vFmwzep5FI4q9QmRKfqll/9pR2W1k8/bXpmx00OrlLfb22GmI/nUiIp7gghEEJgYSZhEYYwb+uKAhdWqq9m8kb4aO0F9l6NwNbKsD23Y5LZdO4uAN1rG/baFBY0cXE6EVNp8yacu3TJNmb55eUExQTx+u7XqeBcASsL/Ro/MzKSmBUrSNyhtimw9PTM8dpxaXHUXVSXz49+rhMxi7sv5pcOvxRaERN09B4ImDCrHRNmPZuIiY9M0YmYruNq4de45PMyUyIpVty4cYNatR7WApsxYwaffPIJ7dq14/3336dJkyb4+/uzf7/qSV2wYAF9+vShXbt2+Pn5MX36dN15qlatyqhRo6hVqxa3bt3CyclJd95Vq1YxevRoAEaPHs3kyZNp0aIFlSpVYm9WCQqA7777jsaNG1OnTh2mTXv4Q/6LL77A39+fVq1aERQU9FzuXXpk8hONOjWDpXHdffObm1HJLD4SyuIjoVz7Uv9UlxCCVt+o02H96+fslTB3Yv5ZgYWdLc49emDp5Ynn+FexrZRdPMSmxjLz1EwAVgasNHi+2DVrufvhh7p1j/Hjc/RqpWam0mr5w6aaOwftxNuhcHdsTk/NZMf8QGq0LE37kdWf6hz3rsVxYOVV7BytCb2gFrzzb1pSdrOWFAmmb7hI4J3453rOGmWcmRaQvTSEsWRmZnLs2DE2b97M9OnT2bFjBwDHjh3jwoULODg40LhxY3r27ImnpydXr15l4cKFNGuWe2+0u3fvcuDAAS5fvkznzp2ZNm0a27Zt4+rVqxw7dgwhBL1792bfvn04OjqyfPlyzpw5Q2ZmJg0aNKBhw4ZPfV8PkEImP4nOvTOyKVl9Wu3APWtYA73F70IiEun4vaqoPRxt+GFIPVOa91yJnPMHET/+iOLggHNAAP779xsc++XRLwGo51XPYJ2YhF27dCLGuWdPvCa9ho2vr8Fzbr62mff3v69bPzfqXJHoTbX1jwsApGZlF+UFrUbLxl/PcuuS6pmysrXEs5wTpSq50HaoTLOWSPKL/v37A9CwYUNu3Lih2965c2c8PDx0Yw4cOEDfvn2pUKGCUSIGoG/fvlhYWFCjRg1iYtS/7W3btrFt2zbq11cTShITE7l69SoJCQn069cPBwe1jEfv3s8nyUEKmfzkwhr1tWLBFzi7E5uia/jYxl//dMgP268AYGOldsEurGiTkoj48UcAvP43EcXAtN6cs3Oo6FKR1xu+TqbI5Id2P+gdF/nHn0T8oO4rO3sWJTp0yPH6dxPv6kRMizIt+LXjr0VCxNy7FsfNQDXmq/OYGnk6Ni0lk7/e3KdbD5hUVzaAlBRJnsVz8ixYWVmhzWpSC5Ca+jCOzdZWnRWwtLQkM/Phj5AnP5cerDs+0Sj30XGPnvfRc4Pq0X/w+uGHHzJ+/PjHxs6cOdPo+8kL5hG4UVS58p/6Wq/guxgrCvh6ODCyWQVK2OnPCrkXp75Br3zeHQ8n85gOyytCCEK6q9Nm3u+8jcfLL2cbk5ieyIv/vcivZ37ly6Nf4uPkY1DERM2brxMxnq+9lquIiUyJpMu/agzO5PqTmdN5DtYWhT8LJz01U5dN1HNiHazy0DRUq9FycV+Ybn3Md62kiJFInjMlS5YkPDycqKgo0tLS2LhxY67HbN++nejoaFJSUli7di0tW7Y0eO5Lly6h1WpZs2ZNruft2rUr8+bNIzExEYCwsDDCw8Np06YNa9euJSUlhYSEBDZs2JC3mzSA9MjkJ55+cPcMlH362hrPg83n7+Lr4ciaiS0N9kmKSEjjZGgM1paF13OQGRlJ6qVLVN62ldgVK3AdMCDbmKiUKNqtaKdbn9VplsHzhb33HvHr1T+0iuvWYlc19+mPgDVq9eaSDiUZW3tsHu/A/LgdFMOGn85QqrILPf9Xh8FTGuNVvoTRx9+7Fse/357UrcsaMRJJ/mBtbc3HH39MkyZN8PHxoVq1arke06RJEwYMGMDt27cZMWIEjRo1emzq6QFff/01vXr1wsvLi0aNGukEiiG6dOnCpUuXaN68OQBOTk4sWbKEBg0aMGTIEOrWrYu3tzeNGz+f70YpZPKTqKwYGZeCbQD48boLRCamc+Prnnr3CyHo+bMaQ9KrTt76BJkLqVeucL13H2z9/amwZDHuo0bpHXcz4SaVXSoDsLL3SoPekuRTp3QiptyffxglYjI0GSRmqH/gOwbteJrbMDvW/3QGoRVYWCpYWlkYJWKEVnA3JI4135/SbXNys6X9iGpSxEgk+cjkyZOZPHmywf2enp6PCZWyZcuydu3ax8b4+vpy4cKFx7YNHDiQgQMHZjvfggULHlv/77//dMuvv/46r7/+erZjpk6dytSpU3O4i7wjhUx+oclQvTGWNuq8TgFx9lYskYnpNK9k2JW/7swdwhPSAPi8by2D48yVG0OHkXL6NAAWziWwdM5e2j46NZrAqEDKlSjHv73/xdJC/9SIEILU8+cJHTYcgPIL5uNoRNBbSmYKUw+of5xDquat35K5odVosbC0YNfiSwitOufd542cq0A/ICUxnXnvHNCtW1lb0O3V2lSQU0kSiSSfkEImv4i9BUILLmVzH5uPfLdVzdOf3NFP736tVvD2yrMA7Hu3PY62hestITQahEYDQJlvvsalT59sY56cTtrYbyMVnPX3mAr/+huiFy7UrRsjYgD6rO3D3SS19s57jd8z1nyzQ5OpZdfiS7R5oSrla3gQfCKcgMn1jDo26k4iyz89plvv/04DSlV2KRKBzhJJUWP06NG6ejCFncL1rVWYOLVAfXX1LTAThBAcCI4EoElF/Z2Ie/y8H03Wr+7yHoWrs7UmLg5tWhreb72JlXdJbCtV1Dtu0q5JAFR3r86UplMMipjkU6d0Iqbs7Nk4NjdOxFyMvKgTMf/0+gcbS/1xSIWBo+uvceXofbzLO1OnQ1mjarsIIdg+L5Crx+8D4FbKgaHTmkoBI5FITIIUMvlF1DX1tUZAgZqxeXJrUjIy9bYZiEhI4/K9BADOTste7dbcuT54MJl371Fp82Zsyhou3vcgDmZFwAqDYzSJicQsWQKA9/vvU6JDe6PteFCH5tMWn1LDI29pyebEtTMRnN6mNm70reNplBC5fyOe/f9c4f51tQBYp9HV8W9aSooYiURiMqSQyS9Cs+IEyrcoMBO2B96ntZ8X9jb640Eaf6EGpH7RrxYu9oUrCDM1KIiM0JtgZWVQxAghiEuL4/UGr+uCcJ8kMzKSOx98SNKBh3Ed7qNfzJMt5yLPAdCnSvZpLXMnOT4dazv1/fHf72obh1aD/XDxyrnTeUaahpVfHSfmXrJu26gvW1DCPXsfK4lEIslPpJDJL9wrQ9gJ8M49BS4/uHQ3nlcWn6SWjzMbJ7V+bF9apoYftl3RrQ9vqn+qxZy53qcvAN5vvqF3vxCCH07+wPqQ9Xzd+mvalNVf4C/+vy06EeM2aiQuAb3z5E2ISlFL7Fd3r46FUrjKMgmtYP57B6hY1xOH6tB2WFXsHK1znU5KT8nkz0eK2/WYWIcyfq7P1P1aIpFInhb5yZNf2DiCa/kCu/zqU2o7gve6ZhdSP2y/wpx96tTX4pebmNSu50HS0WMoDg5YeXrqLXgXlxb3WI+jau6GxeT9L74AwP/IYSxdXfNsy4KLCwAYWq3gix4aS/TdJC4dusuZ7eo0kiZTjZGq1Sbn3lrRd5IIOR3O6azj7J1tePHLFljm0IBUIpEUD/bs2cOHH37I4cOHTX5tKWTyg5QYiAgCCi5O4M/91wFo9kTatUYrmLNXFTGnPuqMu4ECeeaIEIIbgwZTfu5fVFi8CFsDvY5e3f4qAO527nze8nPc7Nwe25986jRpIcEkbNkKgGJv/1QiJjkjWSdkOpTPueJvQZOeksm+5VdoO7wqMfeSdCLGq3wJuo6ryaEjB3I5A2ybe5GoMHWKzr6ENS9901LGwkgkhQiNRoOlpfFVuQsLUsjkBxfWQOI9cPMtkMvHp2YAYGtlgc0Tv5bXn1VLxbvYWxcqERO7ahV3/+8jAKIXLsJr8iS949I0aXzS4hNWBK1gStMp2erFpIWEEDps2GPbKq1ZnWd7tEJL06VNAajpUdNgs0lzIDEmjYUfHgSgQm0PqjT0ZuJsNZhZ0RMEro/Da0KICkvEyc2WUV+0ACV7nxaJRFJw3Lhxg27dutGwYUNOnTpFzZo1WbRoETVq1GDIkCFs376d9957j99//50ZM2bQqFEjIiMjddV8FyxYwPr160lOTiYkJIR+/frx7bffAmoTyGnTppGWlkblypWZP38+Tk5ObNmyhTfeeAMHBwdatWqVi4X5hxQy+UFwVlVXn2dvT/402FpZ8O+E5thaZVfen228BMCWN1pn22euZEZG6kSMddmyuI8aqXfcq9tf5WzEWQ4PO8xHzT/SO+Zaz14AeL39Fi4BAVi6uWFhm/e+Ujtv7tQtL+u5LM/Hm4pdiy5x6ZCaGm5fwpqKD7KRjNAgGo2W4BPh7JgfqNvWbkQ1o8WPRFJcGTIn+/RKrzqlGdncl5R0DaPnH8u2f2DDsgxqVI7opHQmLDn52L5/xjc36rpBQUHMnTuXli1bMmbMGGbPng2Ah4cHp06plbZ///13g8efOXOG06dPY2trS9WqVZk0aRL29vZ8/vnn7NixA0dHR7755ht++OEH3nvvPcaNG8euXbuoUqUKQ4YUXCFQKWTyg8isQNqKbQvk8rZWljSs8HjdmNQMDT/uuEJ0UjqKAqVdcs5KMSc08fHY+vvjNmI4boMH6x2TkpnCwTsHDZ4j484drvXtp1v3ePllg12xjeGnUz8BsL7verP0TJzbfZuqzUpRqpILwSfDad6vMrXa+hhla9SdRI5vuE7I6QjdNs9yTnR+qSbuZRxzOFIikRQk5cqV0zV+HDFiBD///DOA0SKjY8eOuLio3uUaNWoQGhpKbGwsgYGBuvOmp6fTvHlzLl++TMWKFfHz89Nd76uvvnret2QUUsjkB0nh6msp05f7j0pMo+HnO2jj78WiMQ8Deat9tEW3/Oh2c8bu8GFu/r0U77fexHPSazg0aKB33MXIi7yx5w0Ag40ab09+HW18PBZOTviuWPFMIuZm/E1C40MB8HX2ferz5BeJMans/+cKKYnpNA2oRI1WxvXP0mRoWf/zGe5cjdVt8/F3pe2wqriVkgJGIjGWnDwo9jaWOe53d7Qx2gPzJE/+UHmw7uj48O/XysoKrVYLQGpq6mPjbR/xTltaWpKZmYkQgs6dO7Ns2eOe5zNnzjyVjfmBTDfID1yz0pndK5v80oOyXJpxKRm6bXfjUnTLe99tR2s/L5PblVdCX3oJl4WLSNq/Hytvb5w7d8bKQ3+/nri0OGwt1T/A8XXG67Zr09LIuHeP9Bs3SM1qguZ//JjBCsDGsiJILaw3vcV0s/PGxEWksPgj9T1gbaB+kD406YKl04/oREz7kdWYOLs9fd9qIEWMRFJIuHnzpi5raOnSpXrjVnx9fTl5Up26WrVqVa7nbNasGQcPHiQ4OBiApKQkrly5QrVq1bhx4wYhIWpz5CeFjimRQiY/cM5KY7V3NellhRBci0gCYPWEh4X49l1Rpwh+H9GACh7m/6WUGhhI8uEjAJT99ReDAubHkz8ydONQKrlWYn7X+Rwbfgw7KzuEENyZMpWguvUIbteekG7dAbCvV++5CI+VV1YC0K9Kv1xGmg6NRv2Ftfyzo2iz0qlrtzeuz1d4aDyXVwviI9VfZ2O+a0WNlmVkLIxEUsioWrUqs2bNonr16sTExDBhwoRsY9555x1+++036tevT2RkZK7n9PLyYsGCBQwdOpQ6deroppXs7Oz4448/6NmzJw0aNMDbO/d2JvmFnFp63kRfhyv/gY2TyS99KEQtztbaz1PXkiAxLZP3/1UrtlYtlb0rtDlikeUGjXvpJap36qR3TFB0EPMuzAPA2cYZB2u1T1R6aCjX+vZDpKheKMdWrSjRtQsWDg44d+36zLatD1lPcmYy/m7+ZuGN0WRoWTj1EB5lHOnzRn1a9K/C1eP36ftWfSwsc/+dkp6aycqvTgBQqb4XXcbWxNKI4yQSiflhZWXFkqxWKw+4cePGY+vVqlXj3LlzuvXPP/8cyN5EcuPGjbrlDh06cPz48WzX69atG5cvX9at79mz5xmsf3qkkHneBG1WX61MX6q9ka8by19php/3QxH1x17V7de5Rkkqepq3Nybp0CGily7Fc8IEfFet4mhkhMGx47aNA2BivYk4WDsgNBruTplK3Lp1ujH+R49g6fL80qKTMpKYemAqABPqZv+lY2q0WsHRDddIiU/nfpraAbxWWx9qtzPOExNxM4EVX6ofTlZ20H187XyzVSKRSPILKWSeN7G31NfmE01/6eQMmlZ013kKohLT+HmXOq/5RV/TBx4bi0hPJ+zd90jYqhao837rLWwrVQID6j44JpiYtBjsrex5pdIIbk+aRML2Hbr93u++i9uI4U+VVp0TB8PUrKiXar1Epwr6PUWmZOm0I8RFqJ6nkZ+rwYHGeomEVuhETIXaHtj6RuePkRKJxCT4+vpyISsWsLghfcjPmxtZFVI9qpj0ssnpmTT9cievLH5Yf6Dh5+qXe5caJfF2Nt9mfrGr1+hEjOdrr6kiJgequFXh397/srjzfG6+NEYnYpw6dsTv4AE8Xh7z3EVMUHQQb+99Gyj42JiE6FSEENRoVQYnN1sGvN8Q+xJ5K254couadVW6sgu9/lcXa8eCnyaTSCSSp0F6ZJ43UaoHhCqdTXrZ9WfuAOBdQv0Cj0xM0+37bUTBFOYzFuvSpQCosm8v1jkEjAkhGL1lNLU8a/FCtRcosesCd7N+gVQ9eUIXW/O8ORdxjuGbhwPgaO1IRZdny3p6WlIS0tmxIJCbF6MpWdGZge83okHXvDf8jApL5Oh6tU1Fz9fqPm8zJRKJxKRIj8xzR80ewcbBpFf9YLUa0Du+jZryPeC3QwB8O7COLvDX3Ihds5Y7H07BpkIF/I8dzVHEJKQn0G5FO06Fn2JR4CIUAXenqvEqlbdtzTcRk65J14mY/n792f/C/ny5Tm5kpmu4dOguNy9G41ba8akEzAN2LVKrOzfsXkF2rJZIJIUe+Sn2vHGrCNYFVzW3vIcDiWmZhEYlAzCooXGBn6bmzvsf6AJzPSe8iqVzzhlV3xz7hujUaNzt3FndezVWO4+QANjVqIFN+fzrMh4YpZbnb+3TmuktpufbdXLj3O7bHF6jBm73eb0ejq5PN3UWePAO4aEJADTtnfMUnkQikRQGzF7IKIpSHXgd8AR2CiF+K2CTDBN9DSIuQ62BJr1sQmoGw5qWp3ppVQycuKEGbr7YvIJZpAg/iRBCJ2LKL1xolBAp41QGb3tv1vdbT9KsP4lYuAiAsrN+zVdb556fC8Cw6sNyGZk/HF4Tgo29JdWalaZCLbWeztOKGIADK64CasE7c3xvSCQSSV7JVyGjKMo8oBcQLoSo9cj2bsBPgCXwlxDia0PnEEJcAl5VFMUCWASYr5C5tkd9TQw36WVL2FkzpUd17K0tiU1OZ/R8NRula81SJrXDWB7UeHEd+gKOTY1rlzCx3kQG7ddyL2Ag6Vl1EUp+/BHWpUvnl5ncjL/Jntt78LL3omWZlvl2HX0kRKdyYvMNAg+osU9VGpbEw+fpaxPdDorhzPabZKRp8CpfghotjWtbIJFIJOZOfntkFgC/ogoQABRFsQRmAZ2B28BxRVHWo4qaJztOjRFChCuK0huYACzOZ3ufjfCswkAla5j0sgN/O0SLKp681dlfFxtjaaHQoIKbSe0whvQbN7AuXx6vt9/KtUBdqjaVi5EX2Xt7L56xGqrOmY2DmxfOPbrj1LEjLj175pudqZmp9Fyjnr9tubb54r3QarQkx6c/ts3a1pKUhAw2/HJGV2m358Q6uHg9/XSlJlPLuh9PA2rzx2eJr5FIJBJzI1+FjBBin6Iovk9sbgIECyGuASiKshzoI4T4CtV7o+8864H1iqJsApbmo8nPRpTqtqek6QqLHQqO5ERoDFfDE3FzsCYkIgkbKwvOf9IFWyvje+2Ygow7dwjp1h37+vXxXZb7f+O8iHlc2nRJt/65N7QZ/xpuQ/R3wH5eBMcE02+9mmLtbe/Nx80+zpfrLP/sGDH3kh/bVrt9WVoP8qNyfW/sS9hQtVkpHJzzllr9JGd3qrWN3Eo5MGRq4WgYKpFIJMaiCCHy9wKqkNn4YGpJUZSBQDchxNis9ZFAUyHEawaObwf0B2yBc0KIWQbGvQK8krVaFQh6fnfxGJ5A7g0qJM8D+axNh3zWpkU+b9Mhn7XpyM9nXUEIobfjsdkH+woh9gB7jBj3B/BHftujKMoJIUSj/L6ORD5rUyKftWmRz9t0yGdtOgrqWRdEHZkwoNwj62WztkkkEolEIpHkiYIQMscBP0VRKiqKYgO8AKwvADskEolEIpEUcvJVyCiKsgw4DFRVFOW2oigvCyEygdeArcAlYIUQ4mJ+2vGcyffpK4kO+axNh3zWpkU+b9Mhn7XpKJBnne/BvhKJRCKRSCT5hey1JJFIJBKJpNAihYweFEXppihKkKIowYqifKBnv62iKP9k7T+qp1aOJA8Y8bzfUhQlUFGUc4qi7FQURVZ0e0pye9aPjBugKIpQFEVmezwlxjxrRVEGZ723LyqKYr41sgoBRnyOlFcUZbeiKKezPkt6FISdhR1FUeYpihKuKMoFA/sVRVF+zvp/OKcoSoN8N0oIIf898g+1wnAIUAmwAc4CNZ4YMxH4PWv5BeCfgra7sP4z8nm3BxyylifI551/zzprXAlgH3AEaFTQdhfGf0a+r/2A04Bb1rp3QdtdWP8Z+bz/ACZkLdcAbhS03YXxH9AGaABcMLC/B/AfoADNgKP5bZP0yGRHV3lYCJEOLAf6PDGmD7Awa3kV0FGRHfiellyftxBitxDiQQncI6gp+5K8Y8x7G+Az4Bsg1ZTGFTGMedbjgFlCiBgAIYRpm7QVLYx53gJwzlp2Ae6Y0L4igxBiHxCdw5A+wCKhcgRwVRQl/5riIaeW9OED3Hpk/XbWNr1jhJqFFQd4mMS6oocxz/tRXkZV+5K8k+uzznIDlxNCbDKlYUUQY97X/oC/oigHFUU5ktVMV/J0GPO8PwFGKIpyG9gMTDKNacWOvH6mPzNmX9lXInmAoigjgEZA24K2pSiS1WH+B2B0AZtSXLBCnV5qh+pl3KcoSm0hRGxBGlWEGQosEEJ8ryhKc2Cxoii1hBDagjZM8mxIj0x2jKk8rBujKIoVqpsyyiTWFT2MqvSsKEonYCrQWwiRZiLbihq5PesSQC1gj6IoN1Dnt9fLgN+nwpj39W1gvRAiQwhxHbiCKmwkeceY5/0ysAJACHEYsEPtDSR5vpi8er8UMtkxpvLweuDFrOWBwC6RFeUkyTO5Pm9FUeoDc1BFjIwjeHpyfNZCiDghhKcQwlcI4Ysaj9RbCHGiYMwt1BjzObIW1RuDoiieqFNN10xoY1HCmOd9E+gIoChKdVQhE2FSK4sH64FRWdlLzYA4IcTd/LygnFp6AiFEpqIoDyoPWwLzhBAXFUX5FDghhFgPzEV1SwajBj29UHAWF26MfN7fAU7AyqyY6ptCiN4FZnQhxchnLXkOGPmstwJdFEUJBDTAu0II6dl9Cox83m8DfyqK8iZq4O9o+QM072RV7G8HeGbFG00DrAGEEL+jxh/1AIKBZOClfLdJ/j9KJBKJRCIprMipJYlEIpFIJIUWKWQkEolEIpEUWqSQkUgkEolEUmiRQkYikUgkEkmhRQoZiUQikUgkhRYpZCQSiUEURZma1Zn5nKIoZxRFaZq1/S9FUWrkw/USDWzXZF3/wb8Psra3zrLvjKIo9oqifJe1/p2iKK8qijIqh2uVURRl1fO+B4lEYlpk+rVEItFLVhn3H4B2Qoi0rKJtNkKIfGu2pyhKohDCKQ/bfwcOCCGWZK3HAe5CCE1+2SiRSMwL6ZGRSCSGKA1EPmgJIYSIfCBiFEXZ86B1gaIoLyuKckVRlGOKovypKMqvWdsXKIrys6IohxRFuaYoysCs7U6KouxUFOWUoijnFUXR14E7VxRFGQsMBj5TFOVvRVHWoxZOPKkoyhBFUT5RFOWdrLFVFEXZoSjK2azrVlYUxVdRlAtZ+y2zvDjHs7xP47O2t8u611WKolzOuo6Sta9x1r2dzbr3Eoqi7FMUpd4jNh5QFKXu09yfRCIxDlnZVyKRGGIb8LGiKFeAHcA/Qoi9jw5QFKUM8BHQAEgAdgFnHxlSGmgFVEMtXb4KSAX6CSHis7w8RxRFWZ9LlVV7RVHOPLL+lRDiL0VRWgEbhRCrsuxJFELUy1r+5JHxfwNfCyHWKIpih/ojzvuR/S+jllJvrCiKLXBQUZRtWfvqAzWBO8BBoKWiKMeAf4AhQojjiqI4AymoVb9HA28oiuIP2AkhHn0eEonkOSM9MhKJRC9CiESgIfAKak+afxRFGf3EsCbAXiFEtBAiA1j5xP61QgitECIQKJm1TQG+VBTlHKpA8nlknyFShBD1Hvn3j7H3oShKCcBHCLEm675ShRDJTwzrgtof5gxwFPDgYQPHY0KI21ldks8AvkBV4K4Q4njWOeOFEJlZ999LURRrYAywwFg7JRLJ0yE9MhKJxCBZsSZ7UDtin0dtlrogD6d4tFO5kvU6HPACGgohMhS107bdMxv7bCjAJCHE1sc2Kko7Hr8HDTl8bgohkhVF2Q70QZ32avjcLZVIJI8hPTISiUQviqJUVRTF75FN9YDQJ4YdB9oqiuKmKIoVMMCIU7sA4Vkipj1Q4bkYbAAhRAJwW1GUvgCKotgqiuLwxLCtwIQsTwqKovgriuKYw2mDgNKKojTOGl8i6/4B/gJ+Bo4LIWKe461IJBI9SI+MRCIxhBPwi6IorkAmajfbVx4dIIQIUxTlS+AYaif4y0BcLuf9G9iQ5eE5kXVMbjwZI7NFCPGBMTeRxUhgjqJ2Q84ABgHaR/b/hTpldCormDcC6GvoZEKIdEVRhqA+H3vU+JhOQKIQ4qSiKPHA/DzYJ5FInhKZfi2RSJ4JRVGchBCJWR6JNcC8B/EoxZGsAOg9QLWsuBqJRJKPyKkliUTyrHyS5S25AFwH1haoNQVIVgG+o8BUKWIkEtMgPTISiUQikUgKLdIjI5FIJBKJpNAihYxEIpFIJJJCixQyEolEIpFICi1SyEgkEolEIim0SCEjkUgkEomk0CKFjEQikUgkkkLL/wMGnmhxv97+tAAAAABJRU5ErkJggg==\n" - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "import plotting\n", - "import matplotlib.pyplot as plt\n", - "from sklearn.metrics import accuracy_score\n", - "from tensorflow.keras.models import load_model\n", - "model_ref = load_model('model_1/KERAS_check_best_model.h5')\n", - "\n", - "y_ref = model_ref.predict(X_test)\n", - "y_prune = model.predict(X_test)\n", - "\n", - "print(\"Accuracy unpruned: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_ref, axis=1))))\n", - "print(\"Accuracy pruned: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_prune, axis=1))))\n", - "\n", - "fig, ax = plt.subplots(figsize=(9, 9))\n", - "_ = plotting.makeRoc(y_test, y_ref, classes)\n", - "plt.gca().set_prop_cycle(None) # reset the colors\n", - "_ = plotting.makeRoc(y_test, y_prune, classes, linestyle='--')\n", - "\n", - "from matplotlib.lines import Line2D\n", - "lines = [Line2D([0], [0], ls='-'),\n", - " Line2D([0], [0], ls='--')]\n", - "from matplotlib.legend import Legend\n", - "leg = Legend(ax, lines, labels=['unpruned', 'pruned'],\n", - " loc='lower right', frameon=False)\n", - "ax.add_artist(leg)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Convert the model to FPGA firmware with hls4ml\n", - "Let's use the default configuration: `ap_fixed<16,6>` precision everywhere and `ReuseFactor=1`, so we can compare with the part 1 model. We need to use `strip_pruning` to change the layer types back to their originals.\n", - "\n", - "**The synthesis will take a while**\n", - "\n", - "While the C-Synthesis is running, we can monitor the progress looking at the log file by opening a terminal from the notebook home, and executing:\n", - "\n", - "`tail -f model_2/hls4ml_prj/vivado_hls.log`" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Interpreting Sequential\n", - "Topology:\n", - "Layer name: fc1_input, layer type: Input\n", - "Layer name: fc1, layer type: Dense\n", - " -> Activation (linear), layer name: fc1\n", - "Layer name: relu1, layer type: Activation\n", - "Layer name: fc2, layer type: Dense\n", - " -> Activation (linear), layer name: fc2\n", - "Layer name: relu2, layer type: Activation\n", - "Layer name: fc3, layer type: Dense\n", - " -> Activation (linear), layer name: fc3\n", - "Layer name: relu3, layer type: Activation\n", - "Layer name: output, layer type: Dense\n", - " -> Activation (linear), layer name: output\n", - "Layer name: softmax, layer type: Activation\n", - "{'Model': {'Precision': 'ap_fixed<16,6>', 'ReuseFactor': 1, 'Strategy': 'Latency'}}\n", - "Interpreting Sequential\n", - "Topology:\n", - "Layer name: fc1_input, layer type: InputLayer, current shape: [[None, 16]]\n", - "Layer name: fc1, layer type: Dense, current shape: [[None, 16]]\n", - "Layer name: relu1, layer type: Activation, current shape: [[None, 64]]\n", - "Layer name: fc2, layer type: Dense, current shape: [[None, 64]]\n", - "Layer name: relu2, layer type: Activation, current shape: [[None, 32]]\n", - "Layer name: fc3, layer type: Dense, current shape: [[None, 32]]\n", - "Layer name: relu3, layer type: Activation, current shape: [[None, 32]]\n", - "Layer name: output, layer type: Dense, current shape: [[None, 32]]\n", - "Layer name: softmax, layer type: Softmax, current shape: [[None, 5]]\n", - "Creating HLS model\n", - "Writing HLS project\n", - "Done\n" - ] - } - ], - "source": [ - "import hls4ml\n", - "\n", - "config = hls4ml.utils.config_from_keras_model(model, granularity='model')\n", - "print(config)\n", - "hls_model = hls4ml.converters.convert_from_keras_model(model,\n", - " hls_config=config,\n", - " output_dir='model_2/hls4ml_prj',\n", - " fpga_part='xcu250-figd2104-2L-e')\n", - "hls_model.compile()\n", - "hls_model.build(csim=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Check the reports\n", - "Print out the reports generated by Vivado HLS. Pay attention to the Utilization Estimates' section in particular this time." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Found 1 solution(s) in model_2/hls4ml_prj//myproject_prj.\n", - "Reports for solution \"solution1\":\n", - "\n", - "C simulation report not found.\n", - "SYNTHESIS REPORT:\n", - "================================================================\n", - "== Vivado HLS Report for 'myproject'\n", - "================================================================\n", - "* Date: Tue Mar 2 15:06:03 2021\n", - "\n", - "* Version: 2019.2 (Build 2704478 on Wed Nov 06 22:10:23 MST 2019)\n", - "* Project: myproject_prj\n", - "* Solution: solution1\n", - "* Product family: virtexuplus\n", - "* Target device: xcu250-figd2104-2L-e\n", - "\n", - "\n", - "================================================================\n", - "== Performance Estimates\n", - "================================================================\n", - "+ Timing: \n", - " * Summary: \n", - " +--------+---------+----------+------------+\n", - " | Clock | Target | Estimated| Uncertainty|\n", - " +--------+---------+----------+------------+\n", - " |ap_clk | 5.00 ns | 4.343 ns | 0.62 ns |\n", - " +--------+---------+----------+------------+\n", - "\n", - "+ Latency: \n", - " * Summary: \n", - " +---------+---------+-----------+-----------+-----+-----+----------+\n", - " | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", - " | min | max | min | max | min | max | Type |\n", - " +---------+---------+-----------+-----------+-----+-----+----------+\n", - " | 16| 16| 80.000 ns | 80.000 ns | 2| 2| function |\n", - " +---------+---------+-----------+-----------+-----+-----+----------+\n", - "\n", - " + Detail: \n", - " * Instance: \n", - " +----------------------------------+-----------------------+---------+---------+-----------+-----------+-----+-----+----------+\n", - " | | | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", - " | Instance | Module | min | max | min | max | min | max | Type |\n", - " +----------------------------------+-----------------------+---------+---------+-----------+-----------+-----+-----+----------+\n", - " |grp_dense_latency_0_0_0_1_fu_207 |dense_latency_0_0_0_1 | 2| 2| 10.000 ns | 10.000 ns | 2| 2| function |\n", - " |grp_dense_latency_0_0_0_s_fu_275 |dense_latency_0_0_0_s | 2| 2| 10.000 ns | 10.000 ns | 2| 2| function |\n", - " |grp_dense_latency_0_0_0_2_fu_311 |dense_latency_0_0_0_2 | 1| 1| 5.000 ns | 5.000 ns | 2| 2| function |\n", - " |grp_dense_latency_0_0_0_3_fu_317 |dense_latency_0_0_0_3 | 2| 2| 10.000 ns | 10.000 ns | 2| 2| function |\n", - " |call_ret1_relu_1_fu_353 |relu_1 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " |call_ret3_relu_fu_421 |relu | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " |call_ret5_relu_2_fu_457 |relu_2 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " +----------------------------------+-----------------------+---------+---------+-----------+-----------+-----+-----+----------+\n", - "\n", - " * Loop: \n", - " N/A\n", - "\n", - "\n", - "\n", - "================================================================\n", - "== Utilization Estimates\n", - "================================================================\n", - "* Summary: \n", - "+---------------------+---------+-------+---------+---------+------+\n", - "| Name | BRAM_18K| DSP48E| FF | LUT | URAM |\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|DSP | -| 5| -| -| -|\n", - "|Expression | -| -| 0| 78| -|\n", - "|FIFO | -| -| -| -| -|\n", - "|Instance | -| 1064| 17406| 56754| -|\n", - "|Memory | 3| -| 0| 0| -|\n", - "|Multiplexer | -| -| -| 99| -|\n", - "|Register | -| -| 3991| -| -|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Total | 3| 1069| 21397| 56931| 0|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Available SLR | 1344| 3072| 864000| 432000| 320|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Utilization SLR (%) | ~0 | 34| 2| 13| 0|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Available | 5376| 12288| 3456000| 1728000| 1280|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Utilization (%) | ~0 | 8| ~0 | 3| 0|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "\n", - "+ Detail: \n", - " * Instance: \n", - " +----------------------------------+-----------------------+---------+-------+------+-------+-----+\n", - " | Instance | Module | BRAM_18K| DSP48E| FF | LUT | URAM|\n", - " +----------------------------------+-----------------------+---------+-------+------+-------+-----+\n", - " |grp_dense_latency_0_0_0_1_fu_207 |dense_latency_0_0_0_1 | 0| 512| 8644| 25201| 0|\n", - " |grp_dense_latency_0_0_0_2_fu_311 |dense_latency_0_0_0_2 | 0| 256| 3234| 12545| 0|\n", - " |grp_dense_latency_0_0_0_3_fu_317 |dense_latency_0_0_0_3 | 0| 40| 1124| 2985| 0|\n", - " |grp_dense_latency_0_0_0_s_fu_275 |dense_latency_0_0_0_s | 0| 256| 4404| 12439| 0|\n", - " |call_ret3_relu_fu_421 |relu | 0| 0| 0| 896| 0|\n", - " |call_ret1_relu_1_fu_353 |relu_1 | 0| 0| 0| 1792| 0|\n", - " |call_ret5_relu_2_fu_457 |relu_2 | 0| 0| 0| 896| 0|\n", - " +----------------------------------+-----------------------+---------+-------+------+-------+-----+\n", - " |Total | | 0| 1064| 17406| 56754| 0|\n", - " +----------------------------------+-----------------------+---------+-------+------+-------+-----+\n", - "\n" - ] - } - ], - "source": [ - "hls4ml.report.read_vivado_report('model_2/hls4ml_prj/')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Print the report for the model trained in part 1. Remember these models have the same architecture, but the model in this section was trained using the sparsity API from tensorflow_model_optimization. Notice how the resource usage had dramatically reduced (particularly the DSPs). When Vivado HLS notices an operation like `y = 0 * x` it can avoid placing a DSP for that operation. The impact of this is biggest when `ReuseFactor = 1`, but still applies at higher reuse as well. **Note you need to have trained and synthesized the model from part 1**" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Found 1 solution(s) in model_1/hls4ml_prj/myproject_prj.\n", - "Reports for solution \"solution1\":\n", - "\n", - "C simulation report not found.\n", - "SYNTHESIS REPORT:\n", - "================================================================\n", - "== Vivado HLS Report for 'myproject'\n", - "================================================================\n", - "* Date: Tue Mar 2 09:31:37 2021\n", - "\n", - "* Version: 2019.2 (Build 2704478 on Wed Nov 06 22:10:23 MST 2019)\n", - "* Project: myproject_prj\n", - "* Solution: solution1\n", - "* Product family: virtexuplus\n", - "* Target device: xcu250-figd2104-2L-e\n", - "\n", - "\n", - "================================================================\n", - "== Performance Estimates\n", - "================================================================\n", - "+ Timing: \n", - " * Summary: \n", - " +--------+---------+----------+------------+\n", - " | Clock | Target | Estimated| Uncertainty|\n", - " +--------+---------+----------+------------+\n", - " |ap_clk | 5.00 ns | 3.883 ns | 0.62 ns |\n", - " +--------+---------+----------+------------+\n", - "\n", - "+ Latency: \n", - " * Summary: \n", - " +---------+---------+-----------+-----------+-----+-----+----------+\n", - " | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", - " | min | max | min | max | min | max | Type |\n", - " +---------+---------+-----------+-----------+-----+-----+----------+\n", - " | 9| 9| 45.000 ns | 45.000 ns | 1| 1| function |\n", - " +---------+---------+-----------+-----------+-----+-----+----------+\n", - "\n", - " + Detail: \n", - " * Instance: \n", - " +----------------------------------+-----------------------+---------+---------+----------+----------+-----+-----+----------+\n", - " | | | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", - " | Instance | Module | min | max | min | max | min | max | Type |\n", - " +----------------------------------+-----------------------+---------+---------+----------+----------+-----+-----+----------+\n", - " |grp_dense_latency_0_0_0_1_fu_215 |dense_latency_0_0_0_1 | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", - " |grp_dense_latency_0_0_0_s_fu_283 |dense_latency_0_0_0_s | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", - " |grp_dense_latency_0_0_0_2_fu_319 |dense_latency_0_0_0_2 | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", - " |grp_dense_latency_0_0_0_3_fu_325 |dense_latency_0_0_0_3 | 1| 1| 5.000 ns | 5.000 ns | 1| 1| function |\n", - " |call_ret1_relu_1_fu_361 |relu_1 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " |call_ret3_relu_fu_429 |relu | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " |call_ret5_relu_2_fu_465 |relu_2 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " +----------------------------------+-----------------------+---------+---------+----------+----------+-----+-----+----------+\n", - "\n", - " * Loop: \n", - " N/A\n", - "\n", - "\n", - "\n", - "================================================================\n", - "== Utilization Estimates\n", - "================================================================\n", - "* Summary: \n", - "+---------------------+---------+-------+---------+---------+------+\n", - "| Name | BRAM_18K| DSP48E| FF | LUT | URAM |\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|DSP | -| 5| -| -| -|\n", - "|Expression | -| -| 0| 78| -|\n", - "|FIFO | -| -| -| -| -|\n", - "|Instance | -| 3906| 24516| 78553| -|\n", - "|Memory | 4| -| 0| 0| -|\n", - "|Multiplexer | -| -| -| 36| -|\n", - "|Register | -| -| 2405| -| -|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Total | 4| 3911| 26921| 78667| 0|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Available SLR | 1344| 3072| 864000| 432000| 320|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Utilization SLR (%) | ~0 | 127| 3| 18| 0|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Available | 5376| 12288| 3456000| 1728000| 1280|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Utilization (%) | ~0 | 31| ~0 | 4| 0|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "\n", - "+ Detail: \n", - " * Instance: \n", - " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", - " | Instance | Module | BRAM_18K| DSP48E| FF | LUT | URAM|\n", - " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", - " |grp_dense_latency_0_0_0_1_fu_215 |dense_latency_0_0_0_1 | 0| 1859| 11265| 35856| 0|\n", - " |grp_dense_latency_0_0_0_2_fu_319 |dense_latency_0_0_0_2 | 0| 982| 6145| 18240| 0|\n", - " |grp_dense_latency_0_0_0_3_fu_325 |dense_latency_0_0_0_3 | 0| 157| 961| 2825| 0|\n", - " |grp_dense_latency_0_0_0_s_fu_283 |dense_latency_0_0_0_s | 0| 908| 6145| 18048| 0|\n", - " |call_ret3_relu_fu_429 |relu | 0| 0| 0| 896| 0|\n", - " |call_ret1_relu_1_fu_361 |relu_1 | 0| 0| 0| 1792| 0|\n", - " |call_ret5_relu_2_fu_465 |relu_2 | 0| 0| 0| 896| 0|\n", - " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", - " |Total | | 0| 3906| 24516| 78553| 0|\n", - " +----------------------------------+-----------------------+---------+-------+-------+-------+-----+\n", - "\n" - ] - } - ], - "source": [ - "hls4ml.report.read_vivado_report('model_1/hls4ml_prj')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.8" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} \ No newline at end of file diff --git a/notebooks/part4_quantization.ipynb b/notebooks/part4_quantization.ipynb deleted file mode 100644 index c5a2da8b87..0000000000 --- a/notebooks/part4_quantization.ipynb +++ /dev/null @@ -1,1082 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Part 4: Quantization" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.utils import to_categorical\n", - "from sklearn.datasets import fetch_openml\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.preprocessing import LabelEncoder, StandardScaler\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "%matplotlib inline\n", - "seed = 0\n", - "np.random.seed(seed)\n", - "import tensorflow as tf\n", - "tf.random.set_seed(seed)\n", - "import os\n", - "os.environ['PATH'] = '/tools/Xilinx/Vivado/2019.2/bin:' + os.environ['PATH']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Fetch the jet tagging dataset from Open ML" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "X_train_val = np.load('X_train_val.npy')\n", - "X_test = np.load('X_test.npy')\n", - "y_train_val = np.load('y_train_val.npy')\n", - "y_test = np.load('y_test.npy')\n", - "classes = np.load('classes.npy', allow_pickle=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Construct a model\n", - "This time we're going to use QKeras layers.\n", - "QKeras is \"Quantized Keras\" for deep heterogeneous quantization of ML models.\n", - "\n", - "https://github.com/google/qkeras\n", - "\n", - "It is maintained by Google and we recently added support for QKeras model to hls4ml." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow.keras.models import Sequential\n", - "from tensorflow.keras.optimizers import Adam\n", - "from tensorflow.keras.regularizers import l1\n", - "from callbacks import all_callbacks\n", - "from tensorflow.keras.layers import Activation\n", - "from qkeras.qlayers import QDense, QActivation\n", - "from qkeras.quantizers import quantized_bits, quantized_relu" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We're using `QDense` layer instead of `Dense`, and `QActivation` instead of `Activation`. We're also specifying `kernel_quantizer = quantized_bits(6,0,0)`. This will use 6-bits (of which 0 are integer) for the weights. We also use the same quantization for the biases, and `quantized_relu(6)` for 6-bit ReLU activations." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "model = Sequential()\n", - "model.add(QDense(64, input_shape=(16,), name='fc1',\n", - " kernel_quantizer=quantized_bits(6,0,alpha=1), bias_quantizer=quantized_bits(6,0,alpha=1),\n", - " kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", - "model.add(QActivation(activation=quantized_relu(6), name='relu1'))\n", - "model.add(QDense(32, name='fc2',\n", - " kernel_quantizer=quantized_bits(6,0,alpha=1), bias_quantizer=quantized_bits(6,0,alpha=1),\n", - " kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", - "model.add(QActivation(activation=quantized_relu(6), name='relu2'))\n", - "model.add(QDense(32, name='fc3',\n", - " kernel_quantizer=quantized_bits(6,0,alpha=1), bias_quantizer=quantized_bits(6,0,alpha=1),\n", - " kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", - "model.add(QActivation(activation=quantized_relu(6), name='relu3'))\n", - "model.add(QDense(5, name='output',\n", - " kernel_quantizer=quantized_bits(6,0,alpha=1), bias_quantizer=quantized_bits(6,0,alpha=1),\n", - " kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001)))\n", - "model.add(Activation(activation='softmax', name='softmax'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Train sparse\n", - "Let's train with model sparsity again, since QKeras layers are prunable." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "from tensorflow_model_optimization.python.core.sparsity.keras import prune, pruning_callbacks, pruning_schedule\n", - "from tensorflow_model_optimization.sparsity.keras import strip_pruning\n", - "pruning_params = {\"pruning_schedule\" : pruning_schedule.ConstantSparsity(0.75, begin_step=2000, frequency=100)}\n", - "model = prune.prune_low_magnitude(model, **pruning_params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Train the model\n", - "We'll use the same settings as the model for part 1: Adam optimizer with categorical crossentropy loss.\n", - "The callbacks will decay the learning rate and save the model into a directory 'model_2'\n", - "The model isn't very complex, so this should just take a few minutes even on the CPU.\n", - "If you've restarted the notebook kernel after training once, set `train = False` to load the trained model rather than training again." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "pycharm": { - "is_executing": true - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WARNING:tensorflow:`epsilon` argument is deprecated and will be removed, use `min_delta` instead.\n", - "WARNING:tensorflow:`period` argument is deprecated. Please use `save_freq` to specify the frequency in number of batches seen.\n", - "Epoch 1/30\n", - " 2/487 [..............................] - ETA: 26s - loss: 1.6332 - accuracy: 0.3340WARNING:tensorflow:Callbacks method `on_train_batch_end` is slow compared to the batch time (batch time: 0.0033s vs `on_train_batch_end` time: 0.1043s). Check your callbacks.\n", - "484/487 [============================>.] - ETA: 0s - loss: 1.3864 - accuracy: 0.4909\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00001: val_loss improved from inf to 1.19395, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00001: val_loss improved from inf to 1.19395, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00001: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00001: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 1.3854 - accuracy: 0.4916 - val_loss: 1.1940 - val_accuracy: 0.6129\n", - "Epoch 2/30\n", - "479/487 [============================>.] - ETA: 0s - loss: 1.1089 - accuracy: 0.6524\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00002: val_loss improved from 1.19395 to 1.04657, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00002: val_loss improved from 1.19395 to 1.04657, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00002: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00002: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 1.1079 - accuracy: 0.6529 - val_loss: 1.0466 - val_accuracy: 0.6832\n", - "Epoch 3/30\n", - "478/487 [============================>.] - ETA: 0s - loss: 1.0015 - accuracy: 0.7013\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00003: val_loss improved from 1.04657 to 0.96347, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00003: val_loss improved from 1.04657 to 0.96347, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00003: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00003: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 1.0008 - accuracy: 0.7015 - val_loss: 0.9635 - val_accuracy: 0.7123\n", - "Epoch 4/30\n", - "478/487 [============================>.] - ETA: 0s - loss: 0.9310 - accuracy: 0.7177\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00004: val_loss improved from 0.96347 to 0.90663, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00004: val_loss improved from 0.96347 to 0.90663, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00004: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00004: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.9306 - accuracy: 0.7177 - val_loss: 0.9066 - val_accuracy: 0.7217\n", - "Epoch 5/30\n", - "478/487 [============================>.] - ETA: 0s - loss: 1.1101 - accuracy: 0.6642\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00005: val_loss did not improve from 0.90663\n", - "\n", - "Epoch 00005: val_loss did not improve from 0.90663\n", - "\n", - "Epoch 00005: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00005: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 1.1092 - accuracy: 0.6647 - val_loss: 1.0584 - val_accuracy: 0.6913\n", - "Epoch 6/30\n", - "480/487 [============================>.] - ETA: 0s - loss: 1.0146 - accuracy: 0.7011\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00006: val_loss did not improve from 0.90663\n", - "\n", - "Epoch 00006: val_loss did not improve from 0.90663\n", - "\n", - "Epoch 00006: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00006: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 1.0142 - accuracy: 0.7012 - val_loss: 0.9860 - val_accuracy: 0.7070\n", - "Epoch 7/30\n", - "474/487 [============================>.] - ETA: 0s - loss: 0.9585 - accuracy: 0.7116\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00007: val_loss did not improve from 0.90663\n", - "\n", - "Epoch 00007: val_loss did not improve from 0.90663\n", - "\n", - "Epoch 00007: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00007: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.9580 - accuracy: 0.7118 - val_loss: 0.9405 - val_accuracy: 0.7147\n", - "Epoch 8/30\n", - "485/487 [============================>.] - ETA: 0s - loss: 0.9219 - accuracy: 0.7170\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00008: val_loss did not improve from 0.90663\n", - "\n", - "Epoch 00008: val_loss did not improve from 0.90663\n", - "\n", - "Epoch 00008: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00008: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.9220 - accuracy: 0.7170 - val_loss: 0.9107 - val_accuracy: 0.7185\n", - "Epoch 9/30\n", - "473/487 [============================>.] - ETA: 0s - loss: 0.8966 - accuracy: 0.7202\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00009: val_loss improved from 0.90663 to 0.88732, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00009: val_loss improved from 0.90663 to 0.88732, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00009: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00009: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.8962 - accuracy: 0.7203 - val_loss: 0.8873 - val_accuracy: 0.7214\n", - "Epoch 10/30\n", - "472/487 [============================>.] - ETA: 0s - loss: 0.8750 - accuracy: 0.7232\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00010: val_loss improved from 0.88732 to 0.86819, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00010: val_loss improved from 0.88732 to 0.86819, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00010: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00010: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "Epoch 00010: saving model to model_3/KERAS_check_model_epoch10.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.8749 - accuracy: 0.7231 - val_loss: 0.8682 - val_accuracy: 0.7240\n", - "Epoch 11/30\n", - "473/487 [============================>.] - ETA: 0s - loss: 0.8572 - accuracy: 0.7257\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00011: val_loss improved from 0.86819 to 0.85183, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00011: val_loss improved from 0.86819 to 0.85183, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00011: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00011: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.8568 - accuracy: 0.7258 - val_loss: 0.8518 - val_accuracy: 0.7265\n", - "Epoch 12/30\n", - "471/487 [============================>.] - ETA: 0s - loss: 0.8412 - accuracy: 0.7283\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00012: val_loss improved from 0.85183 to 0.83666, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00012: val_loss improved from 0.85183 to 0.83666, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00012: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00012: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.8412 - accuracy: 0.7284 - val_loss: 0.8367 - val_accuracy: 0.7286\n", - "Epoch 13/30\n", - "476/487 [============================>.] - ETA: 0s - loss: 0.8280 - accuracy: 0.7306\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00013: val_loss improved from 0.83666 to 0.82493, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00013: val_loss improved from 0.83666 to 0.82493, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00013: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00013: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.8277 - accuracy: 0.7307 - val_loss: 0.8249 - val_accuracy: 0.7308\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch 14/30\n", - "486/487 [============================>.] - ETA: 0s - loss: 0.8162 - accuracy: 0.7326\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00014: val_loss improved from 0.82493 to 0.81425, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00014: val_loss improved from 0.82493 to 0.81425, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00014: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00014: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.8162 - accuracy: 0.7326 - val_loss: 0.8143 - val_accuracy: 0.7327\n", - "Epoch 15/30\n", - "476/487 [============================>.] - ETA: 0s - loss: 0.8068 - accuracy: 0.7342\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00015: val_loss improved from 0.81425 to 0.80559, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00015: val_loss improved from 0.81425 to 0.80559, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00015: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00015: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.8065 - accuracy: 0.7343 - val_loss: 0.8056 - val_accuracy: 0.7343\n", - "Epoch 16/30\n", - "485/487 [============================>.] - ETA: 0s - loss: 0.7980 - accuracy: 0.7362\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00016: val_loss improved from 0.80559 to 0.79786, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00016: val_loss improved from 0.80559 to 0.79786, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00016: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00016: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.7980 - accuracy: 0.7362 - val_loss: 0.7979 - val_accuracy: 0.7361\n", - "Epoch 17/30\n", - "474/487 [============================>.] - ETA: 0s - loss: 0.7908 - accuracy: 0.7377\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00017: val_loss improved from 0.79786 to 0.79130, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00017: val_loss improved from 0.79786 to 0.79130, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00017: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00017: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.7909 - accuracy: 0.7377 - val_loss: 0.7913 - val_accuracy: 0.7377\n", - "Epoch 18/30\n", - "478/487 [============================>.] - ETA: 0s - loss: 0.7841 - accuracy: 0.7393\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00018: val_loss improved from 0.79130 to 0.78559, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00018: val_loss improved from 0.79130 to 0.78559, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00018: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00018: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.7844 - accuracy: 0.7391 - val_loss: 0.7856 - val_accuracy: 0.7392\n", - "Epoch 19/30\n", - "478/487 [============================>.] - ETA: 0s - loss: 0.7798 - accuracy: 0.7402\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00019: val_loss improved from 0.78559 to 0.78118, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00019: val_loss improved from 0.78559 to 0.78118, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00019: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00019: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.7795 - accuracy: 0.7403 - val_loss: 0.7812 - val_accuracy: 0.7403\n", - "Epoch 20/30\n", - "475/487 [============================>.] - ETA: 0s - loss: 0.7750 - accuracy: 0.7412\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00020: val_loss improved from 0.78118 to 0.77648, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00020: val_loss improved from 0.78118 to 0.77648, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00020: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00020: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "Epoch 00020: saving model to model_3/KERAS_check_model_epoch20.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.7749 - accuracy: 0.7412 - val_loss: 0.7765 - val_accuracy: 0.7413\n", - "Epoch 21/30\n", - "483/487 [============================>.] - ETA: 0s - loss: 0.7707 - accuracy: 0.7426\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00021: val_loss improved from 0.77648 to 0.77317, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00021: val_loss improved from 0.77648 to 0.77317, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00021: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00021: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.7707 - accuracy: 0.7426 - val_loss: 0.7732 - val_accuracy: 0.7416\n", - "Epoch 22/30\n", - "474/487 [============================>.] - ETA: 0s - loss: 0.7676 - accuracy: 0.7434\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00022: val_loss improved from 0.77317 to 0.76988, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00022: val_loss improved from 0.77317 to 0.76988, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00022: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00022: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.7672 - accuracy: 0.7435 - val_loss: 0.7699 - val_accuracy: 0.7424\n", - "Epoch 23/30\n", - "482/487 [============================>.] - ETA: 0s - loss: 0.7642 - accuracy: 0.7443\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00023: val_loss improved from 0.76988 to 0.76731, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00023: val_loss improved from 0.76988 to 0.76731, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00023: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00023: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.7641 - accuracy: 0.7443 - val_loss: 0.7673 - val_accuracy: 0.7433\n", - "Epoch 24/30\n", - "475/487 [============================>.] - ETA: 0s - loss: 0.7617 - accuracy: 0.7450\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00024: val_loss improved from 0.76731 to 0.76479, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00024: val_loss improved from 0.76731 to 0.76479, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00024: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00024: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.7617 - accuracy: 0.7450 - val_loss: 0.7648 - val_accuracy: 0.7439\n", - "Epoch 25/30\n", - "486/487 [============================>.] - ETA: 0s - loss: 0.7593 - accuracy: 0.7455\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00025: val_loss improved from 0.76479 to 0.76259, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00025: val_loss improved from 0.76479 to 0.76259, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00025: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00025: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.7592 - accuracy: 0.7455 - val_loss: 0.7626 - val_accuracy: 0.7445\n", - "Epoch 26/30\n", - "477/487 [============================>.] - ETA: 0s - loss: 0.7571 - accuracy: 0.7464\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00026: val_loss improved from 0.76259 to 0.76096, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00026: val_loss improved from 0.76259 to 0.76096, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00026: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00026: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.7574 - accuracy: 0.7463 - val_loss: 0.7610 - val_accuracy: 0.7449\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Epoch 27/30\n", - "473/487 [============================>.] - ETA: 0s - loss: 0.7556 - accuracy: 0.7467\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00027: val_loss improved from 0.76096 to 0.75936, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00027: val_loss improved from 0.76096 to 0.75936, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00027: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00027: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.7554 - accuracy: 0.7468 - val_loss: 0.7594 - val_accuracy: 0.7456\n", - "Epoch 28/30\n", - "486/487 [============================>.] - ETA: 0s - loss: 0.7538 - accuracy: 0.7473\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00028: val_loss improved from 0.75936 to 0.75812, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00028: val_loss improved from 0.75936 to 0.75812, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00028: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00028: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.7537 - accuracy: 0.7473 - val_loss: 0.7581 - val_accuracy: 0.7455\n", - "Epoch 29/30\n", - "472/487 [============================>.] - ETA: 0s - loss: 0.7521 - accuracy: 0.7477\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00029: val_loss improved from 0.75812 to 0.75593, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00029: val_loss improved from 0.75812 to 0.75593, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00029: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00029: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.7524 - accuracy: 0.7476 - val_loss: 0.7559 - val_accuracy: 0.7466\n", - "Epoch 30/30\n", - "476/487 [============================>.] - ETA: 0s - loss: 0.7508 - accuracy: 0.7480\n", - "***callbacks***\n", - "saving losses to model_3/losses.log\n", - "\n", - "Epoch 00030: val_loss improved from 0.75593 to 0.75478, saving model to model_3/KERAS_check_best_model.h5\n", - "\n", - "Epoch 00030: val_loss improved from 0.75593 to 0.75478, saving model to model_3/KERAS_check_best_model_weights.h5\n", - "\n", - "Epoch 00030: saving model to model_3/KERAS_check_model_last.h5\n", - "\n", - "Epoch 00030: saving model to model_3/KERAS_check_model_last_weights.h5\n", - "\n", - "Epoch 00030: saving model to model_3/KERAS_check_model_epoch30.h5\n", - "\n", - "***callbacks end***\n", - "\n", - "487/487 [==============================] - 2s 4ms/step - loss: 0.7506 - accuracy: 0.7481 - val_loss: 0.7548 - val_accuracy: 0.7471\n" - ] - } - ], - "source": [ - "train = True\n", - "if train:\n", - " adam = Adam(lr=0.0001)\n", - " model.compile(optimizer=adam, loss=['categorical_crossentropy'], metrics=['accuracy'])\n", - " callbacks = all_callbacks(stop_patience = 1000,\n", - " lr_factor = 0.5,\n", - " lr_patience = 10,\n", - " lr_epsilon = 0.000001,\n", - " lr_cooldown = 2,\n", - " lr_minimum = 0.0000001,\n", - " outputDir = 'model_3')\n", - " callbacks.callbacks.append(pruning_callbacks.UpdatePruningStep())\n", - " model.fit(X_train_val, y_train_val, batch_size=1024,\n", - " epochs=30, validation_split=0.25, shuffle=True,\n", - " callbacks = callbacks.callbacks)\n", - " # Save the model again but with the pruning 'stripped' to use the regular layer types\n", - " model = strip_pruning(model)\n", - " model.save('model_3/KERAS_check_best_model.h5')\n", - "else:\n", - " from tensorflow.keras.models import load_model\n", - " from qkeras.utils import _add_supported_quantized_objects\n", - " co = {}\n", - " _add_supported_quantized_objects(co)\n", - " model = load_model('model_3/KERAS_check_best_model.h5', custom_objects=co)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Check performance\n", - "How does this model which was trained using 6-bits, and 75% sparsity model compare against the original model? Let's report the accuracy and make a ROC curve. The quantized, pruned model is shown with solid lines, the unpruned model from part 1 is shown with dashed lines.\n", - "\n", - "\n", - "We should also check that hls4ml can respect the choice to use 6-bits throughout the model, and match the accuracy. We'll generate a configuration from this Quantized model, and plot its performance as the dotted line.\n", - "The generated configuration is printed out. You'll notice that it uses 7 bits for the type, but we specified 6!? That's just because QKeras doesn't count the sign-bit when we specify the number of bits, so the type that actually gets used needs 1 more.\n", - "\n", - "We also use the `OutputRoundingSaturationMode` optimizer pass of `hls4ml` to set the Activation layers to round, rather than truncate, the cast. This is important for getting good model accuracy when using small bit precision activations. And we'll set a different data type for the tables used in the Softmax, just for a bit of extra performance.\n", - "\n", - "\n", - "**Make sure you've trained the model from part 1**" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Interpreting Sequential\n", - "Topology:\n", - "Layer name: fc1_input, layer type: Input\n", - "Layer name: fc1, layer type: QDense\n", - "Layer name: relu1, layer type: QActivation\n", - "Layer name: fc2, layer type: QDense\n", - "Layer name: relu2, layer type: QActivation\n", - "Layer name: fc3, layer type: QDense\n", - "Layer name: relu3, layer type: QActivation\n", - "Layer name: output, layer type: QDense\n", - "Layer name: softmax, layer type: Activation\n", - "Interpreting Sequential\n", - "Topology:\n", - "Layer name: fc1_input, layer type: InputLayer, current shape: [[None, 16]]\n", - "Layer name: fc1, layer type: QDense, current shape: [[None, 16]]\n", - "Layer name: relu1, layer type: Activation, current shape: [[None, 64]]\n", - "Layer name: fc2, layer type: QDense, current shape: [[None, 64]]\n", - "Layer name: relu2, layer type: Activation, current shape: [[None, 32]]\n", - "Layer name: fc3, layer type: QDense, current shape: [[None, 32]]\n", - "Layer name: relu3, layer type: Activation, current shape: [[None, 32]]\n", - "Layer name: output, layer type: QDense, current shape: [[None, 32]]\n", - "Layer name: softmax, layer type: Softmax, current shape: [[None, 5]]\n", - "Creating HLS model\n", - "-----------------------------------\n", - "Model\n", - " Precision: ap_fixed<16,6>\n", - " ReuseFactor: 1\n", - " Strategy: Resource\n", - "-----------------------------------\n" - ] - } - ], - "source": [ - "import hls4ml\n", - "import plotting\n", - "'''\n", - "hls4ml.model.optimizer.OutputRoundingSaturationMode.layers = ['Activation']\n", - "hls4ml.model.optimizer.OutputRoundingSaturationMode.rounding_mode = 'AP_RND'\n", - "hls4ml.model.optimizer.OutputRoundingSaturationMode.saturation_mode = 'AP_SAT'\n", - "\n", - "config = hls4ml.utils.config_from_keras_model(model, granularity='name')\n", - "config['LayerName']['softmax']['exp_table_t'] = 'ap_fixed<18,8>'\n", - "config['LayerName']['softmax']['inv_table_t'] = 'ap_fixed<18,4>'\n", - "'''\n", - "config = hls4ml.utils.config_from_keras_model(model, granularity='model')\n", - "hls_model = hls4ml.converters.convert_from_keras_model(model,\n", - " hls_config=config,\n", - " output_dir='model_3/hls4ml_prj',\n", - " fpga_part='xcu250-figd2104-2L-e')\n", - "config['Model']['Strategy'] = \"Resource\"\n", - "print(\"-----------------------------------\")\n", - "plotting.print_dict(config)\n", - "print(\"-----------------------------------\")" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Writing HLS project\n", - "Done\n" - ] - } - ], - "source": [ - "hls_model.compile()\n", - "\n", - "y_qkeras = model.predict(np.ascontiguousarray(X_test))\n", - "y_hls = hls_model.predict(np.ascontiguousarray(X_test))" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Accuracy baseline: 0.7502530120481927\n", - "Accuracy pruned, quantized: 0.7456385542168674\n", - "Accuracy hls4ml: 0.6305783132530121\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "%matplotlib inline\n", - "from sklearn.metrics import accuracy_score\n", - "from tensorflow.keras.models import load_model\n", - "\n", - "model_ref = load_model('model_1/KERAS_check_best_model.h5')\n", - "y_ref = model_ref.predict(X_test)\n", - "\n", - "print(\"Accuracy baseline: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_ref, axis=1))))\n", - "print(\"Accuracy pruned, quantized: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_qkeras, axis=1))))\n", - "print(\"Accuracy hls4ml: {}\".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_hls, axis=1))))\n", - "\n", - "fig, ax = plt.subplots(figsize=(9, 9))\n", - "_ = plotting.makeRoc(y_test, y_ref, classes)\n", - "plt.gca().set_prop_cycle(None) # reset the colors\n", - "_ = plotting.makeRoc(y_test, y_qkeras, classes, linestyle='--')\n", - "plt.gca().set_prop_cycle(None) # reset the colors\n", - "_ = plotting.makeRoc(y_test, y_hls, classes, linestyle=':')\n", - "\n", - "from matplotlib.lines import Line2D\n", - "lines = [Line2D([0], [0], ls='-'),\n", - " Line2D([0], [0], ls='--'),\n", - " Line2D([0], [0], ls=':')]\n", - "from matplotlib.legend import Legend\n", - "leg = Legend(ax, lines, labels=['baseline', 'pruned, quantized', 'hls4ml'],\n", - " loc='lower right', frameon=False)\n", - "ax.add_artist(leg)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Synthesize\n", - "Now let's synthesize this quantized, pruned model.\n", - "\n", - "**The synthesis will take a while**\n", - "\n", - "While the C-Synthesis is running, we can monitor the progress looking at the log file by opening a terminal from the notebook home, and executing:\n", - "\n", - "`tail -f model_3/hls4ml_prj/vivado_hls.log`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "hls_model.build(csim=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Check the reports\n", - "Print out the reports generated by Vivado HLS. Pay attention to the Utilization Estimates' section in particular this time." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Found 1 solution(s) in model_3/hls4ml_prj/myproject_prj.\n", - "Reports for solution \"solution1\":\n", - "\n", - "C simulation report not found.\n", - "SYNTHESIS REPORT:\n", - "================================================================\n", - "== Vivado HLS Report for 'myproject'\n", - "================================================================\n", - "* Date: Thu Mar 4 12:27:48 2021\n", - "\n", - "* Version: 2019.2 (Build 2704478 on Wed Nov 06 22:10:23 MST 2019)\n", - "* Project: myproject_prj\n", - "* Solution: solution1\n", - "* Product family: virtexuplus\n", - "* Target device: xcu250-figd2104-2L-e\n", - "\n", - "\n", - "================================================================\n", - "== Performance Estimates\n", - "================================================================\n", - "+ Timing: \n", - " * Summary: \n", - " +--------+---------+----------+------------+\n", - " | Clock | Target | Estimated| Uncertainty|\n", - " +--------+---------+----------+------------+\n", - " |ap_clk | 5.00 ns | 3.965 ns | 0.62 ns |\n", - " +--------+---------+----------+------------+\n", - "\n", - "+ Latency: \n", - " * Summary: \n", - " +---------+---------+-----------+-----------+-----+-----+----------+\n", - " | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", - " | min | max | min | max | min | max | Type |\n", - " +---------+---------+-----------+-----------+-----+-----+----------+\n", - " | 9| 9| 45.000 ns | 45.000 ns | 1| 1| function |\n", - " +---------+---------+-----------+-----------+-----+-----+----------+\n", - "\n", - " + Detail: \n", - " * Instance: \n", - " +--------------------------------------------------------------------------------+---------------------------------------------------------------+---------+---------+-----------+-----------+-----+-----+----------+\n", - " | | | Latency (cycles) | Latency (absolute) | Interval | Pipeline |\n", - " | Instance | Module | min | max | min | max | min | max | Type |\n", - " +--------------------------------------------------------------------------------+---------------------------------------------------------------+---------+---------+-----------+-----------+-----+-----+----------+\n", - " |call_ret2_dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_1_fu_123 |dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_1 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " |call_ret4_dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_s_fu_191 |dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_s | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " |call_ret_dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_2_fu_227 |dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_2 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " |call_ret1_relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config4_s_fu_233 |relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config4_s | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " |call_ret6_dense_latency_ap_fixed_ap_fixed_config11_0_0_0_0_0_0_fu_301 |dense_latency_ap_fixed_ap_fixed_config11_0_0_0_0_0_0 | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " |call_ret3_relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config7_s_fu_328 |relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config7_s | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " |call_ret5_relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config10_s_fu_364 |relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config10_s | 0| 0| 0 ns | 0 ns | 1| 1| function |\n", - " |grp_softmax_latency_ap_fixed_ap_fixed_softmax_config13_s_fu_391 |softmax_latency_ap_fixed_ap_fixed_softmax_config13_s | 2| 2| 10.000 ns | 10.000 ns | 1| 1| function |\n", - " +--------------------------------------------------------------------------------+---------------------------------------------------------------+---------+---------+-----------+-----------+-----+-----+----------+\n", - "\n", - " * Loop: \n", - " N/A\n", - "\n", - "\n", - "\n", - "================================================================\n", - "== Utilization Estimates\n", - "================================================================\n", - "* Summary: \n", - "+---------------------+---------+-------+---------+---------+------+\n", - "| Name | BRAM_18K| DSP48E| FF | LUT | URAM |\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|DSP | -| -| -| -| -|\n", - "|Expression | -| -| 0| 6| -|\n", - "|FIFO | -| -| -| -| -|\n", - "|Instance | 4| 132| 93| 34819| -|\n", - "|Memory | -| -| -| -| -|\n", - "|Multiplexer | -| -| -| 36| -|\n", - "|Register | -| -| 4156| -| -|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Total | 4| 132| 4249| 34861| 0|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Available SLR | 1344| 3072| 864000| 432000| 320|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Utilization SLR (%) | ~0 | 4| ~0 | 8| 0|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Available | 5376| 12288| 3456000| 1728000| 1280|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "|Utilization (%) | ~0 | 1| ~0 | 2| 0|\n", - "+---------------------+---------+-------+---------+---------+------+\n", - "\n", - "+ Detail: \n", - " * Instance: \n", - " +--------------------------------------------------------------------------------+---------------------------------------------------------------+---------+-------+----+-------+-----+\n", - " | Instance | Module | BRAM_18K| DSP48E| FF | LUT | URAM|\n", - " +--------------------------------------------------------------------------------+---------------------------------------------------------------+---------+-------+----+-------+-----+\n", - " |call_ret2_dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_1_fu_123 |dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_1 | 0| 46| 0| 14034| 0|\n", - " |call_ret_dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_2_fu_227 |dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_2 | 0| 25| 0| 7863| 0|\n", - " |call_ret4_dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_s_fu_191 |dense_latency_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_s | 0| 48| 0| 8079| 0|\n", - " |call_ret6_dense_latency_ap_fixed_ap_fixed_config11_0_0_0_0_0_0_fu_301 |dense_latency_ap_fixed_ap_fixed_config11_0_0_0_0_0_0 | 0| 8| 0| 1433| 0|\n", - " |call_ret5_relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config10_s_fu_364 |relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config10_s | 0| 0| 0| 644| 0|\n", - " |call_ret1_relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config4_s_fu_233 |relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config4_s | 0| 0| 0| 1792| 0|\n", - " |call_ret3_relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config7_s_fu_328 |relu_ap_fixed_ap_fixed_16_6_5_3_0_relu_config7_s | 0| 0| 0| 896| 0|\n", - " |grp_softmax_latency_ap_fixed_ap_fixed_softmax_config13_s_fu_391 |softmax_latency_ap_fixed_ap_fixed_softmax_config13_s | 4| 5| 93| 78| 0|\n", - " +--------------------------------------------------------------------------------+---------------------------------------------------------------+---------+-------+----+-------+-----+\n", - " |Total | | 4| 132| 93| 34819| 0|\n", - " +--------------------------------------------------------------------------------+---------------------------------------------------------------+---------+-------+----+-------+-----+\n", - "\n", - "Co-simulation report not found.\n" - ] - } - ], - "source": [ - "hls4ml.report.read_vivado_report('model_3/hls4ml_prj')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Print the report for the model trained in part 1. Now, compared to the model from part 1, this model has been trained with low-precision quantization, and 75% pruning. You should be able to see that we have saved a lot of resource compared to where we started in part 1. At the same time, referring to the ROC curve above, the model performance is pretty much identical even with this drastic compression!\n", - "\n", - "**Note you need to have trained and synthesized the model from part 1**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "hls4ml.report.read_vivado_report('model_1/hls4ml_prj')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Print the report for the model trained in part 3. Both these models were trained with 75% sparsity, but the new model uses 6-bit precision as well. You can see how Vivado HLS has moved multiplication operations from DSPs into LUTs, reducing the \"critical\" resource usage.\n", - "\n", - "**Note you need to have trained and synthesized the model from part 3**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "hls4ml.report.read_vivado_report('model_2/hls4ml_prj')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## NB\n", - "Note as well that the Vivado HLS resource estimates tend to _overestimate_ LUTs, while generally estimating the DSPs correctly. Running the subsequent stages of FPGA compilation reveals the more realistic resource usage, You can run the next step, 'logic synthesis' with `hls_model.build(synth=True, vsynth=True)`, but we skipped it in this tutorial in the interest of time." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "hls_model.build(synth=True, vsynth=True)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.10" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/qconv2dbatchnorm_test/test_conv2dbatchnorm.py b/qconv2dbatchnorm_test/test_conv2dbatchnorm.py deleted file mode 100644 index 11f1acc9f7..0000000000 --- a/qconv2dbatchnorm_test/test_conv2dbatchnorm.py +++ /dev/null @@ -1,175 +0,0 @@ -import numpy as np -import random as rnd - -import tensorflow -from qkeras.utils import load_qmodel -from qkeras import QConv2DBatchnorm, QActivation, quantized_relu, QDense, quantized_bits, to_categorical, \ - QBatchNormalization, QConv2D -from tensorflow.keras.layers import * -from tensorflow.keras.models import Sequential, model_from_json -from tensorflow.keras.optimizers import Adam -from tensorflow.keras.regularizers import l1 - -import hls4ml -import yaml - -from notebooks.callbacks import all_callbacks - -from scipy.io import loadmat - -rnd.seed(42) -height = 32 -width = 32 -chan = 3 -input_shape = (height, width, chan) -num_classes = 5 -sparcity = 0. -int_bits = 6 - -model = Sequential() -model.add(Input(shape=input_shape)) -model.add(QConv2D(8, (3, 3), kernel_quantizer=quantized_bits(6, 0, alpha=1), - bias_quantizer=quantized_bits(6, 0, alpha=1), name='qconv2d')) -model.add((QBatchNormalization(name='qbatchnorm', beta_quantizer=quantized_bits(6, 0, alpha=1), - gamma_quantizer=quantized_bits(6, 0, alpha=1), - mean_quantizer=quantized_bits(6, 0, alpha=1), - variance_quantizer=quantized_bits(6, 0, alpha=1)))) -model.add(QActivation(activation=quantized_relu(6), name='relu1')) -model.add(QConv2DBatchnorm(16, (3, 3), kernel_quantizer=quantized_bits(6, 0, alpha=1), - bias_quantizer=quantized_bits(6, 0, alpha=1), name='qconv2dbatchnorm')) -model.add(QActivation(activation=quantized_relu(6), name='relu2')) -model.add(Flatten()) -model.add(QDense(10, name='output', - kernel_quantizer=quantized_bits(6, 0, alpha=1), bias_quantizer=quantized_bits(6, 0, alpha=1), - kernel_initializer='lecun_uniform', kernel_regularizer=l1(0.0001))) -model.add(Activation(activation='softmax', name='softmax')) -print(model.summary()) - -''' -# Generate some weights with some sparcity -for layer in model.layers: - old_weights = layer.get_weights() - if len(old_weights) > 0: - new_weights = [] - for w in old_weights: - print(layer.name, w.shape) - n_zeros = 0 - if sparcity > 0: - n_zeros = int(sparcity * np.prod(w.shape)) - if n_zeros > 0: - zero_indices = rnd.sample(range(1, np.prod(w.shape)), n_zeros) - else: - zero_indices = [] - new_w = [] - for i in range(np.prod(w.shape)): - if i in zero_indices: - new_w.append(0) - else: - #new_w.append(rnd.randint(1, 2**(int_bits - 1))) - #new_w.append(rnd.randint(1, 10)) - new_w.append(rnd.uniform(1, 3)) - new_w = np.asarray(new_w).reshape(w.shape) - new_weights.append(new_w) - layer.set_weights(new_weights) -''' - -train = loadmat('svhndataset/train_32x32.mat') -train_img = np.array(train['X']) -train_label = train['y'] -train_img = np.moveaxis(train_img, -1, 0) -train_label[train_label == 10] = 0 -train_img = train_img / 255.0 - -train_label = to_categorical(train_label) - -train = False -if train: - adam = Adam(lr=0.0001) - model.compile(optimizer=adam, loss=['categorical_crossentropy'], metrics=['accuracy']) - callbacks = all_callbacks(stop_patience=1000, - lr_factor=0.5, - lr_patience=10, - lr_epsilon=0.000001, - lr_cooldown=2, - lr_minimum=0.0000001, - outputDir='model') - model.fit(train_img, train_label, batch_size=1024, - epochs=1, validation_split=0.25, shuffle=True, - callbacks=callbacks.callbacks) - model.save('model/KERAS_check_best_model.h5') -else: - model = load_qmodel('model/KERAS_check_best_model.h5') - -# Let's test it out -# np.random.seed(42) - -# predictions = model.predict(x) -# print(predictions.flatten()) -# Save it -model.save('dummy_conv2dbatchnorm.h5') -# model_json = model.to_json() -# with open("dummy_cnn.json", "w") as json_file: -# json_file.write(model_json) -# model.save_weights("dummy_cnn_weights.h5") -# Now hls4ml-ify it -yaml_config = {} - -# yaml_config['KerasH5'] = '/home/vloncar/work/CERN/FPGA/hls4ml/example-models/dummy_cnn/dummy_cnn.h5' -yaml_config['KerasModel'] = model -yaml_config['OutputDir'] = '/home/nicolo/CERN-working-dir/hls4ml/qconv2dbatchnorm_test/hls' -yaml_config['ProjectName'] = 'myproject' -yaml_config['XilinxPart'] = 'xcvu9p-flgb2104-2-e' -yaml_config['ClockPeriod'] = 5 -# yaml_config['IOType'] = 'io_parallel' -yaml_config['IOType'] = 'io_stream' -yaml_config['HLSConfig'] = { - 'Model': { - 'Precision': 'ap_fixed<16,6>', - 'ReuseFactor': 1, - 'Strategy': 'Resource' - }, - # 'LayerName': { - # 'conv2d_3': {'Strategy': 'Resource', 'ReuseFactor': 100}, - # 'conv2d_4': {'Strategy': 'Resource', 'ReuseFactor': 100}, - # 'conv2d_6': {'Strategy': 'Resource', 'ReuseFactor': 100}, - # 'conv2d_7': {'Strategy': 'Resource', 'ReuseFactor': 100}, - # 'conv2d_8': {'Strategy': 'Resource', 'ReuseFactor': 100}, - # } -} -# Convert it -config = hls4ml.utils.config.config_from_keras_model(model, granularity='name') -config['SkipOptimizers'] = ['FuseBatchNormalization'] -hls_model = hls4ml.converters.convert_from_keras_model(model, hls_config=config) -# hls_model = hls4ml.converters.keras_to_hls(yaml_config) -# Test it -np.random.seed(42) # We need this again -# x = np.random.rand(np.prod(model.input.shape[1:])).reshape(model.input.shape[1:]) -hls_model.write() -hls_model.compile() - -# x = np.random.rand(np.prod(input_shape)).reshape(input_shape) -x = np.ones(np.prod(input_shape)).reshape(input_shape) -x = np.expand_dims(x, axis=0) - -y = hls_model.predict(x) -y_ = model.predict(x) - -hls_weights = hls_model.graph.get('qconv2dbatchnorm').weights.get('weight').data_unquantized -mod_weights = model.layers[3].get_folded_weights()[0] - -hls_bias = hls_model.graph.get('qconv2dbatchnorm').weights.get('bias').data_unquantized -mod_bias = model.layers[3].get_folded_weights()[1] - -if tensorflow.equal(hls_weights, mod_weights).numpy().all(): - print('Weights OK!') - -if tensorflow.equal(hls_bias, mod_bias).numpy().all(): - print('Bias OK!') - -print(y) -print(y_) -# Build it -# report = hls_model.build(csim=True, synth=True, cosim=False, reset=True) -# hls4ml.report.read_vivado_report(yaml_config['OutputDir']) -# report = hls4ml.report.parse_vivado_report(yaml_config['OutputDir']) -# print(report) \ No newline at end of file From dade7de828aa1721d2a9dc7fb3b4f5b48ce04331 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ghielmetti?= Date: Tue, 9 Mar 2021 10:58:08 +0100 Subject: [PATCH 004/102] Fixed problems emerged from PR discussion. --- .gitignore | 1 - hls4ml/converters/keras/core.py | 2 +- hls4ml/model/hls_layers.py | 93 +++++------------------------ hls4ml/templates/vivado_template.py | 34 +---------- 4 files changed, 18 insertions(+), 112 deletions(-) diff --git a/.gitignore b/.gitignore index e25160c340..3701aa1376 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,6 @@ sdist/ *.egg-info/ vivado_prj .vscode -my-hls-test *.tar.gz docs/_build docs/autodoc/* \ No newline at end of file diff --git a/hls4ml/converters/keras/core.py b/hls4ml/converters/keras/core.py index 9db324129f..b9fd86e42f 100644 --- a/hls4ml/converters/keras/core.py +++ b/hls4ml/converters/keras/core.py @@ -103,7 +103,7 @@ def parse_activation_layer(keras_layer, input_names, input_shapes, data_reader, @keras_handler('BatchNormalization') def parse_batchnorm_layer(keras_layer, input_names, input_shapes, data_reader, config): - assert('batchnorm' in keras_layer['class_name'].lower()) + assert('BatchNormalization' in keras_layer['class_name'] or 'QConv2DBatchnorm' in keras_layer['class_name']) layer = parse_default_keras_layer(keras_layer, input_names) diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index 4aed293d28..dd28e06246 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -6,8 +6,6 @@ import numpy as np from collections import OrderedDict -from tensorflow.python.ops import math_ops - class Quantizer(object): def __init__(self, bits, hls_type): @@ -452,16 +450,14 @@ def make_stream_variable(self, shape, dim_names, var_name='layer{index}_out', ty return StreamVariable(shape, dim_names, var_name=var_name, type_name=type_name, precision=precision, n_pack=pack_factor, depth=depth, index=self.index) def add_weights(self, quantizer=None, compression=False, data=None): - if data is None: - data = self.model.get_weights_data(self.name, 'kernel') + data = self.model.get_weights_data(self.name, 'kernel') self.add_weights_variable(name='weight', var_name='w{index}', data=data, quantizer=quantizer, compression=compression) def add_bias(self, quantizer=None, data=None): precision = None type_name = None - if data is None: - data = self.model.get_weights_data(self.name, 'bias') + data = self.model.get_weights_data(self.name, 'bias') if data is None: data = np.zeros(self.get_output_variable().shape[-1]) precision = IntegerPrecisionType(width=1, signed=False) @@ -903,7 +899,7 @@ def config_cpp(self): return mult_config + '\n' + conv_config -class Conv2DBatchnorm(Layer): +class Conv2DBatchnorm(Conv2D): def _get_folded_weights(self): """ Function to get the batchnorm folded weights. @@ -921,7 +917,7 @@ def _get_folded_weights(self): moving_mean = self.model.get_weights_data(self.name, 'moving_mean') moving_variance = self.model.get_weights_data(self.name, 'moving_variance') # get the inversion factor so that we replace division by multiplication - inv = math_ops.rsqrt(moving_variance + self.get_attr('epsilon')) + inv = np.reciprocal(np.sqrt(moving_variance + self.get_attr('epsilon'))) if gamma is not None: inv *= gamma @@ -932,80 +928,23 @@ def _get_folded_weights(self): return [folded_kernel, folded_bias] def initialize(self): - if self.get_attr('data_format') == 'channels_last': - shape = [self.attributes['out_height'], self.attributes['out_width'], self.attributes['n_filt']] - dims = ['OUT_HEIGHT_{}'.format(self.index), 'OUT_WIDTH_{}'.format(self.index), - 'N_FILT_{}'.format(self.index)] - else: - shape = [self.attributes['n_filt'], self.attributes['out_height'], self.attributes['out_width']] - dims = ['N_FILT_{}'.format(self.index), 'OUT_HEIGHT_{}'.format(self.index), - 'OUT_WIDTH_{}'.format(self.index)] - folded_kernel, folded_bias = self._get_folded_weights() - self.add_output_variable(shape, dims) - self.add_weights(quantizer=self.get_attr('weight_quantizer'), data=folded_kernel) - self.add_bias(quantizer=self.get_attr('bias_quantizer'), data=folded_bias) - if self.model.config.is_resource_strategy(self): - self.set_attr('strategy', 'resource') - if self.model.config.backend.name == 'Vivado': - self.model.config.backend.set_closest_reuse_factor(self) - self.weights['weight'].data = np.transpose(self.weights['weight'].data, - axes=[3, 2, 0, 1]) # (H,W,C,F) => (F,C,H,W) + super(Conv2DBatchnorm, self).initialize() + folded_weights, folded_bias = self._get_folded_weights() + if self.model.config.is_resource_strategy(self) and self.model.config.backend.name == 'Vivado': + self.weights['weight'].data_unquantized = np.transpose(folded_weights, axes=[3, 2, 0, 1]) + self.weights['weight'].data = self.get_attr('weight_quantizer')(self.weights['weight'].data_unquantized) + else: - self.set_attr('strategy', 'latency') + self.weights['weight'].data_unquantized = folded_weights + self.weights['weight'].data = self.get_attr('weight_quantizer')(folded_weights) + self.weights['bias'].data_unquantized = folded_bias + self.weights['bias'].data = self.get_attr('bias_quantizer')(folded_bias) def function_cpp(self): - params = self._default_function_params() - params['data_format'] = 'cf' if self.get_attr('data_format') == 'channels_first' else 'cl' - params['w'] = self.get_weights('weight').name - params['b'] = self.get_weights('bias').name - - return [self._function_template.format(**params)] + return super(Conv2DBatchnorm, self).function_cpp() def config_cpp(self): - params = self._default_config_params() - if self.get_attr('data_format') == 'channels_last': - params['in_height'] = self.get_input_variable().dim_names[0] - params['in_width'] = self.get_input_variable().dim_names[1] - params['n_chan'] = self.get_input_variable().dim_names[2] - params['out_height'] = self.get_output_variable().dim_names[0] - params['out_width'] = self.get_output_variable().dim_names[1] - params['n_filt'] = self.get_output_variable().dim_names[2] - else: - params['n_chan'] = self.get_input_variable().dim_names[0] - params['in_height'] = self.get_input_variable().dim_names[1] - params['in_width'] = self.get_input_variable().dim_names[2] - params['n_filt'] = self.get_output_variable().dim_names[0] - params['out_height'] = self.get_output_variable().dim_names[1] - params['out_width'] = self.get_output_variable().dim_names[2] - params['dilation'] = self.get_attr('dilation', 1) - params['nzeros'] = self.get_weights('weight').nzeros - - if self.model.config.get_config_value('IOType') == 'io_stream': - min_h, min_w, instructions = self.model.config.backend.compute_conv2d_instructions( - self.get_input_variable().shape[0], - self.get_input_variable().shape[1], - self.get_input_variable().shape[2], - params['filt_height'], - params['stride_height']) - instructions_str = ','.join(str(i) for i in instructions) - params['min_height'] = min_h - params['min_width'] = min_w - params['instructions'] = instructions_str - else: - params['min_height'] = params['in_height'] - params['min_width'] = params['in_width'] - params['instructions'] = '0' - - params['config_t'] = 'config{}_mult'.format(self.index) - conv_config = self._config_template[0].format(**params) - - mult_params = self._default_config_params() - mult_params['n_in'] = self.get_attr('n_chan') * self.get_attr('filt_height') * self.get_attr('filt_width') - mult_params['n_out'] = self.get_attr('n_filt') - mult_params['product_type'] = self.model.config.backend.product_type(self.get_input_variable().type.precision, self.get_weights('weight').type.precision) - mult_config = self._config_template[1].format(**mult_params) - - return mult_config + '\n' + conv_config + return super(Conv2DBatchnorm, self).config_cpp() class SeparableConv2D(Layer): def initialize(self): diff --git a/hls4ml/templates/vivado_template.py b/hls4ml/templates/vivado_template.py index edd9d00bb4..01697b007b 100644 --- a/hls4ml/templates/vivado_template.py +++ b/hls4ml/templates/vivado_template.py @@ -101,36 +101,6 @@ }}; const ap_uint config{index}::pixels[] = {{{instructions}}};\n""" -conv2dbatchnorm_config_template = """struct config{index} : nnet::conv2d_config {{ - static const unsigned pad_top = {pad_top}; - static const unsigned pad_bottom = {pad_bottom}; - static const unsigned pad_left = {pad_left}; - static const unsigned pad_right = {pad_right}; - static const unsigned in_height = {in_height}; - static const unsigned in_width = {in_width}; - static const unsigned n_chan = {n_chan}; - static const unsigned filt_height = {filt_height}; - static const unsigned filt_width = {filt_width}; - static const unsigned kernel_size = filt_height * filt_width; - static const unsigned n_filt = {n_filt}; - static const unsigned stride_height = {stride_height}; - static const unsigned stride_width = {stride_width}; - static const unsigned out_height = {out_height}; - static const unsigned out_width = {out_width}; - static const unsigned reuse_factor = {reuse}; - static const unsigned n_zeros = {nzeros}; - static const bool store_weights_in_bram = false; - static const unsigned strategy = nnet::{strategy}; - static const unsigned min_height = {min_height}; - static const unsigned min_width = {min_width}; - static const ap_uint pixels[min_height * min_width]; - typedef {accum_t} accum_t; - typedef {bias_t} bias_t; - typedef {weight_t} weight_t; - typedef {config_t} mult_config; -}}; -const ap_uint config{index}::pixels[] = {{{instructions}}};\n""" - sepconv_config_template = """struct config{index} {{ typedef {depthwise_config} depthwise_config; typedef {pointwise_config} pointwise_config; @@ -366,7 +336,6 @@ batchnorm_function_template = 'nnet::normalize<{input_t}, {output_t}, {config}>({input}, {output}, {scale}, {bias});' conv1d_function_template = 'nnet::conv_1d_{data_format}<{input_t}, {output_t}, {config}>({input}, {output}, {w}, {b});' conv2d_function_template = 'nnet::conv_2d_{data_format}<{input_t}, {output_t}, {config}>({input}, {output}, {w}, {b});' -conv2dbatchnorm_function_template = 'nnet::conv_2d_{data_format}<{input_t}, {output_t}, {config}>({input}, {output}, {w}, {b});' sepconv1d_function_template = 'nnet::separable_conv_1d_{data_format}<{input_t}, {output_t}, {config}>({input}, {output}, {d}, {p}, {z}, {b});' sepconv2d_function_template = 'nnet::separable_conv_2d_{data_format}<{input_t}, {output_t}, {config}>({input}, {output}, {d}, {p}, {z}, {b});' depthconv2d_function_template = 'nnet::depthwise_conv_2d_{data_format}<{input_t}, {output_t}, {config}>({input}, {output}, {w}, {b});' @@ -388,7 +357,6 @@ batchnorm_include_list = ['nnet_utils/nnet_batchnorm.h', 'nnet_utils/nnet_batchnorm_stream.h'] conv1d_include_list = ['nnet_utils/nnet_conv1d.h', 'nnet_utils/nnet_conv1d_stream.h'] conv2d_include_list = ['nnet_utils/nnet_conv2d.h', 'nnet_utils/nnet_conv2d_stream.h'] -conv2dbatchnorm_include_list = ['nnet_utils/nnet_conv2d.h', 'nnet_utils/nnet_conv2d_stream.h'] sepconv1d_include_list = ['nnet_utils/nnet_conv1d.h', 'nnet_utils/nnet_sepconv1d_stream.h'] sepconv2d_include_list = ['nnet_utils/nnet_conv2d.h', 'nnet_utils/nnet_sepconv2d_stream.h'] activ_include_list = ['nnet_utils/nnet_activation.h', 'nnet_utils/nnet_activation_stream.h'] @@ -407,7 +375,7 @@ def __init__(self): self.register_templates('BatchNormalization' , batchnorm_function_template, batchnorm_config_template, batchnorm_include_list) self.register_templates('Conv1D' , conv1d_function_template, [conv1d_config_template, conv_mult_config_template], conv1d_include_list) self.register_templates('Conv2D' , conv2d_function_template, [conv2d_config_template, conv_mult_config_template], conv2d_include_list) - self.register_templates('Conv2DBatchnorm' , conv2dbatchnorm_function_template, [conv2dbatchnorm_config_template, conv_mult_config_template], conv2dbatchnorm_include_list) + self.register_templates('Conv2DBatchnorm' , conv2d_function_template, [conv2d_config_template, conv_mult_config_template], conv2d_include_list) self.register_templates('SeparableConv1D' , sepconv1d_function_template, [sepconv_config_template, conv1d_config_template, conv1d_config_template, conv_mult_config_template, conv_mult_config_template], sepconv1d_include_list) self.register_templates('SeparableConv2D' , sepconv2d_function_template, [sepconv_config_template, conv2d_config_template, conv2d_config_template, conv_mult_config_template, conv_mult_config_template], sepconv2d_include_list) self.register_templates('DepthwiseConv2D' , depthconv2d_function_template, [conv2d_config_template, conv_mult_config_template], sepconv2d_include_list) From ae5afbf5bb2eaba5292541efef0175fe228d8924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ghielmetti?= Date: Tue, 9 Mar 2021 11:24:19 +0100 Subject: [PATCH 005/102] Fixed problems emerged from PR discussion. --- .gitignore | 3 ++- hls4ml/converters/keras/qkeras_layers.py | 14 +++++++------- hls4ml/model/hls_layers.py | 9 ++++----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 3701aa1376..0e7755576a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ sdist/ *.egg-info/ vivado_prj .vscode +my-hls-test *.tar.gz docs/_build -docs/autodoc/* \ No newline at end of file +docs/autodoc/* diff --git a/hls4ml/converters/keras/qkeras_layers.py b/hls4ml/converters/keras/qkeras_layers.py index 1e220e89db..52edd61a4b 100644 --- a/hls4ml/converters/keras/qkeras_layers.py +++ b/hls4ml/converters/keras/qkeras_layers.py @@ -12,8 +12,8 @@ @keras_handler('QDense') def parse_qdense_layer(keras_layer, input_names, input_shapes, data_reader, config): - - + + layer, output_shape = parse_dense_layer(keras_layer, input_names, input_shapes, data_reader, config) layer['weight_quantizer'] = get_quantizer_from_config(keras_layer, 'kernel') @@ -28,7 +28,7 @@ def parse_qdense_layer(keras_layer, input_names, input_shapes, data_reader, conf @keras_handler('QConv1D', 'QConv2D') def parse_qconv_layer(keras_layer, input_names, input_shapes, data_reader, config): assert('QConv' in keras_layer['class_name']) - + if "1D" in keras_layer['class_name']: layer, output_shape = parse_conv1d_layer(keras_layer, input_names, input_shapes, data_reader, config) elif "2D" in keras_layer['class_name']: @@ -39,7 +39,7 @@ def parse_qconv_layer(keras_layer, input_names, input_shapes, data_reader, confi layer['bias_quantizer'] = get_quantizer_from_config(keras_layer, 'bias') else: layer['bias_quantizer'] = None - + return layer, output_shape @@ -47,7 +47,7 @@ def parse_qconv_layer(keras_layer, input_names, input_shapes, data_reader, confi def parse_qactivation_layer(keras_layer, input_names, input_shapes, data_reader, config): assert(keras_layer['class_name'] == 'QActivation') supported_activations = ['quantized_relu', 'quantized_tanh', 'binary_tanh', 'ternary_tanh', 'quantized_bits', 'binary', 'ternary'] - + layer = parse_default_keras_layer(keras_layer, input_names) activation_config = keras_layer['config']['activation'] @@ -77,7 +77,7 @@ def parse_qactivation_layer(keras_layer, input_names, input_shapes, data_reader, activation_config['config']['integer'] = 2 else: activation_config['class_name'] = 'unknown' - + if activation_config['class_name'] not in supported_activations: raise Exception('Unsupported QKeras activation: {}'.format(activation_config['class_name'])) @@ -90,7 +90,7 @@ def parse_qactivation_layer(keras_layer, input_names, input_shapes, data_reader, @keras_handler('QBatchNormalization') def parse_qbatchnorm_layer(keras_layer, input_names, input_shapes, data_reader, config): - + layer, output_shape = parse_batchnorm_layer(keras_layer, input_names, input_shapes, data_reader, config) layer['mean_quantizer'] = get_quantizer_from_config(keras_layer, 'mean') diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index dd28e06246..fc8e974f1c 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -449,15 +449,15 @@ def make_stream_variable(self, shape, dim_names, var_name='layer{index}_out', ty return StreamVariable(shape, dim_names, var_name=var_name, type_name=type_name, precision=precision, n_pack=pack_factor, depth=depth, index=self.index) - def add_weights(self, quantizer=None, compression=False, data=None): + def add_weights(self, quantizer=None, compression=False): data = self.model.get_weights_data(self.name, 'kernel') self.add_weights_variable(name='weight', var_name='w{index}', data=data, quantizer=quantizer, compression=compression) - def add_bias(self, quantizer=None, data=None): + def add_bias(self, quantizer=None): + data = self.model.get_weights_data(self.name, 'bias') precision = None type_name = None - data = self.model.get_weights_data(self.name, 'bias') if data is None: data = np.zeros(self.get_output_variable().shape[-1]) precision = IntegerPrecisionType(width=1, signed=False) @@ -892,8 +892,7 @@ def config_cpp(self): mult_params = self._default_config_params() mult_params['n_in'] = self.get_attr('n_chan') * self.get_attr('filt_height') * self.get_attr('filt_width') mult_params['n_out'] = self.get_attr('n_filt') - mult_params['product_type'] = self.model.config.backend.product_type(self.get_input_variable().type.precision, - self.get_weights('weight').type.precision) + mult_params['product_type'] = self.model.config.backend.product_type(self.get_input_variable().type.precision, self.get_weights('weight').type.precision) mult_config = self._config_template[1].format(**mult_params) return mult_config + '\n' + conv_config From 02f92e2f145fe1b089377412275b451d723aa8be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ghielmetti?= Date: Tue, 9 Mar 2021 11:27:04 +0100 Subject: [PATCH 006/102] Fixed problems emerged from PR discussion. --- .gitignore | 2 +- hls4ml/model/hls_layers.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 0e7755576a..e25160c340 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,4 @@ vivado_prj my-hls-test *.tar.gz docs/_build -docs/autodoc/* +docs/autodoc/* \ No newline at end of file diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index fc8e974f1c..010b60c039 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -6,7 +6,6 @@ import numpy as np from collections import OrderedDict - class Quantizer(object): def __init__(self, bits, hls_type): self.bits = bits From b8290391434fe720d2c63baa743cb1816407b705 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ghielmetti?= Date: Tue, 9 Mar 2021 11:32:46 +0100 Subject: [PATCH 007/102] Fixed problems emerged from PR discussion. --- hls4ml/templates/vivado_template.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hls4ml/templates/vivado_template.py b/hls4ml/templates/vivado_template.py index 01697b007b..7fa64e0e67 100644 --- a/hls4ml/templates/vivado_template.py +++ b/hls4ml/templates/vivado_template.py @@ -395,7 +395,7 @@ def __init__(self): self.register_templates('Resize' , resize_function_template, resize_config_template, resize_include_list) self.register_templates('Transpose' , transpose_function_template, transpose_config_template, transpose_include_list) self.register_templates('GarNet' , garnet_function_template, garnet_config_template, garnet_include_list) - self.register_templates('GarNetStack' , garnet_stack_function_template,garnet_stack_config_template, garnet_include_list) + self.register_templates('GarNetStack' , garnet_stack_function_template,garnet_stack_config_template, garnet_include_list) def get_valid_reuse_factors(self, layer): n_in = 0 From 20d9a6211003808764efc34f148757a405d681a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ghielmetti?= Date: Wed, 10 Mar 2021 23:05:48 +0100 Subject: [PATCH 008/102] Some improvements + testing if weights are provided already folded. --- hls4ml/converters/keras/convolution.py | 4 ---- hls4ml/converters/keras/qkeras_layers.py | 7 +++++-- hls4ml/converters/keras_to_hls.py | 2 +- hls4ml/model/hls_layers.py | 2 ++ 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/hls4ml/converters/keras/convolution.py b/hls4ml/converters/keras/convolution.py index 78cf55907a..2fc1967f18 100644 --- a/hls4ml/converters/keras/convolution.py +++ b/hls4ml/converters/keras/convolution.py @@ -84,8 +84,4 @@ def parse_conv2d_layer(keras_layer, input_names, input_shapes, data_reader, conf output_shape = [input_shapes[0][0], layer['n_filt'], layer['out_height'], layer['out_width']] else: output_shape = [input_shapes[0][0], layer['out_height'], layer['out_width'], layer['n_filt']] - if layer['class_name'] == 'QConv2DBatchnorm': - intermediate_shape = list() - intermediate_shape.append(output_shape) - output_shape = intermediate_shape return layer, output_shape diff --git a/hls4ml/converters/keras/qkeras_layers.py b/hls4ml/converters/keras/qkeras_layers.py index 52edd61a4b..f7e817a628 100644 --- a/hls4ml/converters/keras/qkeras_layers.py +++ b/hls4ml/converters/keras/qkeras_layers.py @@ -103,6 +103,9 @@ def parse_qbatchnorm_layer(keras_layer, input_names, input_shapes, data_reader, @keras_handler('QConv2DBatchnorm') def parse_qconv2dbatchnorm_layer(keras_layer, input_names, input_shapes, data_reader, config): - conv_layer, intermediate_shape = parse_qconv_layer(keras_layer, input_names, input_shapes, data_reader, config) - batch_layer, out_shape = parse_batchnorm_layer(keras_layer, input_names, intermediate_shape, data_reader, config) + intermediate_shape = list() + conv_layer, shape_qconv = parse_qconv_layer(keras_layer, input_names, input_shapes, data_reader, config) + intermediate_shape.append(shape_qconv) + temp_shape = intermediate_shape + batch_layer, out_shape = parse_batchnorm_layer(keras_layer, input_names, temp_shape, data_reader, config) return {**conv_layer, **batch_layer}, out_shape diff --git a/hls4ml/converters/keras_to_hls.py b/hls4ml/converters/keras_to_hls.py index 22e09f8b62..5cc43f24c4 100644 --- a/hls4ml/converters/keras_to_hls.py +++ b/hls4ml/converters/keras_to_hls.py @@ -124,7 +124,7 @@ def parse_default_keras_layer(keras_layer, input_names): return layer def parse_data_format(input_shape, data_format='channels_last'): - if input_shape[0] is None: + if len(input_shape) == 4 or input_shape[0] is None: # Ignore batch size input_shape = input_shape[1:] diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index 010b60c039..78eaf9f103 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -927,6 +927,7 @@ def _get_folded_weights(self): def initialize(self): super(Conv2DBatchnorm, self).initialize() + ''' folded_weights, folded_bias = self._get_folded_weights() if self.model.config.is_resource_strategy(self) and self.model.config.backend.name == 'Vivado': self.weights['weight'].data_unquantized = np.transpose(folded_weights, axes=[3, 2, 0, 1]) @@ -937,6 +938,7 @@ def initialize(self): self.weights['weight'].data = self.get_attr('weight_quantizer')(folded_weights) self.weights['bias'].data_unquantized = folded_bias self.weights['bias'].data = self.get_attr('bias_quantizer')(folded_bias) + ''' def function_cpp(self): return super(Conv2DBatchnorm, self).function_cpp() From 6e6afab0a106d5cecb1cf42a498ed5d7770aa252 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ghielmetti?= Date: Fri, 12 Mar 2021 14:36:30 +0100 Subject: [PATCH 009/102] Added support for `QConv2DBatchnorm` with `use_bias=False`. --- hls4ml/model/hls_layers.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index 78eaf9f103..f7fd20f538 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -908,6 +908,8 @@ def _get_folded_weights(self): """ kernel = self.model.get_weights_data(self.name, 'kernel') bias = self.model.get_weights_data(self.name, 'bias') + if bias is None: + bias = 0 # get batchnorm weights and moving stats gamma = self.model.get_weights_data(self.name, 'gamma') @@ -927,7 +929,6 @@ def _get_folded_weights(self): def initialize(self): super(Conv2DBatchnorm, self).initialize() - ''' folded_weights, folded_bias = self._get_folded_weights() if self.model.config.is_resource_strategy(self) and self.model.config.backend.name == 'Vivado': self.weights['weight'].data_unquantized = np.transpose(folded_weights, axes=[3, 2, 0, 1]) @@ -937,8 +938,9 @@ def initialize(self): self.weights['weight'].data_unquantized = folded_weights self.weights['weight'].data = self.get_attr('weight_quantizer')(folded_weights) self.weights['bias'].data_unquantized = folded_bias - self.weights['bias'].data = self.get_attr('bias_quantizer')(folded_bias) - ''' + bias_q = self.get_attr('bias_quantizer') + if bias_q is not None: + self.weights['bias'].data = bias_q(folded_bias) def function_cpp(self): return super(Conv2DBatchnorm, self).function_cpp() From 7649a8029e544eaa4062fdb4937ef3efd6d99a8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ghielmetti?= Date: Fri, 19 Mar 2021 22:45:36 +0100 Subject: [PATCH 010/102] Removing the check on batch size. "" -> ''. --- hls4ml/converters/keras/convolution.py | 3 ++- hls4ml/converters/keras/qkeras_layers.py | 4 ++-- hls4ml/converters/keras_to_hls.py | 5 ++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/hls4ml/converters/keras/convolution.py b/hls4ml/converters/keras/convolution.py index 2fc1967f18..57c224dd4f 100644 --- a/hls4ml/converters/keras/convolution.py +++ b/hls4ml/converters/keras/convolution.py @@ -84,4 +84,5 @@ def parse_conv2d_layer(keras_layer, input_names, input_shapes, data_reader, conf output_shape = [input_shapes[0][0], layer['n_filt'], layer['out_height'], layer['out_width']] else: output_shape = [input_shapes[0][0], layer['out_height'], layer['out_width'], layer['n_filt']] - return layer, output_shape + + return layer, output_shape \ No newline at end of file diff --git a/hls4ml/converters/keras/qkeras_layers.py b/hls4ml/converters/keras/qkeras_layers.py index f7e817a628..cbab83fe7f 100644 --- a/hls4ml/converters/keras/qkeras_layers.py +++ b/hls4ml/converters/keras/qkeras_layers.py @@ -29,9 +29,9 @@ def parse_qdense_layer(keras_layer, input_names, input_shapes, data_reader, conf def parse_qconv_layer(keras_layer, input_names, input_shapes, data_reader, config): assert('QConv' in keras_layer['class_name']) - if "1D" in keras_layer['class_name']: + if '1D' in keras_layer['class_name']: layer, output_shape = parse_conv1d_layer(keras_layer, input_names, input_shapes, data_reader, config) - elif "2D" in keras_layer['class_name']: + elif '2D' in keras_layer['class_name']: layer, output_shape = parse_conv2d_layer(keras_layer, input_names, input_shapes, data_reader, config) layer['weight_quantizer'] = get_quantizer_from_config(keras_layer, 'kernel') diff --git a/hls4ml/converters/keras_to_hls.py b/hls4ml/converters/keras_to_hls.py index 5cc43f24c4..2437ed0f26 100644 --- a/hls4ml/converters/keras_to_hls.py +++ b/hls4ml/converters/keras_to_hls.py @@ -124,9 +124,8 @@ def parse_default_keras_layer(keras_layer, input_names): return layer def parse_data_format(input_shape, data_format='channels_last'): - if len(input_shape) == 4 or input_shape[0] is None: - # Ignore batch size - input_shape = input_shape[1:] + # Ignore batch size + input_shape = input_shape[1:] if data_format.lower() == 'channels_last': if len(input_shape) == 2: # 1D, (n_in, n_filt) From a1d86b81706dad3764852ad810247e0f9c58756d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ghielmetti?= Date: Tue, 23 Mar 2021 02:07:52 +0100 Subject: [PATCH 011/102] Last updates before merging PR. --- hls4ml/converters/keras/convolution.py | 2 +- hls4ml/model/hls_layers.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hls4ml/converters/keras/convolution.py b/hls4ml/converters/keras/convolution.py index 57c224dd4f..3d038489b8 100644 --- a/hls4ml/converters/keras/convolution.py +++ b/hls4ml/converters/keras/convolution.py @@ -85,4 +85,4 @@ def parse_conv2d_layer(keras_layer, input_names, input_shapes, data_reader, conf else: output_shape = [input_shapes[0][0], layer['out_height'], layer['out_width'], layer['n_filt']] - return layer, output_shape \ No newline at end of file + return layer, output_shape diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index f7fd20f538..b3e5d24bfe 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -931,7 +931,7 @@ def initialize(self): super(Conv2DBatchnorm, self).initialize() folded_weights, folded_bias = self._get_folded_weights() if self.model.config.is_resource_strategy(self) and self.model.config.backend.name == 'Vivado': - self.weights['weight'].data_unquantized = np.transpose(folded_weights, axes=[3, 2, 0, 1]) + self.weights['weight'].data_unquantized = np.transpose(folded_weights, axes=[3, 0, 1, 2]) self.weights['weight'].data = self.get_attr('weight_quantizer')(self.weights['weight'].data_unquantized) else: From aa246b83ccbbb78077704f5f0b46b121dc58e822 Mon Sep 17 00:00:00 2001 From: Vladimir Loncar Date: Fri, 6 Aug 2021 19:41:36 +0200 Subject: [PATCH 012/102] HLS implementation of Concatenate for io_stream --- .../vivado/nnet_utils/nnet_merge_stream.h | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) diff --git a/hls4ml/templates/vivado/nnet_utils/nnet_merge_stream.h b/hls4ml/templates/vivado/nnet_utils/nnet_merge_stream.h index 14242fb433..e7a02ce9e6 100644 --- a/hls4ml/templates/vivado/nnet_utils/nnet_merge_stream.h +++ b/hls4ml/templates/vivado/nnet_utils/nnet_merge_stream.h @@ -176,6 +176,129 @@ void minimum( } } +template +void concatenate3d_0( + hls::stream &data1, + hls::stream &data2, + hls::stream &res) +{ + ConcatLoopHeight1: for (int i = 0; i < CONFIG_T::n_elem1_0; i++) { + ConcatLoopWidth1: for (int j = 0; j < CONFIG_T::n_elem1_1; j++) { + #pragma HLS PIPELINE II=1 + + input1_T in_data1 = data1.read(); + res_T out_data; + #pragma HLS DATA_PACK variable=out_data + + ConcatPackInput1: for (int k = 0; k < input1_T::size; k++) { + #pragma HLS UNROLL + out_data[k] = in_data1[k]; + } + + res.write(out_data); + } + } + ConcatLoopHeight2: for (int i = 0; i < CONFIG_T::n_elem2_0; i++) { + ConcatLoopWidth2: for (int j = 0; j < CONFIG_T::n_elem2_1; j++) { + #pragma HLS PIPELINE II=1 + + input2_T in_data2 = data2.read(); + res_T out_data; + #pragma HLS DATA_PACK variable=out_data + + ConcatPackInput2: for (int k = 0; k < input2_T::size; k++) { + #pragma HLS UNROLL + out_data[k] = in_data2[k]; + } + + res.write(out_data); + } + } +} + +template +void concatenate3d_1( + hls::stream &data1, + hls::stream &data2, + hls::stream &res) +{ + ConcatLoopHeight: for (int i = 0; i < CONFIG_T::n_elem1_0; i++) { + ConcatLoopWidth1: for (int j = 0; j < CONFIG_T::n_elem1_1; j++) { + #pragma HLS PIPELINE II=1 + + input1_T in_data1 = data1.read(); + res_T out_data; + #pragma HLS DATA_PACK variable=out_data + + ConcatPackInput1: for (int k = 0; k < input1_T::size; k++) { + #pragma HLS UNROLL + out_data[k] = in_data1[k]; + } + + res.write(out_data); + } + ConcatLoopWidth2: for (int j = 0; j < CONFIG_T::n_elem2_1; j++) { + #pragma HLS PIPELINE II=1 + + input2_T in_data2 = data2.read(); + res_T out_data; + #pragma HLS DATA_PACK variable=out_data + + ConcatPackInput2: for (int k = 0; k < input2_T::size; k++) { + #pragma HLS UNROLL + out_data[k] = in_data2[k]; + } + + res.write(out_data); + } + } +} + +template +void concatenate3d_2( + hls::stream &data1, + hls::stream &data2, + hls::stream &res) +{ + ConcatLoopHeight: for (int i = 0; i < CONFIG_T::n_elem1_0; i++) { + ConcatLoopWidth: for (int j = 0; j < CONFIG_T::n_elem1_1; j++) { + #pragma HLS PIPELINE II=1 + + input1_T in_data1 = data1.read(); + input2_T in_data2 = data2.read(); + res_T out_data; + #pragma HLS DATA_PACK variable=out_data + + ConcatPackInput1: for (int k = 0; k < input1_T::size; k++) { + #pragma HLS UNROLL + out_data[k] = in_data1[k]; + } + + ConcatPackInput2: for (int k = 0; k < input2_T::size; k++) { + #pragma HLS UNROLL + out_data[input1_T::size + k] = in_data2[k]; + } + + res.write(out_data); + } + } +} + +template +void concatenate3d( + hls::stream &data1, + hls::stream &data2, + hls::stream &res) +{ + if (CONFIG_T::axis == 3 || CONFIG_T::axis == -1) { + concatenate3d_2(data1, data2, res); + } else if (CONFIG_T::axis == 2 || CONFIG_T::axis == -2) { + concatenate3d_1(data1, data2, res); + } else { + concatenate3d_0(data1, data2, res); + } +} + } #endif From bee6c058b896f2a471c99f4480688e27cd082811 Mon Sep 17 00:00:00 2001 From: Vladimir Loncar Date: Fri, 6 Aug 2021 19:42:08 +0200 Subject: [PATCH 013/102] Fix concatenate3d_2 for io_parallel --- .../templates/vivado/nnet_utils/nnet_merge.h | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/hls4ml/templates/vivado/nnet_utils/nnet_merge.h b/hls4ml/templates/vivado/nnet_utils/nnet_merge.h index 2ee4dae514..48a5e172d3 100644 --- a/hls4ml/templates/vivado/nnet_utils/nnet_merge.h +++ b/hls4ml/templates/vivado/nnet_utils/nnet_merge.h @@ -56,7 +56,7 @@ struct concat_config { template void add( input1_T data1[CONFIG_T::n_elem], - input2_T data2[CONFIG_T::n_elem], + input2_T data2[CONFIG_T::n_elem], res_T res[CONFIG_T::n_elem]) { for (int ii=0; ii void subtract( input1_T data1[CONFIG_T::n_elem], - input2_T data2[CONFIG_T::n_elem], + input2_T data2[CONFIG_T::n_elem], res_T res[CONFIG_T::n_elem]) { for (int ii=0; ii void multiply( input1_T data1[CONFIG_T::n_elem], - input2_T data2[CONFIG_T::n_elem], + input2_T data2[CONFIG_T::n_elem], res_T res[CONFIG_T::n_elem]) { for (int ii=0; ii void average( input1_T data1[CONFIG_T::n_elem], - input2_T data2[CONFIG_T::n_elem], + input2_T data2[CONFIG_T::n_elem], res_T res[CONFIG_T::n_elem]) { for (int ii=0; ii void maximum( input1_T data1[CONFIG_T::n_elem], - input2_T data2[CONFIG_T::n_elem], + input2_T data2[CONFIG_T::n_elem], res_T res[CONFIG_T::n_elem]) { for (int ii=0; ii void minimum( input1_T data1[CONFIG_T::n_elem], - input2_T data2[CONFIG_T::n_elem], + input2_T data2[CONFIG_T::n_elem], res_T res[CONFIG_T::n_elem]) { for (int ii=0; ii void dot1d( input1_T data1[CONFIG_T::n_in], - input2_T data2[CONFIG_T::n_in], + input2_T data2[CONFIG_T::n_in], res_T res[CONFIG_T::n_out]) { #pragma HLS PIPELINE II=CONFIG_T::reuse_factor @@ -152,7 +152,7 @@ void dot1d( template void concatenate1d( input1_T data1[CONFIG_T::n_elem1_0], - input2_T data2[CONFIG_T::n_elem2_0], + input2_T data2[CONFIG_T::n_elem2_0], res_T res[CONFIG_T::n_elem1_0 + CONFIG_T::n_elem2_0]) { for (int ii=0; ii void concatenate2d_0( input1_T data1[CONFIG_T::n_elem1_0 * CONFIG_T::n_elem1_1], - input2_T data2[CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1], + input2_T data2[CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1], res_T res[CONFIG_T::n_elem1_0 * CONFIG_T::n_elem1_1 + CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1]) { for (int ii=0; ii void concatenate2d_1( input1_T data1[CONFIG_T::n_elem1_0 * CONFIG_T::n_elem1_1], - input2_T data2[CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1], + input2_T data2[CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1], res_T res[CONFIG_T::n_elem1_0 * CONFIG_T::n_elem1_1 + CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1]) { for (int ii=0; ii void concatenate2d( input1_T data1[CONFIG_T::n_elem1_0 * CONFIG_T::n_elem1_1], - input2_T data2[CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1], + input2_T data2[CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1], res_T res[CONFIG_T::n_elem1_0 * CONFIG_T::n_elem1_1 + CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1]) { if (CONFIG_T::axis == 2 || CONFIG_T::axis == -1) { @@ -209,7 +209,7 @@ void concatenate2d( template void concatenate3d_0( input1_T data1[CONFIG_T::n_elem1_0 * CONFIG_T::n_elem1_1 * CONFIG_T::n_elem1_2], - input2_T data2[CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1 * CONFIG_T::n_elem2_2], + input2_T data2[CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1 * CONFIG_T::n_elem2_2], res_T res[CONFIG_T::n_elem1_0 * CONFIG_T::n_elem1_1 * CONFIG_T::n_elem1_2 + CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1 * CONFIG_T::n_elem2_2]) { for (int ii=0; ii void concatenate3d_1( input1_T data1[CONFIG_T::n_elem1_0 * CONFIG_T::n_elem1_1 * CONFIG_T::n_elem1_2], - input2_T data2[CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1 * CONFIG_T::n_elem2_2], + input2_T data2[CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1 * CONFIG_T::n_elem2_2], res_T res[CONFIG_T::n_elem1_0 * CONFIG_T::n_elem1_1 * CONFIG_T::n_elem1_2 + CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1 * CONFIG_T::n_elem2_2]) { for (int ii=0; ii void concatenate3d_2( -input1_T data1[CONFIG_T::n_elem1_0 * CONFIG_T::n_elem1_1 * CONFIG_T::n_elem1_2], - input2_T data2[CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1 * CONFIG_T::n_elem2_2], + input1_T data1[CONFIG_T::n_elem1_0 * CONFIG_T::n_elem1_1 * CONFIG_T::n_elem1_2], + input2_T data2[CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1 * CONFIG_T::n_elem2_2], res_T res[CONFIG_T::n_elem1_0 * CONFIG_T::n_elem1_1 * CONFIG_T::n_elem1_2 + CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1 * CONFIG_T::n_elem2_2]) { for (int ii=0; ii void concatenate3d( input1_T data1[CONFIG_T::n_elem1_0 * CONFIG_T::n_elem1_1 * CONFIG_T::n_elem1_2], - input2_T data2[CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1 * CONFIG_T::n_elem2_2], + input2_T data2[CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1 * CONFIG_T::n_elem2_2], res_T res[CONFIG_T::n_elem1_0 * CONFIG_T::n_elem1_1 * CONFIG_T::n_elem1_2 + CONFIG_T::n_elem2_0 * CONFIG_T::n_elem2_1 * CONFIG_T::n_elem2_2]) { if (CONFIG_T::axis == 3 || CONFIG_T::axis == -1) { From 810e2d5ac267404c79603ee3bcbd23f9ce773790 Mon Sep 17 00:00:00 2001 From: Vladimir Loncar Date: Tue, 10 Aug 2021 16:19:40 +0200 Subject: [PATCH 014/102] Support overriding stream depth in config --- hls4ml/model/hls_layers.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index 3c8ae9de5c..7697bff76e 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -446,6 +446,8 @@ def make_array_variable(self, shape, dim_names, var_name='layer{index}_out', typ def make_stream_variable(self, shape, dim_names, var_name='layer{index}_out', type_name='layer{index}_t', precision=None, depth=0): pack_factor = self.model.config.get_layer_config_value(self, 'PackFactor', default=1) + if depth == 0: + depth = self.model.config.get_layer_config_value(self, 'StreamDepth', default=0) return StreamVariable(shape, dim_names, var_name=var_name, type_name=type_name, precision=precision, n_pack=pack_factor, depth=depth, index=self.index) From 59e3766ba786e99c4768818e4d517d1a8493604d Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Thu, 2 Sep 2021 10:28:55 +0200 Subject: [PATCH 015/102] Added a first version of build_prj.tcl that is able to generate the .vcd file. Next step -> add the parser, find the max for each fifo and set the new fifo depth --- hls4ml/templates/vivado/build_prj.tcl | 76 ++++++++++++++++++++++ hls4ml/writer/vivado_accelerator_writer.py | 5 +- 2 files changed, 80 insertions(+), 1 deletion(-) diff --git a/hls4ml/templates/vivado/build_prj.tcl b/hls4ml/templates/vivado/build_prj.tcl index 0ec992cd4c..18936cbb91 100644 --- a/hls4ml/templates/vivado/build_prj.tcl +++ b/hls4ml/templates/vivado/build_prj.tcl @@ -11,6 +11,73 @@ array set opt { vsynth 0 } +set tcldir [file dirname [info script]] +source [file join $tcldir project.tcl] + +proc add_vcd_instructions_tcl {} { + set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}] + + set filename myproject_prj/solution1/sim/verilog/myproject_axi.tcl + set temp $filename.new.$timestamp + # set backup $filename.bak.$timestamp + + set in [open $filename r] + set out [open $temp w] + + # line-by-line, read the original file + while {[gets $in line] != -1} { + if {[string equal "$line" "log_wave -r /"]} { + set line {log_wave -r / +open_vcd +# log_vcd [get_objects -r -regexp [get_scopes -regexp {layer(\d*)_.*data_(\d*)_V_U.*}]\/usedw] +log_vcd *} + } + if {[string equal "$line" "quit"]} { + set line {flush_vcd +close_vcd +quit +} + } + # then write the transformed line + puts $out $line + } + + close $in + close $out + + # move the new data to the proper filename + file delete -force $filename + file rename -force $temp $filename +} + +proc add_vcd_instructions_xsim {} { + set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}] + + set filename myproject_prj/solution1/sim/verilog/run_xsim.sh + set temp $filename.new.$timestamp + # set backup $filename.bak.$timestamp + + set in [open $filename r] + set out [open $temp w] + + # line-by-line, read the original file + while {[gets $in line] != -1} { + if {[string match *bin/xsim* $line]} { + append line " -vcdfile simulation.vcd" + } + # then write the transformed line + puts $out $line + } + + close $in + close $out + + # move the new data to the proper filename + file delete -force $filename + file rename -force $temp $filename + exec chmod +x $filename +} + foreach arg $::argv { foreach o [lsort [array names opt]] { regexp "$o=+(\\w+)" $arg unused opt($o) @@ -92,6 +159,15 @@ if {$opt(cosim)} { add_files -tb myproject_test.cpp -cflags "-std=c++0x -DRTL_SIM" set time_start [clock clicks -milliseconds] cosim_design -trace_level all + if {$fifo_opt} { + puts "FIFO OPT" + add_vcd_instructions_xsim + add_vcd_instructions_tcl + set old_pwd [pwd] + cd myproject_prj/solution1/sim/verilog/ + exec vivado_hls run_sim.tcl #todo + cd $old_pwd + } set time_end [clock clicks -milliseconds] puts "INFO:" puts [read [open myproject_prj/solution1/sim/report/myproject_cosim.rpt r]] diff --git a/hls4ml/writer/vivado_accelerator_writer.py b/hls4ml/writer/vivado_accelerator_writer.py index c5206e002d..9aefa80611 100644 --- a/hls4ml/writer/vivado_accelerator_writer.py +++ b/hls4ml/writer/vivado_accelerator_writer.py @@ -196,7 +196,9 @@ def modify_build_script(self, model): fout = open(newfile, 'w') for line in f.readlines(): - if 'set_top' in line: + if 'set filename myproject_prj/solution1/sim/verilog/myproject.tcl' in line: + newline = line[:-5] + '_axi\n' + elif 'set_top' in line: newline = line[:-1] + '_axi\n' # remove the newline from the line end and append _axi for the new top newline += 'add_files firmware/{}_axi.cpp -cflags "-std=c++0x"\n'.format( model.config.get_project_name()) @@ -324,6 +326,7 @@ def write_board_script(self, model): in_bit, out_bit = self.vivado_accelerator_config.get_io_bitwidth() f.write('set bit_width_hls_output {}\n'.format(in_bit)) f.write('set bit_width_hls_input {}\n'.format(out_bit)) + f.write('set fifo_opt 1') # todo: hardcoded! should be deducted from the config f.close() def write_driver(self, model): From 306e381c7ec54aec0fc273947f1d50ff86e6cc1e Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Thu, 2 Sep 2021 12:07:13 +0200 Subject: [PATCH 016/102] Fixed the assignment of the unassigned `inp` variable --- hls4ml/model/hls_layers.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index 6fe4ffb0fb..e80b4b9fb1 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -1247,6 +1247,7 @@ def config_cpp(self): class ZeroPadding1D(Layer): def initialize(self): + inp = self.get_input_variable() if self.get_attr('data_format') == 'channels_last': shape = [self.attributes['out_width'], self.attributes['n_chan']] dims = ['OUT_WIDTH_{}'.format(self.index), 'N_CHAN_{}'.format(self.index)] @@ -1275,6 +1276,7 @@ def config_cpp(self): class ZeroPadding2D(Layer): def initialize(self): + inp = self.get_input_variable() if self.get_attr('data_format') == 'channels_last': shape = [self.attributes['out_height'], self.attributes['out_width'], self.attributes['n_chan']] dims = ['OUT_HEIGHT_{}'.format(self.index), 'OUT_WIDTH_{}'.format(self.index), 'N_CHAN_{}'.format(self.index)] @@ -1510,6 +1512,7 @@ def config_cpp(self): class Resize(Layer): def initialize(self): + inp = self.get_input_variable() shape = [self.get_attr('out_height'), self.get_attr('out_width'), self.get_attr('n_chan')] dims = ['OUT_HEIGHT_{}'.format(self.index), 'OUT_WIDTH_{}'.format(self.index), 'N_CHAN_{}'.format(self.index)] self.add_output_variable(shape, dims, precision=inp.type.precision) From da2c46aaef747f5616348b70e484a06632bfb559 Mon Sep 17 00:00:00 2001 From: Sioni Summers Date: Fri, 24 Sep 2021 16:31:52 +0200 Subject: [PATCH 017/102] Bump version --- hls4ml/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hls4ml/__init__.py b/hls4ml/__init__.py index 7c450cd347..0e55ee713e 100644 --- a/hls4ml/__init__.py +++ b/hls4ml/__init__.py @@ -1,6 +1,6 @@ from __future__ import absolute_import -__version__ = '0.5.1' +__version__ = '0.6.0' from hls4ml import converters from hls4ml import report From 707dba50d462d71f9a001606540b9bfbab8fc32b Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Mon, 27 Sep 2021 11:10:18 +0200 Subject: [PATCH 018/102] First version of the optimization flow automated. Tested with ENet model. --- hls4ml/model/profiling.py | 88 +++++++++++++++++++--- hls4ml/templates/vivado/build_prj.tcl | 57 ++++++-------- hls4ml/writer/vivado_accelerator_writer.py | 22 +++++- 3 files changed, 118 insertions(+), 49 deletions(-) diff --git a/hls4ml/model/profiling.py b/hls4ml/model/profiling.py index 1c8ff0ded9..c5f6785130 100644 --- a/hls4ml/model/profiling.py +++ b/hls4ml/model/profiling.py @@ -1,3 +1,6 @@ +from pyDigitalWaveTools.vcd.parser import VcdParser + +import hls4ml from hls4ml.model.hls_model import HLSModel from hls4ml.model.hls_layers import IntegerPrecisionType, FixedPrecisionType import matplotlib.pyplot as plt @@ -26,6 +29,67 @@ __torch_profiling_enabled__ = False +def optimize_fifos_depth(model, reset=False, csim=True, synth=True, cosim=False, validation=False, export=False, vsynth=False): + + values = [] + + def populate_values(name, data, depth): + values.append({'name': name, 'data': [], 'max': 0, 'depth': 0}) + get_values = lambda x: int(x[1][1:], 2) + values[-1]['data'] = [get_values(x) for x in data] + values[-1]['max'] = max(values[-1]['data']) + values[-1]['depth'] = int(depth[1:], 2) + + if not model.config.config['HLSConfig']['Model']['FIFO_opt']: + raise Exception('To use this optimization you have to set `FIFO_opt` field to True in the HLS config') + + with open(model.config.get_output_dir() + '/' + model.config.get_project_name() + '_prj' + '/solution1/sim/verilog/fifo_opt.vcd') as vcd_file: + vcd = VcdParser() + vcd.parse(vcd_file) + data = vcd.scope.toJson() + + # input/output fifos: should it be considered just for VivadoAccelerator? + # yes, to be considered just with vivado accelerator + for i in range(1, len(data['children'][0]['children'][0]['children'])): + populate_values(data['children'][0]['children'][0]['children'][i]['name'], + data['children'][0]['children'][0]['children'][i]['children'][0]['data'], + data['children'][0]['children'][0]['children'][i]['children'][1]['data'][0][1]) + + # model layers fifos + n_elem = len(data['children'][0]['children'][0]['children'][0]['children']) + for i in range(n_elem): + populate_values(data['children'][0]['children'][0]['children'][0]['children'][i]['name'], + data['children'][0]['children'][0]['children'][0]['children'][i]['children'][0]['data'], + data['children'][0]['children'][0]['children'][0]['children'][i]['children'][1]['data'][0][1]) + + maxs = [{'name': i['name'], 'max': i['max'], 'depth': i['depth']} for i in values] + + with open('max_depth.json', 'w') as f: + json.dump(maxs, f, indent=4) + + new_config = model.config.config.copy()['HLSConfig'] + new_config['FIFO_opt'] = False + for k,v in model.output_vars.items(): + filtered_max = [x['max'] for x in maxs if v.cppname in x['name']] + if len(filtered_max) == 0: continue # @todo: how to handle in_local and out_local? + if k not in new_config['LayerName']: + new_config['LayerName'][k] = {'StreamDepth': filtered_max[0] + 1} + else: + new_config['LayerName'][k]['StreamDepth'] = filtered_max[0] + 1 + for x in maxs: + if 'in_local' in x['name']: + new_config['LayerName']['in_local'] = {'StreamDepth': x['max']} + elif 'out_local' in x['name']: + new_config['LayerName']['out_local'] = {'StreamDepth': x['max']} + out_dir = model.config.get_output_dir() + '_FIFO_OPT' + hls_model = hls4ml.converters.convert_from_keras_model(model.config.config['KerasModel'], output_dir=out_dir, io_type=model.config.config['IOType'], + board=model.config.config['Board'], hls_config=new_config, + backend=model.config.config['Backend']) + hls_model.build(reset=reset, csim=csim, synth=synth, cosim=cosim, validation=validation, export=export, vsynth=vsynth) + print('FIFO optimization completed!') + return hls_model, out_dir + + def get_unoptimized_hlsmodel(model): from hls4ml.converters import convert_from_config @@ -161,7 +225,7 @@ def types_histogram(data, fmt='longform'): def ap_fixed_WIF(dtype): from hls4ml.templates.vivado_template import VivadoBackend - dtype = VivadoBackend.convert_precision_string(None, dtype) + dtype = VivadoBackend.convert_precision_string(None, dtype) W, I, F = dtype.width, dtype.integer, dtype.fractional return W, I, F @@ -565,9 +629,9 @@ def get_ymodel_keras(keras_model, X): dictionary A dictionary in the form {"layer_name": ouput array of layer} """ - + ymodel = {} - + for layer in keras_model.layers: print("Processing {} in Keras model...".format(layer.name)) if not _is_ignored_layer(layer): @@ -575,23 +639,23 @@ def get_ymodel_keras(keras_model, X): #Note that if the layer is a standalone activation layer then skip this if hasattr(layer, 'activation') and not (isinstance(layer,keras.layers.Activation) or isinstance(layer, qkeras.qlayers.QActivation)): if layer.activation: - + if layer.activation.__class__.__name__ == "linear": ymodel[layer.name] = _get_output(layer, X, keras_model.input) - + else: temp_activation = layer.activation layer.activation = None #Get output for layer without activation ymodel[layer.name] = _get_output(layer, X, keras_model.input) - #Add the activation back + #Add the activation back layer.activation = temp_activation #Get ouput for activation ymodel[layer.name + "_{}".format(temp_activation.__class__.__name__)] = _get_output(layer, X, keras_model.input) else: ymodel[layer.name] = _get_output(layer, X, keras_model.input) - else: + else: ymodel[layer.name] = _get_output(layer, X, keras_model.input) print("Done taking outputs for Keras model.") return ymodel @@ -599,10 +663,10 @@ def get_ymodel_keras(keras_model, X): def _norm_diff(ymodel, ysim): """Calculate the square root of the sum of the squares of the differences""" diff = {} - + for key in list(ysim.keys()): diff[key] = np.linalg.norm(ysim[key]-ymodel[key]) - + #---Bar Plot--- f, ax = plt.subplots() plt.bar(list(diff.keys()),list(diff.values())) @@ -642,7 +706,7 @@ def _dist_diff(ymodel, ysim): #---Box Plot--- f, ax = plt.subplots() - pos = np.array(range(len(list(diff.values())))) + 1 + pos = np.array(range(len(list(diff.values())))) + 1 ax.boxplot(list(diff.values()), sym='k+', positions=pos) #--formatting @@ -681,12 +745,12 @@ def compare(keras_model, hls_model, X, plot_type = "dist_diff"): matplotlib figure plot object of the histogram depicting the difference in each layer's output """ - + #Take in output from both models #Note that each y is a dictionary with structure {"layer_name": flattened ouput array} ymodel = get_ymodel_keras(keras_model, X) _, ysim = hls_model.trace(X) - + print("Plotting difference...") f = plt.figure() if plot_type == "norm_diff": diff --git a/hls4ml/templates/vivado/build_prj.tcl b/hls4ml/templates/vivado/build_prj.tcl index 18936cbb91..27c7e3c741 100644 --- a/hls4ml/templates/vivado/build_prj.tcl +++ b/hls4ml/templates/vivado/build_prj.tcl @@ -28,10 +28,26 @@ proc add_vcd_instructions_tcl {} { while {[gets $in line] != -1} { if {[string equal "$line" "log_wave -r /"]} { set line {log_wave -r / -open_vcd -# log_vcd [get_objects -r -regexp [get_scopes -regexp {layer(\d*)_.*data_(\d*)_V_U.*}]\/usedw] -log_vcd *} +current_scope /apatb_myproject_axi_top/AESL_inst_myproject_axi/myproject_U0 +set scopes [get_scopes -regexp {layer(\d*)_.*data_0_V_U.*}] +current_scope /apatb_myproject_axi_top/AESL_inst_myproject_axi +append scopes { } +append scopes [get_scopes -regexp {.*local_V_data_0.*}] +open_vcd fifo_opt.vcd +foreach scope $scopes { + current_scope $scope + set usedw [get_objects usedw] + set depth [get_objects DEPTH] + add_wave $usedw + log_vcd $usedw + log_wave $usedw + add_wave $depth + log_vcd $depth + log_wave $depth + } + } } + if {[string equal "$line" "quit"]} { set line {flush_vcd close_vcd @@ -50,34 +66,6 @@ quit file rename -force $temp $filename } -proc add_vcd_instructions_xsim {} { - set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}] - - set filename myproject_prj/solution1/sim/verilog/run_xsim.sh - set temp $filename.new.$timestamp - # set backup $filename.bak.$timestamp - - set in [open $filename r] - set out [open $temp w] - - # line-by-line, read the original file - while {[gets $in line] != -1} { - if {[string match *bin/xsim* $line]} { - append line " -vcdfile simulation.vcd" - } - # then write the transformed line - puts $out $line - } - - close $in - close $out - - # move the new data to the proper filename - file delete -force $filename - file rename -force $temp $filename - exec chmod +x $filename -} - foreach arg $::argv { foreach o [lsort [array names opt]] { regexp "$o=+(\\w+)" $arg unused opt($o) @@ -158,15 +146,16 @@ if {$opt(cosim)} { # TODO: This is a workaround (Xilinx defines __RTL_SIMULATION__ only for SystemC testbenches). add_files -tb myproject_test.cpp -cflags "-std=c++0x -DRTL_SIM" set time_start [clock clicks -milliseconds] - cosim_design -trace_level all if {$fifo_opt} { puts "FIFO OPT" - add_vcd_instructions_xsim + cosim_design -trace_level all -setup add_vcd_instructions_tcl set old_pwd [pwd] cd myproject_prj/solution1/sim/verilog/ - exec vivado_hls run_sim.tcl #todo + source run_sim.tcl cd $old_pwd + } else { + cosim_design -trace_level all } set time_end [clock clicks -milliseconds] puts "INFO:" diff --git a/hls4ml/writer/vivado_accelerator_writer.py b/hls4ml/writer/vivado_accelerator_writer.py index 9aefa80611..afa9ed3203 100644 --- a/hls4ml/writer/vivado_accelerator_writer.py +++ b/hls4ml/writer/vivado_accelerator_writer.py @@ -98,8 +98,21 @@ def write_axi_wrapper(self, model): elif io_type == 'io_stream': newline += indent + 'hls::stream<' + inp.type.name + '> in_local("input_1");\n' newline += indent + 'hls::stream<' + out.type.name + '> out_local("output_1");\n\n' - newline += indent + '#pragma HLS STREAM variable=in_local depth=N_IN\n' - newline += indent + '#pragma HLS STREAM variable=out_local depth=N_OUT\n' + in_local_depth = 0 + out_local_depth = 0 + try: + in_local_depth = model.config.config['HLSConfig']['LayerName']['in_local']['StreamDepth'] + out_local_depth = model.config.config['HLSConfig']['LayerName']['out_local']['StreamDepth'] + except KeyError: + pass + if in_local_depth: + newline += indent + '#pragma HLS STREAM variable=in_local depth={}\n'.format(in_local_depth) + else: + newline += indent + '#pragma HLS STREAM variable=in_local depth=N_IN\n' + if out_local_depth: + newline += indent + '#pragma HLS STREAM variable=out_local depth={}\n'.format(out_local_depth) + else: + newline += indent + '#pragma HLS STREAM variable=out_local depth=N_OUT\n' elif '//hls-fpga-machine-learning insert call' in line: newline = indent + '{}(in_local, out_local, in_size, out_size);\n'.format( model.config.get_project_name()) @@ -326,7 +339,10 @@ def write_board_script(self, model): in_bit, out_bit = self.vivado_accelerator_config.get_io_bitwidth() f.write('set bit_width_hls_output {}\n'.format(in_bit)) f.write('set bit_width_hls_input {}\n'.format(out_bit)) - f.write('set fifo_opt 1') # todo: hardcoded! should be deducted from the config + if model.config.config['HLSConfig'].get('FIFO_opt'): + f.write('set fifo_opt 1') + else: + f.write('set fifo_opt 0') f.close() def write_driver(self, model): From ee4733ba12f1fdc8f6b32d889a1d2a0e68c849cd Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Mon, 27 Sep 2021 16:48:16 +0200 Subject: [PATCH 019/102] Fixing minor issues --- hls4ml/model/profiling.py | 2 +- hls4ml/writer/vivado_accelerator_writer.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hls4ml/model/profiling.py b/hls4ml/model/profiling.py index c5f6785130..72dec311d6 100644 --- a/hls4ml/model/profiling.py +++ b/hls4ml/model/profiling.py @@ -68,7 +68,7 @@ def populate_values(name, data, depth): json.dump(maxs, f, indent=4) new_config = model.config.config.copy()['HLSConfig'] - new_config['FIFO_opt'] = False + new_config['FIFO_opt'] = 0 for k,v in model.output_vars.items(): filtered_max = [x['max'] for x in maxs if v.cppname in x['name']] if len(filtered_max) == 0: continue # @todo: how to handle in_local and out_local? diff --git a/hls4ml/writer/vivado_accelerator_writer.py b/hls4ml/writer/vivado_accelerator_writer.py index afa9ed3203..a95ce5cff0 100644 --- a/hls4ml/writer/vivado_accelerator_writer.py +++ b/hls4ml/writer/vivado_accelerator_writer.py @@ -339,7 +339,7 @@ def write_board_script(self, model): in_bit, out_bit = self.vivado_accelerator_config.get_io_bitwidth() f.write('set bit_width_hls_output {}\n'.format(in_bit)) f.write('set bit_width_hls_input {}\n'.format(out_bit)) - if model.config.config['HLSConfig'].get('FIFO_opt'): + if model.config.config['HLSConfig']['Model'].get('FIFO_opt'): f.write('set fifo_opt 1') else: f.write('set fifo_opt 0') From 93cca6c9db47fcae6e3fc7b806fd9f015ba556a3 Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Mon, 27 Sep 2021 18:17:22 +0200 Subject: [PATCH 020/102] Fixing minor issues --- hls4ml/model/profiling.py | 2 +- hls4ml/writer/vivado_accelerator_writer.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hls4ml/model/profiling.py b/hls4ml/model/profiling.py index 72dec311d6..f8782bc401 100644 --- a/hls4ml/model/profiling.py +++ b/hls4ml/model/profiling.py @@ -68,7 +68,7 @@ def populate_values(name, data, depth): json.dump(maxs, f, indent=4) new_config = model.config.config.copy()['HLSConfig'] - new_config['FIFO_opt'] = 0 + new_config['Model']['FIFO_opt'] = 0 for k,v in model.output_vars.items(): filtered_max = [x['max'] for x in maxs if v.cppname in x['name']] if len(filtered_max) == 0: continue # @todo: how to handle in_local and out_local? diff --git a/hls4ml/writer/vivado_accelerator_writer.py b/hls4ml/writer/vivado_accelerator_writer.py index a95ce5cff0..171c18fd87 100644 --- a/hls4ml/writer/vivado_accelerator_writer.py +++ b/hls4ml/writer/vivado_accelerator_writer.py @@ -106,11 +106,11 @@ def write_axi_wrapper(self, model): except KeyError: pass if in_local_depth: - newline += indent + '#pragma HLS STREAM variable=in_local depth={}\n'.format(in_local_depth) + newline += indent + '#pragma HLS STREAM variable=in_local depth={}\n'.format(in_local_depth+1) else: newline += indent + '#pragma HLS STREAM variable=in_local depth=N_IN\n' if out_local_depth: - newline += indent + '#pragma HLS STREAM variable=out_local depth={}\n'.format(out_local_depth) + newline += indent + '#pragma HLS STREAM variable=out_local depth={}\n'.format(out_local_depth+1) else: newline += indent + '#pragma HLS STREAM variable=out_local depth=N_OUT\n' elif '//hls-fpga-machine-learning insert call' in line: From 14fa32d69c0b642ef2b860914390082bb1e8d1db Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Tue, 28 Sep 2021 22:52:35 +0200 Subject: [PATCH 021/102] Fixing minor issues --- hls4ml/model/profiling.py | 8 ++--- hls4ml/templates/vivado/build_prj.tcl | 37 ++++++++++++++++------ hls4ml/writer/vivado_accelerator_writer.py | 4 +-- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/hls4ml/model/profiling.py b/hls4ml/model/profiling.py index f8782bc401..acb7a2ecbe 100644 --- a/hls4ml/model/profiling.py +++ b/hls4ml/model/profiling.py @@ -64,7 +64,7 @@ def populate_values(name, data, depth): maxs = [{'name': i['name'], 'max': i['max'], 'depth': i['depth']} for i in values] - with open('max_depth.json', 'w') as f: + with open(model.config.get_output_dir() + '/max_depth.json', 'w') as f: json.dump(maxs, f, indent=4) new_config = model.config.config.copy()['HLSConfig'] @@ -78,15 +78,15 @@ def populate_values(name, data, depth): new_config['LayerName'][k]['StreamDepth'] = filtered_max[0] + 1 for x in maxs: if 'in_local' in x['name']: - new_config['LayerName']['in_local'] = {'StreamDepth': x['max']} + new_config['LayerName']['in_local'] = {'StreamDepth': x['max']+1} elif 'out_local' in x['name']: - new_config['LayerName']['out_local'] = {'StreamDepth': x['max']} + new_config['LayerName']['out_local'] = {'StreamDepth': x['max']+1} out_dir = model.config.get_output_dir() + '_FIFO_OPT' hls_model = hls4ml.converters.convert_from_keras_model(model.config.config['KerasModel'], output_dir=out_dir, io_type=model.config.config['IOType'], board=model.config.config['Board'], hls_config=new_config, backend=model.config.config['Backend']) hls_model.build(reset=reset, csim=csim, synth=synth, cosim=cosim, validation=validation, export=export, vsynth=vsynth) - print('FIFO optimization completed!') + print('[hls4ml] - FIFO optimization completed') return hls_model, out_dir diff --git a/hls4ml/templates/vivado/build_prj.tcl b/hls4ml/templates/vivado/build_prj.tcl index 27c7e3c741..9642ffee46 100644 --- a/hls4ml/templates/vivado/build_prj.tcl +++ b/hls4ml/templates/vivado/build_prj.tcl @@ -15,9 +15,10 @@ set tcldir [file dirname [info script]] source [file join $tcldir project.tcl] proc add_vcd_instructions_tcl {} { + global myproject set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}] - set filename myproject_prj/solution1/sim/verilog/myproject_axi.tcl + set filename ${myproject}_prj/solution1/sim/verilog/${myproject}_axi.tcl set temp $filename.new.$timestamp # set backup $filename.bak.$timestamp @@ -46,6 +47,8 @@ foreach scope $scopes { log_wave $depth } } + + set line [string map [list "myproject" $myproject] $line] } if {[string equal "$line" "quit"]} { @@ -146,17 +149,31 @@ if {$opt(cosim)} { # TODO: This is a workaround (Xilinx defines __RTL_SIMULATION__ only for SystemC testbenches). add_files -tb myproject_test.cpp -cflags "-std=c++0x -DRTL_SIM" set time_start [clock clicks -milliseconds] + + cosim_design -trace_level all -setup + if {$fifo_opt} { - puts "FIFO OPT" - cosim_design -trace_level all -setup - add_vcd_instructions_tcl - set old_pwd [pwd] - cd myproject_prj/solution1/sim/verilog/ - source run_sim.tcl - cd $old_pwd - } else { - cosim_design -trace_level all + puts "\[hls4ml\] - FIFO optimization started" + add_vcd_instructions_tcl } + + set old_pwd [pwd] + cd ${myproject}_prj/solution1/sim/verilog/ + source run_sim.tcl + cd $old_pwd + + # if {$fifo_opt} { + # puts "FIFO OPT" + # cosim_design -trace_level all -setup + # add_vcd_instructions_tcl + # set old_pwd [pwd] + # cd ${myproject}_prj/solution1/sim/verilog/ + # source run_sim.tcl + # cd $old_pwd + # } else { + # cosim_design -trace_level all + # } + set time_end [clock clicks -milliseconds] puts "INFO:" puts [read [open myproject_prj/solution1/sim/report/myproject_cosim.rpt r]] diff --git a/hls4ml/writer/vivado_accelerator_writer.py b/hls4ml/writer/vivado_accelerator_writer.py index 171c18fd87..a95ce5cff0 100644 --- a/hls4ml/writer/vivado_accelerator_writer.py +++ b/hls4ml/writer/vivado_accelerator_writer.py @@ -106,11 +106,11 @@ def write_axi_wrapper(self, model): except KeyError: pass if in_local_depth: - newline += indent + '#pragma HLS STREAM variable=in_local depth={}\n'.format(in_local_depth+1) + newline += indent + '#pragma HLS STREAM variable=in_local depth={}\n'.format(in_local_depth) else: newline += indent + '#pragma HLS STREAM variable=in_local depth=N_IN\n' if out_local_depth: - newline += indent + '#pragma HLS STREAM variable=out_local depth={}\n'.format(out_local_depth+1) + newline += indent + '#pragma HLS STREAM variable=out_local depth={}\n'.format(out_local_depth) else: newline += indent + '#pragma HLS STREAM variable=out_local depth=N_OUT\n' elif '//hls-fpga-machine-learning insert call' in line: From fe8519ffc1a15ababdbd407ede0c1f69feabf0e8 Mon Sep 17 00:00:00 2001 From: Jovan Mitrevski Date: Thu, 30 Sep 2021 08:15:29 -0500 Subject: [PATCH 022/102] fix conv1d io_parallel resource (#403) * fix conv1d io_parallel resource * replace tabs with spaces in modified code * Add test for Conv1D example model Co-authored-by: Sioni Summers --- .../vivado/nnet_utils/nnet_conv1d_resource.h | 23 ++++--- test/pytest/test_conv1d.py | 64 +++++++++++++++++++ 2 files changed, 75 insertions(+), 12 deletions(-) create mode 100644 test/pytest/test_conv1d.py diff --git a/hls4ml/templates/vivado/nnet_utils/nnet_conv1d_resource.h b/hls4ml/templates/vivado/nnet_utils/nnet_conv1d_resource.h index a305556aba..043812cea9 100644 --- a/hls4ml/templates/vivado/nnet_utils/nnet_conv1d_resource.h +++ b/hls4ml/templates/vivado/nnet_utils/nnet_conv1d_resource.h @@ -41,7 +41,7 @@ void conv_1d_full( data_T data_conv[CONFIG_T::filt_width * CONFIG_T::n_chan * CONFIG_T::out_width]; data_T data_col[CONFIG_T::filt_width * CONFIG_T::n_chan]; res_T res_col[CONFIG_T::n_filt]; - + //#pragma HLS ARRAY_PARTITION variable=data_conv complete #pragma HLS ARRAY_PARTITION variable=data_col complete #pragma HLS ARRAY_PARTITION variable=res_col complete @@ -142,17 +142,17 @@ void conv_1d_resource_cf( template void im2col_1d_cl(data_T data[CONFIG_T::in_width * CONFIG_T::n_chan], data_T data_col[CONFIG_T::filt_width * CONFIG_T::n_chan], const int col) { int index = 0; - ChannelLoop: - for (int channel = CONFIG_T::n_chan; channel--; data++) { - #pragma HLS UNROLL - KernelLoop: - for (int kernel_col = 0; kernel_col < CONFIG_T::filt_width; kernel_col++) { - int input_col = -CONFIG_T::pad_left + kernel_col * CONFIG_T::dilation + col * CONFIG_T::stride_width; - if (input_col >= 0 && input_col < CONFIG_T::in_width) { - //*(data_col++) = data[input_col * CONFIG_T::n_chan]; - data_col[index] = data[input_col * CONFIG_T::n_chan]; + KernelLoop: + for (int kernel_col = 0; kernel_col < CONFIG_T::filt_width; kernel_col++) { + #pragma HLS UNROLL + + ChannelLoop: + for (int channel = 0; channel < CONFIG_T::n_chan; channel++) { + int index_data = (col*CONFIG_T::stride_width+kernel_col-CONFIG_T::pad_left) * CONFIG_T::n_chan + channel; + + if (index_data >= 0 && index_data < CONFIG_T::in_width*CONFIG_T::n_chan) { + data_col[index] = data[index_data]; } else { - //*(data_col++) = 0; data_col[index] = 0; } index++; @@ -191,7 +191,6 @@ void conv_1d_resource_cl( dense_resource(data_col, res_col, weights, biases); for (int j = 0; j < CONFIG_T::n_filt; j++) { res[i * CONFIG_T::n_filt + j] = res_col[j]; - //res[j * CONFIG_T::out_width + i] = res_col[j]; // Transposed order } } } diff --git a/test/pytest/test_conv1d.py b/test/pytest/test_conv1d.py new file mode 100644 index 0000000000..fb5ad0bdb5 --- /dev/null +++ b/test/pytest/test_conv1d.py @@ -0,0 +1,64 @@ +from hls4ml.converters.keras_to_hls import keras_to_hls +import pytest +import hls4ml +import numpy as np +from sklearn.metrics import accuracy_score +import tensorflow as tf +from tensorflow.keras.models import model_from_json +import yaml + +@pytest.fixture(scope='module') +def data(): + X = np.random.rand(100,100,7) + return X + +@pytest.fixture(scope='module') +def keras_model(): + jsons = open('../../example-models/keras/KERAS_conv1d.json','r').read() + model = model_from_json(jsons) + model.load_weights('../../example-models/keras/KERAS_conv1d_weights.h5') + return model + +@pytest.fixture +@pytest.mark.parametrize('settings', [('io_parallel', 'latency'), + ('io_parallel', 'resource'), + ('io_stream', 'latency'), + ('io_stream', 'resource')]) +def hls_model(settings): + io_type = settings[0] + strategy = settings[1] + config = hls4ml.converters.create_config(output_dir = 'hls4mlprj_conv1d_{}_{}'.format(io_type, strategy)) + config['KerasJson'] = '../../example-models/keras/KERAS_conv1d.json' + config['KerasH5'] = '../../example-models/keras/KERAS_conv1d_weights.h5' + config['OutputDir'] = 'hls4mlprj_conv1d_{}_{}'.format(io_type, strategy) + config['IOType'] = io_type + + hls_config = {'Model' : {'Strategy' : strategy, + 'ReuseFactor' : 1, + 'Precision' : 'ap_fixed<16,3,AP_RND_CONV,AP_SAT>'}} + # Some model specific precision tuning + config['LayerName'] = {} + config['LayerName']['fc1_relu'] = {'Precision':{'weight' : 'ap_fixed<16,3>', 'result' : 'ap_fixed<16,6,AP_RND_CONV,AP_SAT>'}} + config['LayerName']['output_softmax'] = {'Precision':{'weight' : 'ap_fixed<16,6>', 'result' : 'ap_fixed<16,6,AP_RND_CONV,AP_SAT>'}} + config['LayerName']['output_softmax_softmax'] = {'Strategy':'Stable'} + config['HLSConfig'] = hls_config + hls_model = keras_to_hls(config) + hls_model.compile() + return hls_model + +@pytest.mark.parametrize('settings', [('io_parallel', 'latency'), + ('io_parallel', 'resource'), + ('io_stream', 'latency'), + ('io_stream', 'resource')]) +def test_accuracy(data, keras_model, hls_model): + X = data + model = keras_model + # model under test predictions and accuracy + y_keras = model.predict(X) + y_hls4ml = hls_model.predict(X) + # "accuracy" of hls4ml predictions vs keras + rel_acc = accuracy_score(np.argmax(y_keras, axis=1), np.argmax(y_hls4ml, axis=1)) + + print('hls4ml accuracy relative to keras: {}'.format(rel_acc)) + + assert rel_acc > 0.98 From 038c4b64e44722bc666f29f7ae1b7a20a043657f Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Fri, 1 Oct 2021 11:05:55 +0200 Subject: [PATCH 023/102] Fixing minor issues --- hls4ml/model/profiling.py | 11 +++++++---- hls4ml/templates/vivado/build_prj.tcl | 3 ++- hls4ml/writer/vivado_writer.py | 3 ++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/hls4ml/model/profiling.py b/hls4ml/model/profiling.py index acb7a2ecbe..64a6038b54 100644 --- a/hls4ml/model/profiling.py +++ b/hls4ml/model/profiling.py @@ -71,23 +71,26 @@ def populate_values(name, data, depth): new_config['Model']['FIFO_opt'] = 0 for k,v in model.output_vars.items(): filtered_max = [x['max'] for x in maxs if v.cppname in x['name']] - if len(filtered_max) == 0: continue # @todo: how to handle in_local and out_local? + if len(filtered_max) == 0: + continue + if len(filtered_max) > 1: + print('WARNING! Check names of FIFOs') if k not in new_config['LayerName']: new_config['LayerName'][k] = {'StreamDepth': filtered_max[0] + 1} else: new_config['LayerName'][k]['StreamDepth'] = filtered_max[0] + 1 for x in maxs: if 'in_local' in x['name']: - new_config['LayerName']['in_local'] = {'StreamDepth': x['max']+1} + new_config['LayerName']['in_local'] = {'StreamDepth': x['max'] + 1} elif 'out_local' in x['name']: - new_config['LayerName']['out_local'] = {'StreamDepth': x['max']+1} + new_config['LayerName']['out_local'] = {'StreamDepth': x['max'] + 1} out_dir = model.config.get_output_dir() + '_FIFO_OPT' hls_model = hls4ml.converters.convert_from_keras_model(model.config.config['KerasModel'], output_dir=out_dir, io_type=model.config.config['IOType'], board=model.config.config['Board'], hls_config=new_config, backend=model.config.config['Backend']) hls_model.build(reset=reset, csim=csim, synth=synth, cosim=cosim, validation=validation, export=export, vsynth=vsynth) print('[hls4ml] - FIFO optimization completed') - return hls_model, out_dir + return hls_model def get_unoptimized_hlsmodel(model): diff --git a/hls4ml/templates/vivado/build_prj.tcl b/hls4ml/templates/vivado/build_prj.tcl index 9642ffee46..82d84c14f3 100644 --- a/hls4ml/templates/vivado/build_prj.tcl +++ b/hls4ml/templates/vivado/build_prj.tcl @@ -150,7 +150,7 @@ if {$opt(cosim)} { add_files -tb myproject_test.cpp -cflags "-std=c++0x -DRTL_SIM" set time_start [clock clicks -milliseconds] - cosim_design -trace_level all -setup + cosim_design -wave_debug -trace_level all -tool xsim -setup if {$fifo_opt} { puts "\[hls4ml\] - FIFO optimization started" @@ -161,6 +161,7 @@ if {$opt(cosim)} { cd ${myproject}_prj/solution1/sim/verilog/ source run_sim.tcl cd $old_pwd + close # if {$fifo_opt} { # puts "FIFO OPT" diff --git a/hls4ml/writer/vivado_writer.py b/hls4ml/writer/vivado_writer.py index de7ff65543..b77e09a97b 100644 --- a/hls4ml/writer/vivado_writer.py +++ b/hls4ml/writer/vivado_writer.py @@ -663,7 +663,8 @@ def write_tar(self, model): ################### # Tarball output ################### - + if os.path.isfile(model.config.get_output_dir() + '.tar.gz'): + return with tarfile.open(model.config.get_output_dir() + '.tar.gz', mode='w:gz') as archive: archive.add(model.config.get_output_dir(), recursive=True) From 0f915bf72bcf84d86f473552091f7ae88bfff6bc Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Fri, 1 Oct 2021 12:36:00 +0200 Subject: [PATCH 024/102] Handling fifos not implemented in brams --- hls4ml/templates/vivado/build_prj.tcl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hls4ml/templates/vivado/build_prj.tcl b/hls4ml/templates/vivado/build_prj.tcl index 82d84c14f3..cb2c469240 100644 --- a/hls4ml/templates/vivado/build_prj.tcl +++ b/hls4ml/templates/vivado/build_prj.tcl @@ -37,6 +37,10 @@ append scopes [get_scopes -regexp {.*local_V_data_0.*}] open_vcd fifo_opt.vcd foreach scope $scopes { current_scope $scope + if {[catch [get_objects usedw]] == 0} { + puts "$scope skipped" + continue + } set usedw [get_objects usedw] set depth [get_objects DEPTH] add_wave $usedw From c76ea085463faae4f6eb6b89abd40b9f4a25d924 Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Fri, 1 Oct 2021 13:44:59 +0200 Subject: [PATCH 025/102] Modified `name` to `cppname` for `InplaceVariable` --- hls4ml/model/hls_layers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index e80b4b9fb1..91bd9c30f0 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -199,7 +199,7 @@ def __init__(self, shape, dim_names, proxy, **kwargs): self.shape = shape self.dim_names = dim_names self.type = proxy.type - self.name = proxy.name + self.cppname = proxy.name self.size = proxy.size def get_shape(self): From 4614bfea5ef7a58b6b89df4388730c814c564d15 Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Fri, 1 Oct 2021 19:58:02 +0200 Subject: [PATCH 026/102] Added `exit` in build_prj.tcl file --- hls4ml/templates/vivado/build_prj.tcl | 1 + 1 file changed, 1 insertion(+) diff --git a/hls4ml/templates/vivado/build_prj.tcl b/hls4ml/templates/vivado/build_prj.tcl index cb2c469240..780bfdcc21 100644 --- a/hls4ml/templates/vivado/build_prj.tcl +++ b/hls4ml/templates/vivado/build_prj.tcl @@ -59,6 +59,7 @@ foreach scope $scopes { set line {flush_vcd close_vcd quit +exit } } # then write the transformed line From c136ff84913aada33ffbd00cd3b903f22aa9b9fe Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Fri, 1 Oct 2021 20:07:01 +0200 Subject: [PATCH 027/102] `name` -> `cppname` --- hls4ml/model/hls_layers.py | 4 ++-- hls4ml/templates/vivado/build_prj.tcl | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index 91bd9c30f0..92b185f9d7 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -518,8 +518,8 @@ def _default_function_params(self): params['config'] = 'config{}'.format(self.index) params['input_t'] = self.get_input_variable().type.name params['output_t'] = self.get_output_variable().type.name - params['input'] = self.get_input_variable().name - params['output'] = self.get_output_variable().name + params['input'] = self.get_input_variable().cppname + params['output'] = self.get_output_variable().cppname return params diff --git a/hls4ml/templates/vivado/build_prj.tcl b/hls4ml/templates/vivado/build_prj.tcl index 780bfdcc21..fd8848ded5 100644 --- a/hls4ml/templates/vivado/build_prj.tcl +++ b/hls4ml/templates/vivado/build_prj.tcl @@ -166,7 +166,6 @@ if {$opt(cosim)} { cd ${myproject}_prj/solution1/sim/verilog/ source run_sim.tcl cd $old_pwd - close # if {$fifo_opt} { # puts "FIFO OPT" From 3d48d0dfbf099ad1a9139e92968cfa39eb78516f Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Fri, 1 Oct 2021 20:21:05 +0200 Subject: [PATCH 028/102] Small fix --- hls4ml/model/profiling.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hls4ml/model/profiling.py b/hls4ml/model/profiling.py index 64a6038b54..602da43d22 100644 --- a/hls4ml/model/profiling.py +++ b/hls4ml/model/profiling.py @@ -29,7 +29,7 @@ __torch_profiling_enabled__ = False -def optimize_fifos_depth(model, reset=False, csim=True, synth=True, cosim=False, validation=False, export=False, vsynth=False): +def optimize_fifos_depth(model, reset=False, csim=True, synth=True, cosim=True, validation=True, export=True, vsynth=False): values = [] From fd8a618018b0d2d520378fd7253b3957086664c3 Mon Sep 17 00:00:00 2001 From: Sioni Summers Date: Tue, 5 Oct 2021 11:48:06 +0200 Subject: [PATCH 029/102] Parallelise pytests in CI --- .gitlab-ci.yml | 37 +++++++++++++++++++-------------- test/pytest/ci-template.yml | 22 ++++++++++++++++++++ test/pytest/generate_ci_yaml.py | 33 +++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 16 deletions(-) create mode 100644 test/pytest/ci-template.yml create mode 100644 test/pytest/generate_ci_yaml.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 464ce48047..a7998345d2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,22 +1,27 @@ -pytest: - image: gitlab-registry.cern.ch/fastmachinelearning/hls4ml-testing:0.2.base +stages: + - generate + - trigger + - test + +generator: + stage: generate + image: python:3.7-alpine tags: - docker before_script: - - source ~/.bashrc - - git submodule init - - git submodule update - - conda activate hls4ml-testing - - pip install .[profiling] - script: + - pip install pyyaml + script: - cd test/pytest - - pytest -rA --cov-report xml --cov-report term --cov=hls4ml --junitxml=report.xml --randomly-seed=42 --randomly-dont-reorganize --randomly-dont-reset-seed + - python generate_ci_yaml.py artifacts: - when: always - reports: - junit: - - test/pytest/report.xml - cobertura: - - test/pytest/coverage.xml paths: - - test/pytest/hls4mlprj*.tar.gz + - test/pytest/pytests.yml + +pytests: + stage: trigger + trigger: + include: + - local: test/pytest/ci-template.yml + - artifact: test/pytest/pytests.yml + job: generator + strategy: depend diff --git a/test/pytest/ci-template.yml b/test/pytest/ci-template.yml new file mode 100644 index 0000000000..e6c05fa2de --- /dev/null +++ b/test/pytest/ci-template.yml @@ -0,0 +1,22 @@ +.pytest: + stage: test + image: gitlab-registry.cern.ch/fastmachinelearning/hls4ml-testing:0.2.base + tags: + - docker + before_script: + - source ~/.bashrc + - if [ $EXAMPLEMODEL == 1 ]; then git submodule init; git submodule update; fi + - conda activate hls4ml-testing + - pip install .[profiling] + script: + - cd test/pytest + - pytest $PYTESTFILE -rA --cov-report xml --cov-report term --cov=hls4ml --junitxml=report.xml --randomly-seed=42 --randomly-dont-reorganize --randomly-dont-reset-seed + artifacts: + when: always + reports: + junit: + - test/pytest/report.xml + cobertura: + - test/pytest/coverage.xml + paths: + - test/pytest/hls4mlprj*.tar.gz \ No newline at end of file diff --git a/test/pytest/generate_ci_yaml.py b/test/pytest/generate_ci_yaml.py new file mode 100644 index 0000000000..a6edf1a337 --- /dev/null +++ b/test/pytest/generate_ci_yaml.py @@ -0,0 +1,33 @@ +import yaml +import glob + +''' +Create a Gitlab CI yml file with a separate entry for each test_* file +in the pytests directory to parallelise the CI jobs. +''' + +template = """ +pytest.{}: + extends: .pytest + variables: + PYTESTFILE: {} + EXAMPLEMODEL: {} +""" + +def uses_example_model(test_filename): + with open(test_filename, 'r') as f: + content = f.read() + return 'example-models/' in content + +yml = None +tests = glob.glob('test_*.py') +for test in tests: + name = test.replace('test_','').replace('.py','') + new_yml = yaml.safe_load(template.format(name, 'test_{}.py'.format(name), int(uses_example_model(test)))) + if yml is None: + yml = new_yml + else: + yml.update(new_yml) + +yamlfile = open('pytests.yml', 'w') +yaml.safe_dump(yml, yamlfile) From f5acaca63968f60245d4f7169aa0698c9d25b7ec Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Thu, 7 Oct 2021 02:23:05 -0700 Subject: [PATCH 030/102] Fix GlobalPooling1D Layers (#399) * add global_pooling1d_cl * io_parallel global_pooling1d_cl * add globalpooling1d testing; add missing include in nnet_conv_stream.h * update test * Update test_globalpooling1d.py * Change project directory name Co-authored-by: Jovan Mitrevski Co-authored-by: Sioni Summers --- hls4ml/converters/keras/pooling.py | 4 +- hls4ml/model/hls_layers.py | 15 +++-- .../vivado/nnet_utils/nnet_conv_stream.h | 1 + .../vivado/nnet_utils/nnet_pooling.h | 22 ++++++- .../vivado/nnet_utils/nnet_pooling_stream.h | 58 ++++++++++++++++++- hls4ml/templates/vivado_template.py | 8 +-- test/pytest/test_globalpooling1d.py | 57 ++++++++++++++++++ 7 files changed, 149 insertions(+), 16 deletions(-) create mode 100644 test/pytest/test_globalpooling1d.py diff --git a/hls4ml/converters/keras/pooling.py b/hls4ml/converters/keras/pooling.py index ebbb557ab8..d6297e5045 100644 --- a/hls4ml/converters/keras/pooling.py +++ b/hls4ml/converters/keras/pooling.py @@ -72,8 +72,8 @@ def parse_pooling_layer(keras_layer, input_names, input_shapes, data_reader, con return layer, output_shape -pooling_layers = ['GlobalMaxPooling1D', 'GlobalMaxPooling2D', 'GlobalAveragePooling1D', 'GlobalAveragePooling2D'] -@keras_handler(*pooling_layers) +global_pooling_layers = ['GlobalMaxPooling1D', 'GlobalMaxPooling2D', 'GlobalAveragePooling1D', 'GlobalAveragePooling2D'] +@keras_handler(*global_pooling_layers) def parse_global_pooling_layer(keras_layer, input_names, input_shapes, data_reader, config): assert('Pooling' in keras_layer['class_name']) diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index 0b6c38f028..c1cca50700 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -1166,7 +1166,7 @@ def config_cpp(self): params['n_filt'] = self.get_output_variable().dim_names[1] else: params['n_in'] = self.get_input_variable().dim_names[1] - params['n_out'] = self.get_input_variable().dim_names[1] + params['n_out'] = self.get_output_variable().dim_names[1] params['n_filt'] = self.get_output_variable().dim_names[0] return self._config_template.format(**params) @@ -1208,19 +1208,24 @@ def config_cpp(self): class GlobalPooling1D(Layer): def initialize(self): - shape = [self.attributes['n_out'], self.attributes['n_filt']] - dims = ['N_OUTPUTS_{}'.format(self.index), 'N_FILT_{}'.format(self.index)] + shape = [self.attributes['n_filt']] + dims = ['N_FILT_{}'.format(self.index)] self.add_output_variable(shape, dims) self.set_attr('pool_op', self.get_attr('class_name').split('Pooling')[0].replace('Global', '')) def function_cpp(self): params = self._default_function_params() - + params['data_format'] = 'cf' if self.get_attr('data_format') == 'channels_first' else 'cl' return [self._function_template.format(**params)] def config_cpp(self): params = self._default_config_params() - params['n_in'] = self.get_input_variable().size_cpp() + if self.get_attr('data_format') == 'channels_last': + params['n_in'] = self.get_input_variable().dim_names[0] + params['n_filt'] = self.get_input_variable().dim_names[1] + else: + params['n_in'] = self.get_input_variable().dim_names[1] + params['n_filt'] = self.get_input_variable().dim_names[0] return self._config_template.format(**params) diff --git a/hls4ml/templates/vivado/nnet_utils/nnet_conv_stream.h b/hls4ml/templates/vivado/nnet_utils/nnet_conv_stream.h index 6830d90820..862e8361a1 100644 --- a/hls4ml/templates/vivado/nnet_utils/nnet_conv_stream.h +++ b/hls4ml/templates/vivado/nnet_utils/nnet_conv_stream.h @@ -4,6 +4,7 @@ #include "ap_shift_reg.h" #include "nnet_common.h" #include "hls_stream.h" +#include "nnet_dense.h" namespace nnet { diff --git a/hls4ml/templates/vivado/nnet_utils/nnet_pooling.h b/hls4ml/templates/vivado/nnet_utils/nnet_pooling.h index 5840559126..545ae558c9 100644 --- a/hls4ml/templates/vivado/nnet_utils/nnet_pooling.h +++ b/hls4ml/templates/vivado/nnet_utils/nnet_pooling.h @@ -87,7 +87,8 @@ struct pooling1d_config{ // IO size static const unsigned n_in = 10; static const unsigned pool_width = 2; - static const unsigned n_out = n_in / pool_width; + static const unsigned stride_width = 2; + static const unsigned n_out = (n_in - pool_width) / stride_width + 1; static const unsigned pad_left = 0; static const unsigned pad_right = 0; // Pooling function @@ -141,6 +142,25 @@ void pooling1d_cl(data_T data[CONFIG_T::n_in * CONFIG_T::n_filt], res_T res[CONF } } +template +void global_pooling1d_cl(data_T data[CONFIG_T::n_in * CONFIG_T::n_filt], res_T res[CONFIG_T::n_filt]) { + assert(CONFIG_T::pad_left == 0 && CONFIG_T::pad_right == 0); + assert(CONFIG_T::pool_width == CONFIG_T::stride_width); + + // TODO partition the arrays according to the reuse factor + const int limit = pool_op_limit_1d(); + #pragma HLS ALLOCATION instances=pool_op limit=limit function + + for(int ff = 0; ff < CONFIG_T::n_filt; ff++) { + data_T pool[CONFIG_T::n_in]; + for(int jj = 0; jj < CONFIG_T::n_in; jj++) { + pool[jj] = data[jj * CONFIG_T::n_filt + ff]; + } + // do the pooling + res[ff] = pool_op(pool); + } +} + struct pooling2d_config{ // IO size static const unsigned in_height = 10; diff --git a/hls4ml/templates/vivado/nnet_utils/nnet_pooling_stream.h b/hls4ml/templates/vivado/nnet_utils/nnet_pooling_stream.h index 485719cca0..80fa1d2872 100644 --- a/hls4ml/templates/vivado/nnet_utils/nnet_pooling_stream.h +++ b/hls4ml/templates/vivado/nnet_utils/nnet_pooling_stream.h @@ -473,8 +473,6 @@ T reduce_global_pool(T x, T y[N]) { template void compute_global_pool( - const unsigned h_idx, - const unsigned w_idx, const data_T& in_elem, typename CONFIG_T::accum_t data_window[CONFIG_T::n_filt] ) { @@ -516,7 +514,7 @@ void global_pooling2d_cl( ReadInputHeight: for (unsigned i_ih = 0; i_ih < CONFIG_T::in_height; i_ih++) { ReadInputWidth: for (unsigned i_iw = 0; i_iw < CONFIG_T::in_width / (data_T::size / CONFIG_T::n_filt); i_iw++) { #pragma HLS LOOP_FLATTEN - compute_global_pool(i_ih, i_iw, data.read(), data_window); + compute_global_pool(data.read(), data_window); } } @@ -548,6 +546,60 @@ void global_pooling2d_cl( } +template +void global_pooling1d_cl( + hls::stream &data, + hls::stream &res +) { + assert(CONFIG_T::pad_left == 0 && CONFIG_T::pad_right == 0); + assert(CONFIG_T::pool_width == CONFIG_T::stride_width); + + typename CONFIG_T::accum_t data_window[CONFIG_T::n_filt]; + #pragma HLS ARRAY_PARTITION variable=data_window complete + + typename CONFIG_T::accum_t init = 0; + if (CONFIG_T::pool_op == Max) { + init = hls::numeric_limits::min(); + } + + PoolInitLoop: for (unsigned i_init = 0; i_init < CONFIG_T::n_filt; i_init++) { + #pragma HLS UNROLL + data_window[i_init] = init; + } + + ReadInput: for (unsigned i_iw = 0; i_iw < CONFIG_T::n_in / (data_T::size / CONFIG_T::n_filt); i_iw++) { + #pragma HLS LOOP_FLATTEN + compute_global_pool(data.read(), data_window); + } + + if (CONFIG_T::pool_op == Max) { + MaxPoolRes: for (unsigned i_res = 0; i_res < CONFIG_T::n_filt / res_T::size; i_res++) { + #pragma HLS PIPELINE + + res_T res_pack; + #pragma HLS DATA_PACK variable=res_pack + MaxPoolPack: for (unsigned i_pack = 0; i_pack < res_T::size; i_pack++) { + #pragma HLS UNROLL + res_pack[i_pack] = data_window[i_pack]; + } + res.write(res_pack); + } + } else { + AvgPoolRes: for (unsigned i_res = 0; i_res < CONFIG_T::n_filt / res_T::size; i_res++) { + #pragma HLS PIPELINE + + res_T res_pack; + #pragma HLS DATA_PACK variable=res_pack + AvgPoolPack: for (unsigned i_pack = 0; i_pack < res_T::size; i_pack++) { + #pragma HLS UNROLL + res_pack[i_pack] = data_window[i_pack] / CONFIG_T::n_in; + } + res.write(res_pack); + } + } + +} + } #endif diff --git a/hls4ml/templates/vivado_template.py b/hls4ml/templates/vivado_template.py index 377b31211a..5b1c3b03c8 100644 --- a/hls4ml/templates/vivado_template.py +++ b/hls4ml/templates/vivado_template.py @@ -169,11 +169,9 @@ global_pooling1d_config_template = """struct config{index} : nnet::pooling1d_config {{ static const unsigned n_in = {n_in}; - static const unsigned n_out = {n_out}; - static const unsigned pad_left = {pad_left}; - static const unsigned pad_right = {pad_right}; - static const unsigned stride = {stride}; + static const unsigned n_filt = {n_filt}; static const nnet::Pool_Op pool_op = nnet::{pool_op}; + static const unsigned reuse = {reuse}; typedef {accum_t} accum_t; }};\n""" @@ -358,7 +356,7 @@ param_activ_function_template = 'nnet::{activation}<{input_t}, {output_t}, {config}>({input}, {param}, {output});' pooling1d_function_template = 'nnet::pooling1d_{data_format}<{input_t}, {output_t}, {config}>({input}, {output});' pooling2d_function_template = 'nnet::pooling2d_{data_format}<{input_t}, {output_t}, {config}>({input}, {output});' -global_pooling1d_function_template = 'nnet::global_pooling1d<{input_t}, {config}>({input}, {output});' +global_pooling1d_function_template = 'nnet::global_pooling1d_{data_format}<{input_t}, {output_t}, {config}>({input}, {output});' global_pooling2d_function_template = 'nnet::global_pooling2d_{data_format}<{input_t}, {output_t}, {config}>({input}, {output});' zeropad1d_function_template = 'nnet::zeropad1d_{data_format}<{input_t}, {output_t}, {config}>({input}, {output});' zeropad2d_function_template = 'nnet::zeropad2d_{data_format}<{input_t}, {output_t}, {config}>({input}, {output});' diff --git a/test/pytest/test_globalpooling1d.py b/test/pytest/test_globalpooling1d.py new file mode 100644 index 0000000000..369b739dd3 --- /dev/null +++ b/test/pytest/test_globalpooling1d.py @@ -0,0 +1,57 @@ +import pytest +from tensorflow.keras.models import Sequential +from tensorflow.keras.layers import GlobalAveragePooling1D, GlobalMaxPooling1D +import numpy as np +import hls4ml + + +in_shape = 8 +in_feat = 4 +atol = 5e-3 + +@pytest.fixture(scope='module') +def data(): + X = np.random.rand(100, in_shape, in_feat) + return X + + +@pytest.fixture(scope='module') +def keras_model_max(): + model = Sequential() + model.add(GlobalMaxPooling1D(input_shape=(in_shape, in_feat))) + model.compile() + return model + +@pytest.fixture(scope='module') +def keras_model_ave(): + model = Sequential() + model.add(GlobalAveragePooling1D(input_shape=(in_shape, in_feat))) + model.compile() + return model + + +@pytest.mark.parametrize('io_type', ['io_parallel', 'io_stream']) +@pytest.mark.parametrize('model_type', ['max', 'ave']) +def test_global_pool1d(keras_model_max, keras_model_ave, data, model_type, io_type): + if model_type == 'ave': + model = keras_model_ave + else: + model = keras_model_max + config = hls4ml.utils.config_from_keras_model(model, + default_precision='ap_fixed<32,1>', + granularity='name') + if model_type == 'ave': + config['LayerName']['global_average_pooling1d']['accum_t'] = 'ap_fixed<32,6>' + + hls_model = hls4ml.converters.convert_from_keras_model(model, + hls_config=config, + io_type=io_type, + output_dir=f'hls4mlprj_globalplool1d_{model_type}_{io_type}', + part='xcvu9p-flgb2104-2-i') + hls_model.compile() + + + # Predict + y_keras = np.squeeze(model.predict(data)) + y_hls = hls_model.predict(data) + np.testing.assert_allclose(y_keras, y_hls, rtol=0, atol=atol, verbose=True) From 231fdcbe35a3dde51248bc1d74ca4c3f217330c8 Mon Sep 17 00:00:00 2001 From: Sioni Summers Date: Wed, 29 Sep 2021 16:29:35 +0200 Subject: [PATCH 031/102] Set appropriate data type for quantized_relu activations --- hls4ml/utils/config.py | 10 +++++++--- test/pytest/test_qkeras.py | 10 +++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/hls4ml/utils/config.py b/hls4ml/utils/config.py index 07863ed8cc..b907350bb4 100644 --- a/hls4ml/utils/config.py +++ b/hls4ml/utils/config.py @@ -37,11 +37,14 @@ def _get_precision_from_quantizer(quantizer): quantizer['class_name'] = quantizer_obj.__name__ supported_quantizers = ['quantized_bits', 'quantized_relu', 'quantized_tanh', 'quantized_po2', 'quantized_relu_po2'] + signed = True if quantizer['class_name'] in supported_quantizers: bits = int(quantizer['config']['bits']) # if integer isn't specified, it should be the same as bits integer = int(quantizer['config'].get('integer', bits-1)) + 1 - + if quantizer['class_name'] == 'quantized_relu': + signed = False + integer -= 1 elif quantizer['class_name'] in ['binary', 'stochastic_binary', 'binary_tanh']: bits = 2 integer = 2 @@ -53,10 +56,11 @@ def _get_precision_from_quantizer(quantizer): raise Exception('ERROR: Unsupported quantizer: {}'.format(quantizer['class_name'])) decimal = bits - integer + signed = '' if signed else 'u' if decimal > 0: - return 'ap_fixed<{},{}>'.format(bits, integer) + return 'ap_{}fixed<{},{}>'.format(signed, bits, integer) else: - return 'ap_int<{}>'.format(bits) + return 'ap_{}int<{}>'.format(signed, bits) def config_from_keras_model(model, granularity='model', default_precision='ap_fixed<16,6>', default_reuse_factor=1): """Create an HLS conversion config given the Keras model. diff --git a/test/pytest/test_qkeras.py b/test/pytest/test_qkeras.py index dbf2fa9b38..cdfc312a8c 100644 --- a/test/pytest/test_qkeras.py +++ b/test/pytest/test_qkeras.py @@ -186,9 +186,13 @@ def randX_1000_1(): (quantized_bits(8,4)), (quantized_bits(4,2)), (quantized_bits(4,0)), - (quantized_bits(10,0)),]) - #(quantized_relu(4)), - #(quantized_relu(10))]) + (quantized_bits(10,0)), + (quantized_relu(4)), + (quantized_relu(4,2)), + (quantized_relu(8)), + (quantized_relu(8,4)), + (quantized_relu(10)), + (quantized_relu(10,5))]) def test_quantizer(randX_1000_1, quantizer): ''' Test a single quantizer as an Activation function. From b361265cde118d968549476e5371633419e288e3 Mon Sep 17 00:00:00 2001 From: Sioni Summers Date: Wed, 29 Sep 2021 16:30:12 +0200 Subject: [PATCH 032/102] Display unsigned types properly in profiling --- hls4ml/model/profiling.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/hls4ml/model/profiling.py b/hls4ml/model/profiling.py index 1c8ff0ded9..9aeb38be98 100644 --- a/hls4ml/model/profiling.py +++ b/hls4ml/model/profiling.py @@ -159,32 +159,31 @@ def types_histogram(data, fmt='longform'): types_plots = {'boxplot' : types_boxplot, 'histogram' : types_histogram} -def ap_fixed_WIF(dtype): +def ap_fixed_WIFS(dtype): from hls4ml.templates.vivado_template import VivadoBackend dtype = VivadoBackend.convert_precision_string(None, dtype) - W, I, F = dtype.width, dtype.integer, dtype.fractional - return W, I, F + W, I, F, S = dtype.width, dtype.integer, dtype.fractional, dtype.signed + return W, I, F, S def types_hlsmodel(model): suffix = ['w', 'b'] data = {'layer' : [], 'low' : [], 'high' : []} # Plot the default precision default_precision = model.config.model_precision['default'] - # assumes ap_fixed - W, I, F = ap_fixed_WIF(default_precision) + W, I, F, S = ap_fixed_WIFS(default_precision) data['layer'].append('model') data['low'].append(-F) - data['high'].append(I-1) + data['high'].append(I-1 if S else I) for layer in model.get_layers(): for iw, weight in enumerate(layer.get_weights()): wname = '{}/{}'.format(layer.name, suffix[iw]) T = weight.type if T.name != 'model': - W, I, F = ap_fixed_WIF(T.precision) + W, I, F, S = ap_fixed_WIFS(T.precision) data['layer'].append(wname) data['low'].append(-F) - data['high'].append(I-1) + data['high'].append(I-1 if S else I) data = pandas.DataFrame(data) return data @@ -192,16 +191,16 @@ def activation_types_hlsmodel(model): data = {'layer' : [], 'low' : [], 'high' : []} # Get the default precision default_precision = model.config.model_precision['default'] - W, I, F = ap_fixed_WIF(default_precision) + W, I, F, S = ap_fixed_WIFS(default_precision) data['layer'].append('model') data['low'].append(-F) - data['high'].append(I-1) + data['high'].append(I-1 if S else I) for layer in model.get_layers(): T = layer.get_output_variable().type.precision - W, I, F = ap_fixed_WIF(T) + W, I, F, S = ap_fixed_WIFS(T) data['layer'].append(layer.name) data['low'].append(-F) - data['high'].append(I-1) + data['high'].append(I-1 if S else I) data = pandas.DataFrame(data) return data From c0143a1496706570700c58276c5fcd5b79a4edec Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Mon, 18 Oct 2021 14:34:26 +0200 Subject: [PATCH 033/102] Some fixes --- hls4ml/model/profiling.py | 55 +++++++++++++++++++-------- hls4ml/templates/vivado/build_prj.tcl | 43 +++++++++++++++++++-- 2 files changed, 78 insertions(+), 20 deletions(-) diff --git a/hls4ml/model/profiling.py b/hls4ml/model/profiling.py index 602da43d22..86d865e630 100644 --- a/hls4ml/model/profiling.py +++ b/hls4ml/model/profiling.py @@ -29,7 +29,10 @@ __torch_profiling_enabled__ = False -def optimize_fifos_depth(model, reset=False, csim=True, synth=True, cosim=True, validation=True, export=True, vsynth=False): +def optimize_fifos_depth(model, output_dir='my-hls-test', project_name='myproject', input_data_tb=None, + output_data_tb=None, backend='Vivado', board=None, part=None, clock_period=5, + io_type='io_stream', hls_config={}, init_large_fifo=True, reset=False, csim=True, synth=True, + cosim=True, validation=True, export=True, vsynth=False, **kwargs,): values = [] @@ -40,20 +43,40 @@ def populate_values(name, data, depth): values[-1]['max'] = max(values[-1]['data']) values[-1]['depth'] = int(depth[1:], 2) - if not model.config.config['HLSConfig']['Model']['FIFO_opt']: + hls_model = hls4ml.converters.convert_from_keras_model(model, output_dir=output_dir, project_name=project_name, + input_data_tb=input_data_tb, output_data_tb=output_data_tb, + backend=backend, board=board, part=part, + clock_period=clock_period, io_type=io_type, + hls_config=hls_config, kwargs=kwargs) + + config = hls_model.config.config['HLSConfig'] + + if not config['Model']['FIFO_opt']: raise Exception('To use this optimization you have to set `FIFO_opt` field to True in the HLS config') - with open(model.config.get_output_dir() + '/' + model.config.get_project_name() + '_prj' + '/solution1/sim/verilog/fifo_opt.vcd') as vcd_file: + # initialize all the fifos to 10000 so that they will be automatically implemented in BRAMs and so they will be + # profiled + if init_large_fifo: + for k,_ in hls_model.output_vars.items(): + if k not in config['LayerName']: + config['LayerName'][k] = {'StreamDepth': 10000} + else: + config['LayerName'][k]['StreamDepth'] = 10000 + + # run the build with FIFO_opt param set to 1 in order to generate the vcd file + # hls_model.build(csim=True, cosim=True, synth=True, vsynth=False, export=False, validation=True) + + with open(hls_model.config.get_output_dir() + '/' + hls_model.config.get_project_name() + '_prj' + '/solution1/sim/verilog/fifo_opt.vcd') as vcd_file: vcd = VcdParser() vcd.parse(vcd_file) data = vcd.scope.toJson() - # input/output fifos: should it be considered just for VivadoAccelerator? - # yes, to be considered just with vivado accelerator - for i in range(1, len(data['children'][0]['children'][0]['children'])): - populate_values(data['children'][0]['children'][0]['children'][i]['name'], - data['children'][0]['children'][0]['children'][i]['children'][0]['data'], - data['children'][0]['children'][0]['children'][i]['children'][1]['data'][0][1]) + # wrapper fifos - useful only with VivadoAccelerator backend + if hls_model.config.get_config_value('Backend') == 'VivadoAccelerator': + for i in range(1, len(data['children'][0]['children'][0]['children'])): + populate_values(data['children'][0]['children'][0]['children'][i]['name'], + data['children'][0]['children'][0]['children'][i]['children'][0]['data'], + data['children'][0]['children'][0]['children'][i]['children'][1]['data'][0][1]) # model layers fifos n_elem = len(data['children'][0]['children'][0]['children'][0]['children']) @@ -64,12 +87,12 @@ def populate_values(name, data, depth): maxs = [{'name': i['name'], 'max': i['max'], 'depth': i['depth']} for i in values] - with open(model.config.get_output_dir() + '/max_depth.json', 'w') as f: + with open(hls_model.config.get_output_dir() + '/max_depth.json', 'w') as f: json.dump(maxs, f, indent=4) - new_config = model.config.config.copy()['HLSConfig'] + new_config = hls_model.config.config.copy()['HLSConfig'] new_config['Model']['FIFO_opt'] = 0 - for k,v in model.output_vars.items(): + for k, v in hls_model.output_vars.items(): filtered_max = [x['max'] for x in maxs if v.cppname in x['name']] if len(filtered_max) == 0: continue @@ -84,10 +107,10 @@ def populate_values(name, data, depth): new_config['LayerName']['in_local'] = {'StreamDepth': x['max'] + 1} elif 'out_local' in x['name']: new_config['LayerName']['out_local'] = {'StreamDepth': x['max'] + 1} - out_dir = model.config.get_output_dir() + '_FIFO_OPT' - hls_model = hls4ml.converters.convert_from_keras_model(model.config.config['KerasModel'], output_dir=out_dir, io_type=model.config.config['IOType'], - board=model.config.config['Board'], hls_config=new_config, - backend=model.config.config['Backend']) + out_dir = hls_model.config.get_output_dir() + '_FIFO_OPT' + hls_model = hls4ml.converters.convert_from_keras_model(hls_model.config.config['KerasModel'], output_dir=out_dir, io_type=hls_model.config.config['IOType'], + board=hls_model.config.config['Board'], hls_config=new_config, + backend=hls_model.config.config['Backend']) hls_model.build(reset=reset, csim=csim, synth=synth, cosim=cosim, validation=validation, export=export, vsynth=vsynth) print('[hls4ml] - FIFO optimization completed') return hls_model diff --git a/hls4ml/templates/vivado/build_prj.tcl b/hls4ml/templates/vivado/build_prj.tcl index fd8848ded5..b8b3c18827 100644 --- a/hls4ml/templates/vivado/build_prj.tcl +++ b/hls4ml/templates/vivado/build_prj.tcl @@ -14,6 +14,36 @@ array set opt { set tcldir [file dirname [info script]] source [file join $tcldir project.tcl] +proc add_exit_instruction_tcl {} { + global myproject + set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}] + + set filename ${myproject}_prj/solution1/sim/verilog/${myproject}_axi.tcl + set temp $filename.new.$timestamp + # set backup $filename.bak.$timestamp + + set in [open $filename r] + set out [open $temp w] + + # line-by-line, read the original file + while {[gets $in line] != -1} { + if {[string equal "$line" "run all"]} { + set line {run all +quit +} + } + # then write the transformed line + puts $out $line + } + + close $in + close $out + + # move the new data to the proper filename + file delete -force $filename + file rename -force $temp $filename +} + proc add_vcd_instructions_tcl {} { global myproject set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}] @@ -55,11 +85,11 @@ foreach scope $scopes { set line [string map [list "myproject" $myproject] $line] } - if {[string equal "$line" "quit"]} { - set line {flush_vcd + if {[string equal "$line" "run all"]} { + set line {run all +flush_vcd close_vcd quit -exit } } # then write the transformed line @@ -156,16 +186,21 @@ if {$opt(cosim)} { set time_start [clock clicks -milliseconds] cosim_design -wave_debug -trace_level all -tool xsim -setup - + # cosim_design -trace_level all -tool xsim if {$fifo_opt} { puts "\[hls4ml\] - FIFO optimization started" add_vcd_instructions_tcl } + #else { + # add_exit_instruction_tcl + #} set old_pwd [pwd] cd ${myproject}_prj/solution1/sim/verilog/ source run_sim.tcl + # source check_sim.tcl cd $old_pwd + # cosim_design -wave_debug -trace_level all -tool xsim # if {$fifo_opt} { # puts "FIFO OPT" From 0ea8d88fc0a82f7757320c13ccde07f23fa757ee Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Mon, 18 Oct 2021 16:47:42 +0200 Subject: [PATCH 034/102] Some fixes --- hls4ml/model/profiling.py | 4 ++-- hls4ml/templates/vivado/build_prj.tcl | 9 ++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/hls4ml/model/profiling.py b/hls4ml/model/profiling.py index 86d865e630..4839543e32 100644 --- a/hls4ml/model/profiling.py +++ b/hls4ml/model/profiling.py @@ -47,7 +47,7 @@ def populate_values(name, data, depth): input_data_tb=input_data_tb, output_data_tb=output_data_tb, backend=backend, board=board, part=part, clock_period=clock_period, io_type=io_type, - hls_config=hls_config, kwargs=kwargs) + hls_config=hls_config, **kwargs) config = hls_model.config.config['HLSConfig'] @@ -64,7 +64,7 @@ def populate_values(name, data, depth): config['LayerName'][k]['StreamDepth'] = 10000 # run the build with FIFO_opt param set to 1 in order to generate the vcd file - # hls_model.build(csim=True, cosim=True, synth=True, vsynth=False, export=False, validation=True) + hls_model.build(csim=True, cosim=True, synth=True, vsynth=False, export=False, validation=True) with open(hls_model.config.get_output_dir() + '/' + hls_model.config.get_project_name() + '_prj' + '/solution1/sim/verilog/fifo_opt.vcd') as vcd_file: vcd = VcdParser() diff --git a/hls4ml/templates/vivado/build_prj.tcl b/hls4ml/templates/vivado/build_prj.tcl index b8b3c18827..ef0bd9b9db 100644 --- a/hls4ml/templates/vivado/build_prj.tcl +++ b/hls4ml/templates/vivado/build_prj.tcl @@ -85,9 +85,8 @@ foreach scope $scopes { set line [string map [list "myproject" $myproject] $line] } - if {[string equal "$line" "run all"]} { - set line {run all -flush_vcd + if {[string equal "$line" "quit"]} { + set line {flush_vcd close_vcd quit } @@ -185,8 +184,8 @@ if {$opt(cosim)} { add_files -tb myproject_test.cpp -cflags "-std=c++0x -DRTL_SIM" set time_start [clock clicks -milliseconds] - cosim_design -wave_debug -trace_level all -tool xsim -setup - # cosim_design -trace_level all -tool xsim + cosim_design -trace_level all -setup + if {$fifo_opt} { puts "\[hls4ml\] - FIFO optimization started" add_vcd_instructions_tcl From 7ed6fccdf932077b62efaa5fc04a441870d33006 Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Tue, 19 Oct 2021 16:24:37 +0200 Subject: [PATCH 035/102] Adding one dependency --- setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ebdda86d79..0d16f6acb8 100644 --- a/setup.py +++ b/setup.py @@ -30,7 +30,8 @@ def get_version(rel_path): 'six', 'pyyaml', 'h5py', - 'onnx>=1.4.0'], + 'onnx>=1.4.0', + 'pyDigitalWaveTools'], extras_require={ 'profiling': [ 'pandas', From 92bf513c1a6fdc785e7f6852c9aedea1df5035da Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Wed, 20 Oct 2021 13:07:44 +0200 Subject: [PATCH 036/102] Fixing bugs in the `optimize_fifos_depth` function --- hls4ml/model/profiling.py | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/hls4ml/model/profiling.py b/hls4ml/model/profiling.py index 4839543e32..576acfbece 100644 --- a/hls4ml/model/profiling.py +++ b/hls4ml/model/profiling.py @@ -43,27 +43,42 @@ def populate_values(name, data, depth): values[-1]['max'] = max(values[-1]['data']) values[-1]['depth'] = int(depth[1:], 2) + if not hls_config['Model']['FIFO_opt']: + raise Exception('To use this optimization you have to set `FIFO_opt` field to True in the HLS config') + + hls_model = hls4ml.converters.convert_from_keras_model(model, output_dir=output_dir, project_name=project_name, input_data_tb=input_data_tb, output_data_tb=output_data_tb, backend=backend, board=board, part=part, clock_period=clock_period, io_type=io_type, hls_config=hls_config, **kwargs) - config = hls_model.config.config['HLSConfig'] - - if not config['Model']['FIFO_opt']: - raise Exception('To use this optimization you have to set `FIFO_opt` field to True in the HLS config') - # initialize all the fifos to 10000 so that they will be automatically implemented in BRAMs and so they will be # profiled + if init_large_fifo: + for k,_ in hls_model.output_vars.items(): - if k not in config['LayerName']: - config['LayerName'][k] = {'StreamDepth': 10000} + if k not in hls_config['LayerName']: + hls_config['LayerName'][k] = {'StreamDepth': 10000} else: - config['LayerName'][k]['StreamDepth'] = 10000 + hls_config['LayerName'][k]['StreamDepth'] = 10000 + + if hls_model.config.get_config_value('Backend') == 'VivadoAccelerator': + hls_config['LayerName']['in_local'] = {'StreamDepth' : 10000} + hls_config['LayerName']['out_local'] = {'StreamDepth': 10000} + + hls_model = hls4ml.converters.convert_from_keras_model(model, output_dir=output_dir, project_name=project_name, + input_data_tb=input_data_tb, + output_data_tb=output_data_tb, + backend=backend, board=board, part=part, + clock_period=clock_period, io_type=io_type, + hls_config=hls_config, **kwargs) + + # run the build with FIFO_opt param set to 1 in order to generate the vcd file + hls_model.write() hls_model.build(csim=True, cosim=True, synth=True, vsynth=False, export=False, validation=True) with open(hls_model.config.get_output_dir() + '/' + hls_model.config.get_project_name() + '_prj' + '/solution1/sim/verilog/fifo_opt.vcd') as vcd_file: From 888713b5d4dce0c4be0791794eca236892021819 Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Thu, 21 Oct 2021 10:18:40 +0200 Subject: [PATCH 037/102] Fixing bugs in `optimize_fifos_depth` function --- hls4ml/model/profiling.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/hls4ml/model/profiling.py b/hls4ml/model/profiling.py index 576acfbece..427a99b77a 100644 --- a/hls4ml/model/profiling.py +++ b/hls4ml/model/profiling.py @@ -30,7 +30,7 @@ def optimize_fifos_depth(model, output_dir='my-hls-test', project_name='myproject', input_data_tb=None, - output_data_tb=None, backend='Vivado', board=None, part=None, clock_period=5, + output_data_tb=None, backend='VivadoBackend', board=None, part=None, clock_period=5, io_type='io_stream', hls_config={}, init_large_fifo=True, reset=False, csim=True, synth=True, cosim=True, validation=True, export=True, vsynth=False, **kwargs,): @@ -123,9 +123,13 @@ def populate_values(name, data, depth): elif 'out_local' in x['name']: new_config['LayerName']['out_local'] = {'StreamDepth': x['max'] + 1} out_dir = hls_model.config.get_output_dir() + '_FIFO_OPT' - hls_model = hls4ml.converters.convert_from_keras_model(hls_model.config.config['KerasModel'], output_dir=out_dir, io_type=hls_model.config.config['IOType'], - board=hls_model.config.config['Board'], hls_config=new_config, - backend=hls_model.config.config['Backend']) + hls_model = hls4ml.converters.convert_from_keras_model(hls_model.config.config['KerasModel'], output_dir=out_dir, + io_type=io_type, board=board, part=part, + clock_period=clock_period, hls_config=new_config, + backend=backend, + input_data_tb=input_data_tb, + output_data_tb=output_data_tb, **kwargs) + hls_model.write() hls_model.build(reset=reset, csim=csim, synth=synth, cosim=cosim, validation=validation, export=export, vsynth=vsynth) print('[hls4ml] - FIFO optimization completed') return hls_model From ffc98451a36e6c8ee240776e2287c7f4eb7d8c5b Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Mon, 8 Nov 2021 13:54:58 +0100 Subject: [PATCH 038/102] Testing without `log_wave -r /` --- hls4ml/templates/vivado/build_prj.tcl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/hls4ml/templates/vivado/build_prj.tcl b/hls4ml/templates/vivado/build_prj.tcl index ef0bd9b9db..69790d0e21 100644 --- a/hls4ml/templates/vivado/build_prj.tcl +++ b/hls4ml/templates/vivado/build_prj.tcl @@ -58,8 +58,7 @@ proc add_vcd_instructions_tcl {} { # line-by-line, read the original file while {[gets $in line] != -1} { if {[string equal "$line" "log_wave -r /"]} { - set line {log_wave -r / -current_scope /apatb_myproject_axi_top/AESL_inst_myproject_axi/myproject_U0 + set line {current_scope /apatb_myproject_axi_top/AESL_inst_myproject_axi/myproject_U0 set scopes [get_scopes -regexp {layer(\d*)_.*data_0_V_U.*}] current_scope /apatb_myproject_axi_top/AESL_inst_myproject_axi append scopes { } From 0cfb79c94e2bfdc3b21fbf0c3ce176854cb45e9b Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Mon, 8 Nov 2021 16:27:01 +0100 Subject: [PATCH 039/102] - Testing with all build parameters true by default - Added clean script to remove `log_waves -r /` --- hls4ml/templates/vivado/build_prj.tcl | 44 ++++++++++++++++----------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/hls4ml/templates/vivado/build_prj.tcl b/hls4ml/templates/vivado/build_prj.tcl index 69790d0e21..62f628686f 100644 --- a/hls4ml/templates/vivado/build_prj.tcl +++ b/hls4ml/templates/vivado/build_prj.tcl @@ -44,6 +44,32 @@ quit file rename -force $temp $filename } +proc clean_script {} { + global myproject + set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}] + + set filename ${myproject}_prj/solution1/sim/verilog/${myproject}_axi.tcl + set temp $filename.new.$timestamp + # set backup $filename.bak.$timestamp + + set in [open $filename r] + set out [open $temp w] + + # line-by-line, read the original file + while {[gets $in line] != -1} { + if {[string equal "$line" "log_wave -r /"]} { + set line { } + puts $out $line + } + + close $in + close $out + + # move the new data to the proper filename + file delete -force $filename + file rename -force $temp $filename +} + proc add_vcd_instructions_tcl {} { global myproject set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}] @@ -189,28 +215,12 @@ if {$opt(cosim)} { puts "\[hls4ml\] - FIFO optimization started" add_vcd_instructions_tcl } - #else { - # add_exit_instruction_tcl - #} + clean_script set old_pwd [pwd] cd ${myproject}_prj/solution1/sim/verilog/ source run_sim.tcl - # source check_sim.tcl cd $old_pwd - # cosim_design -wave_debug -trace_level all -tool xsim - - # if {$fifo_opt} { - # puts "FIFO OPT" - # cosim_design -trace_level all -setup - # add_vcd_instructions_tcl - # set old_pwd [pwd] - # cd ${myproject}_prj/solution1/sim/verilog/ - # source run_sim.tcl - # cd $old_pwd - # } else { - # cosim_design -trace_level all - # } set time_end [clock clicks -milliseconds] puts "INFO:" From be7dd0094d72e9fd0f4ba35d81b1d83b0e376c03 Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Mon, 8 Nov 2021 16:27:13 +0100 Subject: [PATCH 040/102] - Testing with all build parameters true by default - Added clean script to remove `log_waves -r /` --- hls4ml/model/profiling.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hls4ml/model/profiling.py b/hls4ml/model/profiling.py index 427a99b77a..b08e24da27 100644 --- a/hls4ml/model/profiling.py +++ b/hls4ml/model/profiling.py @@ -31,8 +31,8 @@ def optimize_fifos_depth(model, output_dir='my-hls-test', project_name='myproject', input_data_tb=None, output_data_tb=None, backend='VivadoBackend', board=None, part=None, clock_period=5, - io_type='io_stream', hls_config={}, init_large_fifo=True, reset=False, csim=True, synth=True, - cosim=True, validation=True, export=True, vsynth=False, **kwargs,): + io_type='io_stream', hls_config={}, init_large_fifo=True, reset=True, csim=True, synth=True, + cosim=True, validation=True, export=True, vsynth=True, **kwargs,): values = [] From f10e0c3b1713104265fe6be0e8f92678afe5569f Mon Sep 17 00:00:00 2001 From: "Javier M. Duarte" Date: Mon, 11 Oct 2021 16:09:37 -0700 Subject: [PATCH 041/102] fix batched multiple inputs --- hls4ml/model/hls_model.py | 38 +++++++++++++++++++++----------------- test/pytest/test_graph.py | 9 +++++---- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/hls4ml/model/hls_model.py b/hls4ml/model/hls_model.py index 2246107450..0f9c11ae3a 100644 --- a/hls4ml/model/hls_model.py +++ b/hls4ml/model/hls_model.py @@ -555,21 +555,21 @@ def _get_top_function(self, x): else: xlist = x - for x in xlist: - if not isinstance(x, np.ndarray): + for xi in xlist: + if not isinstance(xi, np.ndarray): raise Exception('Expected numpy.ndarray, but got {}'.format(type(x))) - if not x.flags['C_CONTIGUOUS']: + if not xi.flags['C_CONTIGUOUS']: raise Exception('Array must be c_contiguous, try using numpy.ascontiguousarray(x)') - x = xlist[0] - if x.dtype in [np.single, np.float32]: + x0 = xlist[0] + if x0.dtype in [np.single, np.float32]: top_function = getattr(self._top_function_lib, self.config.get_project_name() + '_float') ctype = ctypes.c_float - elif x.dtype in [np.double, np.float64, np.float_]: + elif x0.dtype in [np.double, np.float64, np.float_]: top_function = getattr(self._top_function_lib, self.config.get_project_name() + '_double') ctype = ctypes.c_double else: - raise Exception('Invalid type ({}) of numpy array. Supported types are: single, float32, double, float64, float_.'.format(x.dtype)) + raise Exception('Invalid type ({}) of numpy array. Supported types are: single, float32, double, float64, float_.'.format(x0.dtype)) top_function.restype = None @@ -584,9 +584,9 @@ def _compute_n_samples(self, x): else: xlist = x n_samples = [] - for i, x in enumerate(xlist): + for i, xi in enumerate(xlist): expected_size = self.get_input_variables()[i].size() - x_size = np.prod(x.shape) + x_size = np.prod(xi.shape) n_sample, rem = divmod(x_size, expected_size) if rem != 0: raise Exception('Input size mismatch, got {}, expected {}'.format(x_size.shape, self.get_input_variables()[i].shape)) @@ -600,23 +600,25 @@ def _compute_n_samples(self, x): def predict(self, x): top_function, ctype = self._get_top_function(x) n_samples = self._compute_n_samples(x) + n_inputs = len(self.get_input_variables()) curr_dir = os.getcwd() os.chdir(self.config.get_output_dir() + '/firmware') output = [] - if n_samples == 1: + if n_samples == 1 and n_inputs == 1: x = [x] try: for i in range(n_samples): predictions = np.zeros(self.get_output_variables()[0].size(), dtype=ctype) - if len(self.get_input_variables()) == 1: + if n_inputs == 1: top_function(x[i], predictions, ctypes.byref(ctypes.c_ushort()), ctypes.byref(ctypes.c_ushort())) else: - argtuple = [xi for xi in x[i]] + inp = [xj[i] for xj in x] + argtuple = inp argtuple += [predictions] - argtuple += [ctypes.byref(ctypes.c_ushort()) for i in range(len(x[i])+1)] + argtuple += [ctypes.byref(ctypes.c_ushort()) for k in range(len(inp)+1)] argtuple = tuple(argtuple) top_function(*argtuple) output.append(predictions) @@ -639,6 +641,7 @@ def trace(self, x): top_function, ctype = self._get_top_function(x) n_samples = self._compute_n_samples(x) + n_inputs = len(self.get_input_variables()) class TraceData(ctypes.Structure): _fields_ = [('name', ctypes.c_char_p), @@ -670,7 +673,7 @@ class TraceData(ctypes.Structure): os.chdir(self.config.get_output_dir() + '/firmware') output = [] - if n_samples == 1: + if n_samples == 1 and n_inputs == 1: x = [x] try: @@ -678,12 +681,13 @@ class TraceData(ctypes.Structure): for i in range(n_samples): predictions = np.zeros(self.get_output_variables()[0].size(), dtype=ctype) - if len(self.get_input_variables()) == 1: + if n_inputs == 1: top_function(x[i], predictions, ctypes.byref(ctypes.c_ushort()), ctypes.byref(ctypes.c_ushort())) else: - argtuple = [xi for xi in x[i]] + inp = [xj[i] for xj in x] + argtuple = inp argtuple += [predictions] - argtuple += [ctypes.byref(ctypes.c_ushort()) for i in range(len(x[i])+1)] + argtuple += [ctypes.byref(ctypes.c_ushort()) for k in range(len(inp)+1)] argtuple = tuple(argtuple) top_function(*argtuple) output.append(predictions) diff --git a/test/pytest/test_graph.py b/test/pytest/test_graph.py index 1d0dcca9c5..b25d104a2d 100644 --- a/test/pytest/test_graph.py +++ b/test/pytest/test_graph.py @@ -94,14 +94,15 @@ def test_graph_manipulation(parameters, iotype): np.testing.assert_array_equal(expected_layers, actual_layers) @pytest.mark.parametrize('iotype', ['io_parallel', 'io_stream']) -def test_graph_branch(iotype): - odir = 'hls4mlprj_graph_branch_model' +@pytest.mark.parametrize('batch', [1, 100]) +def test_graph_branch(iotype, batch): + odir = 'hls4mlprj_graph_branch_model_{}_batch{}'.format(iotype, batch) model = branch_model(odir, iotype) original_layers = np.array([layer.name for layer in list(model.get_layers())]) model.compile() hls4ml.utils.plot_model(model, show_shapes=True, show_precision=True, to_file='{}/model.png'.format(odir)) - X0 = np.random.rand(1,1) - X1 = np.random.rand(1,1) + X0 = np.random.rand(batch, 1) + X1 = np.random.rand(batch, 1) y_expected = 2*(X0+X1) y = model.predict([X0, X1]).reshape(y_expected.shape) # check the output From d1d5eba26a9bad980aa7a2e297e374f33cfc43c5 Mon Sep 17 00:00:00 2001 From: David Siorpaes Date: Tue, 26 Oct 2021 11:03:51 +0200 Subject: [PATCH 042/102] Fixed 'qkeras_mnist_dense' example build problem #423 --- hls4ml/utils/example_models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hls4ml/utils/example_models.py b/hls4ml/utils/example_models.py index 10fd5f090e..fdc405ca3a 100644 --- a/hls4ml/utils/example_models.py +++ b/hls4ml/utils/example_models.py @@ -88,7 +88,7 @@ def _load_example_config(model_name): #Load the configuration from local yml file with open(config_name, 'r') as ymlfile: - config = yaml.load(ymlfile) + config = yaml.safe_load(ymlfile) return config From 997c07be33e25116beb6813b9aadf330bd0b005c Mon Sep 17 00:00:00 2001 From: Sioni Summers Date: Thu, 4 Nov 2021 16:14:08 +0100 Subject: [PATCH 043/102] Update for pyyaml 6.0 (#435) * yaml.safe_load instead of yaml.load * Use yaml.safe_load in converters __init__.py --- hls4ml/converters/__init__.py | 2 +- test/pytest/test_cnn_mnist.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hls4ml/converters/__init__.py b/hls4ml/converters/__init__.py index fb65071243..1ecf4b37f1 100644 --- a/hls4ml/converters/__init__.py +++ b/hls4ml/converters/__init__.py @@ -93,7 +93,7 @@ def construct_keras_model(loader, node): print('Loading configuration from', config_file) with open(config_file, 'r') as file: - parsed_config = yaml.load(file, Loader=yaml.SafeLoader) + parsed_config = yaml.safe_load(file) return parsed_config def convert_from_config(config): diff --git a/test/pytest/test_cnn_mnist.py b/test/pytest/test_cnn_mnist.py index 274f25a547..2146e66bd6 100644 --- a/test/pytest/test_cnn_mnist.py +++ b/test/pytest/test_cnn_mnist.py @@ -37,7 +37,7 @@ def mnist_model(): def hls_model(settings): io_type = settings[0] strategy = settings[1] - config = yaml.load(open('../../example-models/config-files/qkeras_mnist_cnn_config.yml').read()) + config = yaml.safe_load(open('../../example-models/config-files/qkeras_mnist_cnn_config.yml').read()) config['KerasJson'] = '../../example-models/keras/qkeras_mnist_cnn.json' config['KerasH5'] = '../../example-models/keras/qkeras_mnist_cnn_weights.h5' config['OutputDir'] = 'hls4mlprj_cnn_mnist_{}_{}'.format(io_type, strategy) From d0ff8ba55a2a9a796cd4660f08ca27240db6702b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ghielmetti?= Date: Fri, 5 Nov 2021 13:57:29 +0100 Subject: [PATCH 044/102] `axi_stream_driver` update (#420) * Update `zcu102` and `pynq-z2` `axi-stream` driver --- .../python_drivers/axi_stream_driver.py | 68 ++++++++++--------- .../python_drivers/axi_stream_driver.py | 68 ++++++++++--------- 2 files changed, 72 insertions(+), 64 deletions(-) diff --git a/hls4ml/templates/vivado_accelerator/pynq-z2/python_drivers/axi_stream_driver.py b/hls4ml/templates/vivado_accelerator/pynq-z2/python_drivers/axi_stream_driver.py index 50104202a0..4adb187ab4 100644 --- a/hls4ml/templates/vivado_accelerator/pynq-z2/python_drivers/axi_stream_driver.py +++ b/hls4ml/templates/vivado_accelerator/pynq-z2/python_drivers/axi_stream_driver.py @@ -4,32 +4,36 @@ import pynq.lib.dma import numpy as np + class NeuralNetworkOverlay(Overlay): - def __init__(self, bitfile_name, dtbo=None, download=True, ignore_version=False, device=None): - - super().__init__(bitfile_name, dtbo=dtbo, download=download, ignore_version=ignore_version, device=device) - + def __init__(self, bitfile_name, x_shape, y_shape, dtype=np.float32, dtbo=None, download=True, ignore_version=False, + device=None): + super().__init__(bitfile_name, dtbo=None, download=True, ignore_version=False, device=None) + self.sendchannel = self.hier_0.axi_dma_0.sendchannel + self.recvchannel = self.hier_0.axi_dma_0.recvchannel + self.input_buffer = allocate(shape=x_shape, dtype=dtype) + self.output_buffer = allocate(shape=y_shape, dtype=dtype) + def _print_dt(self, timea, timeb, N): - dt = (timeb - timea) - dts = dt.seconds + dt.microseconds * 10**-6 + dt = (timeb - timea) + dts = dt.seconds + dt.microseconds * 10 ** -6 rate = N / dts print("Classified {} samples in {} seconds ({} inferences / s)".format(N, dts, rate)) return dts, rate - def predict(self, X, y_shape, dtype=np.float32, debug=None, profile=False, encode=None, decode=None): + + def predict(self, X, debug=False, profile=False, encode=None, decode=None): """ Obtain the predictions of the NN implemented in the FPGA. Parameters: - X : the input vector. Should be numpy ndarray. - - y_shape : the shape of the output vector. Needed to the accelerator to set the TLAST bit properly and - for sizing the output vector shape. - - dtype : the data type of the elements of the input/output vectors. - Note: it should be set depending on the interface of the accelerator; if it uses 'float' - types for the 'data' AXI-Stream field, 'np.float32' dtype is the correct one to use. + - dtype : the data type of the elements of the input/output vectors. + Note: it should be set depending on the interface of the accelerator; if it uses 'float' + types for the 'data' AXI-Stream field, 'np.float32' dtype is the correct one to use. Instead if it uses 'ap_fixed', 'np.intA' is the correct one to use (note that A cannot - any integer value, but it can assume {..., 8, 16, 32, ...} values. Check `numpy` + any integer value, but it can assume {..., 8, 16, 32, ...} values. Check `numpy` doc for more info). - In this case the encoding/decoding has to be computed by the PS. For example for - 'ap_fixed<16,6>' type the following 2 functions are the correct one to use for encode/decode + In this case the encoding/decoding has to be computed by the PS. For example for + 'ap_fixed<16,6>' type the following 2 functions are the correct one to use for encode/decode 'float' -> 'ap_fixed<16,6>': ``` def encode(xi): @@ -48,24 +52,24 @@ def decode(yi): timea = datetime.now() if encode is not None: X = encode(X) - with allocate(shape=X.shape, dtype=dtype) as input_buffer, \ - allocate(shape=y_shape, dtype=dtype) as output_buffer: - input_buffer[:] = X - self.hier_0.axi_dma_0.sendchannel.transfer(input_buffer) - self.hier_0.axi_dma_0.recvchannel.transfer(output_buffer) - if debug: - print("Transfer OK") - self.hier_0.axi_dma_0.sendchannel.wait() - if debug: - print("Send OK") - self.hier_0.axi_dma_0.recvchannel.wait() - if debug: - print("Receive OK") - result = output_buffer.copy() + self.input_buffer[:] = X + self.sendchannel.transfer(self.input_buffer) + self.recvchannel.transfer(self.output_buffer) + if debug: + print("Transfer OK") + self.sendchannel.wait() + if debug: + print("Send OK") + self.recvchannel.wait() + if debug: + print("Receive OK") + # result = self.output_buffer.copy() if decode is not None: - result = decode(result) + self.output_buffer = decode(self.output_buffer) + if profile: timeb = datetime.now() dts, rate = self._print_dt(timea, timeb, len(X)) - return result, dts, rate - return result \ No newline at end of file + return self.output_buffer, dts, rate + else: + return self.output_buffer \ No newline at end of file diff --git a/hls4ml/templates/vivado_accelerator/zcu102/python_drivers/axi_stream_driver.py b/hls4ml/templates/vivado_accelerator/zcu102/python_drivers/axi_stream_driver.py index 50104202a0..4adb187ab4 100644 --- a/hls4ml/templates/vivado_accelerator/zcu102/python_drivers/axi_stream_driver.py +++ b/hls4ml/templates/vivado_accelerator/zcu102/python_drivers/axi_stream_driver.py @@ -4,32 +4,36 @@ import pynq.lib.dma import numpy as np + class NeuralNetworkOverlay(Overlay): - def __init__(self, bitfile_name, dtbo=None, download=True, ignore_version=False, device=None): - - super().__init__(bitfile_name, dtbo=dtbo, download=download, ignore_version=ignore_version, device=device) - + def __init__(self, bitfile_name, x_shape, y_shape, dtype=np.float32, dtbo=None, download=True, ignore_version=False, + device=None): + super().__init__(bitfile_name, dtbo=None, download=True, ignore_version=False, device=None) + self.sendchannel = self.hier_0.axi_dma_0.sendchannel + self.recvchannel = self.hier_0.axi_dma_0.recvchannel + self.input_buffer = allocate(shape=x_shape, dtype=dtype) + self.output_buffer = allocate(shape=y_shape, dtype=dtype) + def _print_dt(self, timea, timeb, N): - dt = (timeb - timea) - dts = dt.seconds + dt.microseconds * 10**-6 + dt = (timeb - timea) + dts = dt.seconds + dt.microseconds * 10 ** -6 rate = N / dts print("Classified {} samples in {} seconds ({} inferences / s)".format(N, dts, rate)) return dts, rate - def predict(self, X, y_shape, dtype=np.float32, debug=None, profile=False, encode=None, decode=None): + + def predict(self, X, debug=False, profile=False, encode=None, decode=None): """ Obtain the predictions of the NN implemented in the FPGA. Parameters: - X : the input vector. Should be numpy ndarray. - - y_shape : the shape of the output vector. Needed to the accelerator to set the TLAST bit properly and - for sizing the output vector shape. - - dtype : the data type of the elements of the input/output vectors. - Note: it should be set depending on the interface of the accelerator; if it uses 'float' - types for the 'data' AXI-Stream field, 'np.float32' dtype is the correct one to use. + - dtype : the data type of the elements of the input/output vectors. + Note: it should be set depending on the interface of the accelerator; if it uses 'float' + types for the 'data' AXI-Stream field, 'np.float32' dtype is the correct one to use. Instead if it uses 'ap_fixed', 'np.intA' is the correct one to use (note that A cannot - any integer value, but it can assume {..., 8, 16, 32, ...} values. Check `numpy` + any integer value, but it can assume {..., 8, 16, 32, ...} values. Check `numpy` doc for more info). - In this case the encoding/decoding has to be computed by the PS. For example for - 'ap_fixed<16,6>' type the following 2 functions are the correct one to use for encode/decode + In this case the encoding/decoding has to be computed by the PS. For example for + 'ap_fixed<16,6>' type the following 2 functions are the correct one to use for encode/decode 'float' -> 'ap_fixed<16,6>': ``` def encode(xi): @@ -48,24 +52,24 @@ def decode(yi): timea = datetime.now() if encode is not None: X = encode(X) - with allocate(shape=X.shape, dtype=dtype) as input_buffer, \ - allocate(shape=y_shape, dtype=dtype) as output_buffer: - input_buffer[:] = X - self.hier_0.axi_dma_0.sendchannel.transfer(input_buffer) - self.hier_0.axi_dma_0.recvchannel.transfer(output_buffer) - if debug: - print("Transfer OK") - self.hier_0.axi_dma_0.sendchannel.wait() - if debug: - print("Send OK") - self.hier_0.axi_dma_0.recvchannel.wait() - if debug: - print("Receive OK") - result = output_buffer.copy() + self.input_buffer[:] = X + self.sendchannel.transfer(self.input_buffer) + self.recvchannel.transfer(self.output_buffer) + if debug: + print("Transfer OK") + self.sendchannel.wait() + if debug: + print("Send OK") + self.recvchannel.wait() + if debug: + print("Receive OK") + # result = self.output_buffer.copy() if decode is not None: - result = decode(result) + self.output_buffer = decode(self.output_buffer) + if profile: timeb = datetime.now() dts, rate = self._print_dt(timea, timeb, len(X)) - return result, dts, rate - return result \ No newline at end of file + return self.output_buffer, dts, rate + else: + return self.output_buffer \ No newline at end of file From ba3902f43413e67ae3d4ebc6994958a0163ea286 Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Tue, 9 Nov 2021 01:11:47 -0800 Subject: [PATCH 045/102] Reshape fixes: don't repack stream for flatten; remove final reshape (#443) * fix 2 reshape issues: don't reshape streams for flatten and remove final reshape * Add a test for a model with Reshape as the final layer * swap * only remove for io_parallel; warn for both io_parallel and io_stream Co-authored-by: Sioni Summers --- hls4ml/model/optimizer/__init__.py | 3 +- .../model/optimizer/passes/repack_stream.py | 19 ++++++++++- test/pytest/test_graph.py | 32 +++++++++++++++++++ 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/hls4ml/model/optimizer/__init__.py b/hls4ml/model/optimizer/__init__.py index 04bd24b35a..19915b553e 100644 --- a/hls4ml/model/optimizer/__init__.py +++ b/hls4ml/model/optimizer/__init__.py @@ -12,7 +12,7 @@ from hls4ml.model.optimizer.passes.conv_same_pad import InsertZeroPaddingBeforeConv2D from hls4ml.model.optimizer.passes.pointwise import OptimizePointwiseConv from hls4ml.model.optimizer.passes.clone import CloneOutput -from hls4ml.model.optimizer.passes.repack_stream import ReshapeStream, BroadcastStream +from hls4ml.model.optimizer.passes.repack_stream import ReshapeStream, BroadcastStream, RemoveFinalReshape from hls4ml.model.optimizer.passes.transpose_opt import RemoveUselessTranspose from hls4ml.model.optimizer.passes.multi_dense import ReplaceMultidimensionalDenseWithConv @@ -40,6 +40,7 @@ register_pass('conv2d_same_pad', InsertZeroPaddingBeforeConv2D) register_pass('optimize_pointwise_conv', OptimizePointwiseConv) register_pass('clone_output', CloneOutput) +register_pass('remove_final_reshape', RemoveFinalReshape) register_pass('reshape_stream', ReshapeStream) register_pass('remove_useless_transpose', RemoveUselessTranspose) register_pass('replace_multidense_conv', ReplaceMultidimensionalDenseWithConv) diff --git a/hls4ml/model/optimizer/passes/repack_stream.py b/hls4ml/model/optimizer/passes/repack_stream.py index f54a264c9d..de2e298419 100644 --- a/hls4ml/model/optimizer/passes/repack_stream.py +++ b/hls4ml/model/optimizer/passes/repack_stream.py @@ -71,7 +71,8 @@ def config_cpp(self): class ReshapeStream(OptimizerPass): ''' Repacks stream for Reshape layer ''' def match(self, node): - return node.__class__.__name__ == 'Reshape' + # do not run optimizer pass for a flatten layer (1 output dimension) + return node.__class__.__name__ == 'Reshape' and len(node.get_output_variable().shape) > 1 def transform(self, model, node): if model.config.backend.name not in ['Vivado', 'VivadoAccelerator'] or \ @@ -121,3 +122,19 @@ def transform(self, model, node): node.inputs[idx] = brdcst_out return True + +class RemoveFinalReshape(OptimizerPass): + ''' Remove reshape if final layer ''' + def match(self, node): + # match if reshape is final node + return node.__class__.__name__ == 'Reshape' and not node.get_output_nodes() + + def transform(self, model, node): + if model.config.get_config_value('IOType') == 'io_parallel': + print('WARNING: Final layer is a Reshape, which does not affect the output for io_parallel; removing it') + # remove, but don't rewire because it's the output layer + model.remove_node(node, rewire=False) + return True + elif model.config.get_config_value('IOType') == 'io_stream': + print('WARNING: Final layer is a Reshape, which may incur a large resource cost for io_stream; consider removing it') + return False diff --git a/test/pytest/test_graph.py b/test/pytest/test_graph.py index b25d104a2d..8f9e62f4b8 100644 --- a/test/pytest/test_graph.py +++ b/test/pytest/test_graph.py @@ -1,6 +1,7 @@ import hls4ml import numpy as np import pytest +import tensorflow as tf class Reader: def get_weights_data(self, name, var): @@ -107,3 +108,34 @@ def test_graph_branch(iotype, batch): y = model.predict([X0, X1]).reshape(y_expected.shape) # check the output np.testing.assert_allclose(y, y_expected, rtol=1, atol=2**-16) + +@pytest.mark.parametrize('iotype', ['io_parallel', 'io_stream']) +def test_final_reshape(iotype): + ''' Test case for a model with a Reshape as the final layer ''' + inputs = tf.keras.layers.Input(shape=(1,1,1)) # 1 input pixel + conv = tf.keras.layers.Conv2D(6,1) # 6 filters, 1x1 kernel + x = conv(inputs) + conv.set_weights([np.linspace(1,6,6).reshape(1,1,1,6), np.zeros(6)]) # ascending int weights, 0 bias + x = tf.keras.layers.Reshape((3,2))(x) # reshape the (1,1,6) output to (3,2) + model = tf.keras.models.Model(inputs=inputs, outputs=x) + + # create the HLSModel + config = hls4ml.utils.config_from_keras_model(model, granularity='model') + hls_model = hls4ml.converters.convert_from_keras_model(model, + output_dir=f'hls4mlprj_graph_final_reshape_{iotype}', + backend='Vivado', + io_type = iotype, + hls_config=config) + hls_model.compile() + + # Test on ascending integers. The weights mean that each output pixel/neuron has + # a different value + X = np.linspace(-4,4,9).reshape(9,1,1,1) + y = model.predict(X) + y_hls = hls_model.predict(X).reshape(y.shape) + # because of integer inputs and integer weights, we can expect exact matching + np.testing.assert_allclose(y, y_hls, rtol=0) + + + + From 86e4397efcd704686bf608115387024b119a3b5e Mon Sep 17 00:00:00 2001 From: Sioni Summers Date: Tue, 9 Nov 2021 18:29:41 +0100 Subject: [PATCH 046/102] Reorder loops in im2col_2d_cl given resource strategy issue. Reenable relevant test. Use 5000 MNIST samples rather than full dataset for faster testing --- .../vivado/nnet_utils/nnet_conv2d_resource.h | 13 +++++-------- test/pytest/test_cnn_mnist.py | 5 +++-- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/hls4ml/templates/vivado/nnet_utils/nnet_conv2d_resource.h b/hls4ml/templates/vivado/nnet_utils/nnet_conv2d_resource.h index a146784550..a251051285 100644 --- a/hls4ml/templates/vivado/nnet_utils/nnet_conv2d_resource.h +++ b/hls4ml/templates/vivado/nnet_utils/nnet_conv2d_resource.h @@ -154,20 +154,18 @@ void im2col_2d_cl( const int col) { int index = 0; - for (int channel = CONFIG_T::n_chan; channel--; data++) { + for (int kernel_row = 0; kernel_row < CONFIG_T::filt_height; kernel_row++) { #pragma HLS UNROLL - for (int kernel_row = 0; kernel_row < CONFIG_T::filt_height; kernel_row++) { - int input_row = -CONFIG_T::pad_top + kernel_row * CONFIG_T::dilation_height + row * CONFIG_T::stride_height; - for (int kernel_col = 0; kernel_col < CONFIG_T::filt_width; kernel_col++) { + int input_row = -CONFIG_T::pad_top + kernel_row * CONFIG_T::dilation_height + row * CONFIG_T::stride_height; + for (int kernel_col = 0; kernel_col < CONFIG_T::filt_width; kernel_col++) { + for (int channel = 0; channel < CONFIG_T::n_chan; channel++) { if (input_row < 0 || input_row >= CONFIG_T::in_height) { data_col[index++] = 0; } else { int input_col = -CONFIG_T::pad_left + kernel_col * CONFIG_T::dilation_width + col * CONFIG_T::stride_width; if (input_col >= 0 && input_col < CONFIG_T::in_width) { - //*(data_col++) = data[input_row * CONFIG_T::in_width * CONFIG_T::n_chan + input_col * CONFIG_T::n_chan]; - data_col[index++] = data[input_row * CONFIG_T::in_width * CONFIG_T::n_chan + input_col * CONFIG_T::n_chan]; + data_col[index++] = data[input_row * CONFIG_T::in_width * CONFIG_T::n_chan + input_col * CONFIG_T::n_chan + channel]; } else { - //*(data_col++) = 0; data_col[index++] = 0; } } @@ -209,7 +207,6 @@ void conv_2d_resource_cl( FiltLoop: for (int k = 0; k < CONFIG_T::n_filt; k++) { res[i * CONFIG_T::out_width * CONFIG_T::n_filt + j * CONFIG_T::n_filt + k] = res_col[k]; - //res[k * CONFIG_T::out_height * CONFIG_T::out_width + i * CONFIG_T::out_width + j] = res_col[k]; // Transposed order } } } diff --git a/test/pytest/test_cnn_mnist.py b/test/pytest/test_cnn_mnist.py index 2146e66bd6..2397def2a9 100644 --- a/test/pytest/test_cnn_mnist.py +++ b/test/pytest/test_cnn_mnist.py @@ -28,10 +28,9 @@ def mnist_model(): model.load_weights('../../example-models/keras/qkeras_mnist_cnn_weights.h5') return model -# TODO: add ('io_parallel', 'resource') when it can pass -# https://github.com/fastmachinelearning/hls4ml/issues/375 @pytest.fixture @pytest.mark.parametrize('settings', [('io_parallel', 'latency'), + ('io_parallel', 'resource'), ('io_stream', 'latency'), ('io_stream', 'resource')]) def hls_model(settings): @@ -49,10 +48,12 @@ def hls_model(settings): return hls_model @pytest.mark.parametrize('settings', [('io_parallel', 'latency'), + ('io_parallel', 'resource'), ('io_stream', 'latency'), ('io_stream', 'resource')]) def test_accuracy(mnist_data, mnist_model, hls_model): x_train, y_train, x_test, y_test = mnist_data + x_test, y_test = x_test[:5000], y_test[:5000] model = mnist_model # model under test predictions and accuracy y_keras = model.predict(x_test) From 36cd38c82a10336215ce9ad059d678dbb38814c3 Mon Sep 17 00:00:00 2001 From: vloncar Date: Thu, 11 Nov 2021 16:04:18 +0100 Subject: [PATCH 047/102] Support applying Softmax over multidimensional tensors (#384) * Support softmax over multidimensional tensors * Style cleanup * Added axis part in keras_to_hls.py * Added some extensions to test_softmax.py but multidimensional softmax is still getting bad performances (i.e. below the one set in the assertion) * Clean up the softmax test * Make sure io_parallel softmax is not used on multi-dim input Co-authored-by: nicologhielmetti --- hls4ml/converters/keras/core.py | 10 +- hls4ml/converters/keras_to_hls.py | 1 + hls4ml/model/hls_layers.py | 3 + .../vivado/nnet_utils/nnet_activation.h | 129 ++++++++-------- .../nnet_utils/nnet_activation_stream.h | 146 ++++++++---------- hls4ml/templates/vivado_template.py | 1 + test/pytest/test_softmax.py | 77 +++++---- 7 files changed, 183 insertions(+), 184 deletions(-) diff --git a/hls4ml/converters/keras/core.py b/hls4ml/converters/keras/core.py index 3cfd33cf84..bb5ac5ec97 100644 --- a/hls4ml/converters/keras/core.py +++ b/hls4ml/converters/keras/core.py @@ -86,18 +86,18 @@ def parse_activation_layer(keras_layer, input_names, input_shapes, data_reader, if layer['class_name'] != 'Activation': layer['activation'] = layer['class_name'] if layer['class_name'] == 'LeakyReLU': - layer['activ_param'] = keras_layer["config"].get('alpha', 0.3) + layer['activ_param'] = keras_layer['config'].get('alpha', 0.3) elif layer['class_name'] == 'ThresholdedReLU': - layer['activ_param'] = keras_layer["config"].get('theta', 1.) + layer['activ_param'] = keras_layer['config'].get('theta', 1.) elif layer['class_name'] == 'ELU': - layer['activ_param'] = keras_layer["config"].get('alpha', 1.) + layer['activ_param'] = keras_layer['config'].get('alpha', 1.) elif layer['class_name'] == 'ReLU': layer['class_name'] = 'Activation' if layer['class_name'] == 'Activation' and layer['activation'] == 'softmax': layer['class_name'] = 'Softmax' - if layer['class_name'] == 'ReLU': - layer['class_name'] = 'Activation' + if layer['class_name'] == 'Softmax': + layer['axis'] = keras_layer['config'].get('axis', -1) return layer, [shape for shape in input_shapes[0]] diff --git a/hls4ml/converters/keras_to_hls.py b/hls4ml/converters/keras_to_hls.py index 44c8c4b295..1911545dcb 100644 --- a/hls4ml/converters/keras_to_hls.py +++ b/hls4ml/converters/keras_to_hls.py @@ -319,6 +319,7 @@ def keras_to_hls(config): act_layer['class_name'] = layer['activation'] elif layer['activation'] == 'softmax': act_layer['class_name'] = 'Softmax' + act_layer['axis'] = -1 else: act_layer['class_name'] = 'Activation' inputs_map[layer['name']] = act_layer['name'] diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index c1cca50700..c730d60ffd 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -1384,6 +1384,9 @@ def initialize(self): self.set_attr('implementation', 'latency') else: self.set_attr('implementation', self.model.config.get_strategy(self).lower()) + + if self.model.config.get_config_value('IOType') == 'io_parallel': + assert len(self.get_input_variable().shape) == 1, 'Softmax with io_parallel strategy cannot be used on multidimensional tensors.' class TernaryTanh(Activation): def initialize(self): diff --git a/hls4ml/templates/vivado/nnet_utils/nnet_activation.h b/hls4ml/templates/vivado/nnet_utils/nnet_activation.h index 3b195cddcf..83f73ad89e 100644 --- a/hls4ml/templates/vivado/nnet_utils/nnet_activation.h +++ b/hls4ml/templates/vivado/nnet_utils/nnet_activation.h @@ -243,11 +243,11 @@ void softmax_latency(data_T data[CONFIG_T::n_in], res_T res[CONFIG_T::n_in]){ // Calculate all the e^x's typename CONFIG_T::exp_table_t exp_res[CONFIG_T::n_in]; - #pragma HLS array_partition variable=exp_res complete + #pragma HLS array_partition variable=exp_res complete typename CONFIG_T::exp_table_t exp_sum(0); for(unsigned i = 0; i < CONFIG_T::n_in; i++){ #pragma HLS unroll - unsigned x = softmax_idx_from_real_val(data[i]); + unsigned x = softmax_idx_from_real_val(data[i]); exp_res[i] = exp_table[x]; } @@ -298,11 +298,11 @@ void softmax_stable(data_T data[CONFIG_T::n_in], res_T res[CONFIG_T::n_in]){ // Calculate all the e^x's typename CONFIG_T::exp_table_t exp_res[CONFIG_T::n_in]; - #pragma HLS array_partition variable=exp_res complete + #pragma HLS array_partition variable=exp_res complete typename CONFIG_T::exp_table_t exp_sum(0); for(unsigned i = 0; i < CONFIG_T::n_in; i++){ #pragma HLS unroll - unsigned x = softmax_idx_from_real_val(d_xi_xmax[i]); + unsigned x = softmax_idx_from_real_val(d_xi_xmax[i]); exp_res[i] = exp_table[x]; } @@ -337,11 +337,11 @@ void init_invert_table_legacy(typename CONFIG_T::table_t table_out[N_TABLE]) // Inversion function: // result = 1/x for (int ii = 0; ii < N_TABLE; ii++) { - // First, convert from table index to X-value (signed 8-bit, range 0 to +64) - float in_val = 64.0*ii/float(N_TABLE); + // First, convert from table index to X-value (signed 8-bit, range 0 to +64) + float in_val = 64.0*ii/float(N_TABLE); // Next, compute lookup table function - if (in_val > 0.0) table_out[ii] = 1.0/in_val; - else table_out[ii] = 0.0; + if (in_val > 0.0) table_out[ii] = 1.0/in_val; + else table_out[ii] = 0.0; } } @@ -376,33 +376,34 @@ void softmax_legacy(data_T data[CONFIG_T::n_in], res_T res[CONFIG_T::n_in]) int data_round; int index; for (int ii=0; ii CONFIG_T::table_size-1) index = CONFIG_T::table_size-1; - exp_diff_res = exp_table[index]; - } - exp_res[ii] += exp_diff_res; - } + if (CONFIG_T::io_type == io_serial) { + #pragma HLS PIPELINE + } + for (int jj=0; jj CONFIG_T::table_size-1) index = CONFIG_T::table_size-1; + exp_diff_res = exp_table[index]; + } + exp_res[ii] += exp_diff_res; + } } //Second loop to invert for (int ii=0; ii CONFIG_T::table_size-1) exp_res_index = CONFIG_T::table_size-1; - //typename CONFIG_T::table_t exp_res_invert = invert_table[exp_res_index]; - res[ii] = (res_T) invert_table[exp_res_index]; + int exp_res_index = exp_res[ii]*CONFIG_T::table_size/64; + if (exp_res_index < 0) exp_res_index = 0; + if (exp_res_index > CONFIG_T::table_size-1) exp_res_index = CONFIG_T::table_size-1; + //typename CONFIG_T::table_t exp_res_invert = invert_table[exp_res_index]; + res[ii] = (res_T) invert_table[exp_res_index]; } } @@ -420,7 +421,7 @@ void softmax(data_T data[CONFIG_T::n_in], res_T res[CONFIG_T::n_in]){ case softmax_implementation::legacy: softmax_legacy(data, res); break; - } + } } // ************************************************* @@ -720,7 +721,7 @@ void elu(data_T data[CONFIG_T::n_in], const res_T alpha, res_T res[CONFIG_T::n_ template void elu(data_T data[CONFIG_T::n_in], res_T res[CONFIG_T::n_in]) { - elu(data, 1.0, res); + elu(data, 1.0, res); } // ************************************************* @@ -810,26 +811,22 @@ void prelu(data_T data[CONFIG_T::n_in], data_T alpha[CONFIG_T::n_in], res_T res template void binary_tanh(data_T data[CONFIG_T::n_in], res_T res[CONFIG_T::n_in]) { + if (CONFIG_T::io_type == io_parallel){ + #pragma HLS PIPELINE + } - if (CONFIG_T::io_type == io_parallel){ - #pragma HLS PIPELINE - } - - data_T datareg; - res_T cache; - for (int ii=0; ii 0 ) cache = 1; - else cache = -1; - - res[ii] = (res_T) cache; - - } - + data_T datareg; + res_T cache; + for (int ii=0; ii 0 ) cache = 1; + else cache = -1; + + res[ii] = (res_T) cache; + } } // ************************************************* @@ -839,25 +836,23 @@ template void ternary_tanh(data_T data[CONFIG_T::n_in], res_T res[CONFIG_T::n_in]) { - if (CONFIG_T::io_type == io_parallel){ - #pragma HLS PIPELINE - } + if (CONFIG_T::io_type == io_parallel){ + #pragma HLS PIPELINE + } - data_T datareg; - res_T cache; - for (int ii=0; ii 1 ) cache = 1; - else if( datareg > -1 && datareg <= 1) cache=0; - else cache = -1; + data_T datareg; + res_T cache; + for (int ii=0; ii 1 ) cache = 1; + else if( datareg > -1 && datareg <= 1) cache=0; + else cache = -1; - res[ii] = (res_T) cache; - - } + res[ii] = (res_T) cache; + } } diff --git a/hls4ml/templates/vivado/nnet_utils/nnet_activation_stream.h b/hls4ml/templates/vivado/nnet_utils/nnet_activation_stream.h index 09968ad449..e2138039a0 100644 --- a/hls4ml/templates/vivado/nnet_utils/nnet_activation_stream.h +++ b/hls4ml/templates/vivado/nnet_utils/nnet_activation_stream.h @@ -139,40 +139,36 @@ void softmax_latency(hls::stream &data, hls::stream &res){ initialized = true; } - constexpr unsigned multiplier_limit = DIV_ROUNDUP(CONFIG_T::n_in, CONFIG_T::reuse_factor); - constexpr unsigned ii = CONFIG_T::n_in / multiplier_limit; + constexpr unsigned multiplier_limit = DIV_ROUNDUP(data_T::size, CONFIG_T::reuse_factor); + constexpr unsigned ii = data_T::size / multiplier_limit; // Calculate all the e^x's - typename CONFIG_T::exp_table_t exp_res[CONFIG_T::n_in]; + typename CONFIG_T::exp_table_t exp_res[data_T::size]; #pragma HLS array_partition variable=exp_res complete typename CONFIG_T::exp_table_t exp_sum(0); SoftmaxExpLoop: for(unsigned i = 0; i < CONFIG_T::n_in / data_T::size; i++){ - if (CONFIG_T::n_in / data_T::size > 1) { - #pragma HLS PIPELINE - } + #pragma HLS PIPELINE II=ii + data_T in_pack = data.read(); SoftmaxExpPackLoop: for(unsigned j = 0; j < data_T::size; j++){ #pragma HLS UNROLL unsigned x = softmax_idx_from_real_val(in_pack[j]); - exp_res[i * data_T::size + j] = exp_table[x]; + exp_res[j] = exp_table[x]; } - } - // Explicitly sum the results with an adder tree. - // Rounding & Saturation mode, which improve accuracy, prevent Vivado from expression balancing - Op_add op_add; - exp_sum = reduce>(exp_res, op_add); + // Explicitly sum the results with an adder tree. + // Rounding & Saturation mode, which improve accuracy, prevent Vivado from expression balancing + Op_add op_add; + exp_sum = reduce>(exp_res, op_add); - typename CONFIG_T::inv_table_t inv_exp_sum = invert_table[softmax_idx_from_real_val(exp_sum)]; - SoftmaxInvLoop: for(unsigned i = 0; i < CONFIG_T::n_in / res_T::size; i++){ - #pragma HLS PIPELINE II=ii + typename CONFIG_T::inv_table_t inv_exp_sum = invert_table[softmax_idx_from_real_val(exp_sum)]; res_T out_pack; #pragma HLS DATA_PACK variable=out_pack SoftmaxInvPackLoop: for(unsigned j = 0; j < res_T::size; j++){ #pragma HLS UNROLL #pragma HLS ALLOCATION instances=mul limit=multiplier_limit operation - out_pack[i * res_T::size + j] = exp_res[i * res_T::size + j] * inv_exp_sum; + out_pack[j] = exp_res[j] * inv_exp_sum; } res.write(out_pack); } @@ -199,58 +195,54 @@ void softmax_stable(hls::stream &data, hls::stream &res){ initialized = true; } - constexpr unsigned multiplier_limit = DIV_ROUNDUP(CONFIG_T::n_in, CONFIG_T::reuse_factor); - constexpr unsigned ii = CONFIG_T::n_in / multiplier_limit; + constexpr unsigned multiplier_limit = DIV_ROUNDUP(data_T::size, CONFIG_T::reuse_factor); + constexpr unsigned ii = data_T::size / multiplier_limit; - typename data_T::value_type data_array[CONFIG_T::n_in]; + typename data_T::value_type data_array[data_T::size]; #pragma HLS ARRAY_PARTITION variable=data_array complete SoftmaxArrayLoop: for(unsigned i = 0; i < CONFIG_T::n_in / data_T::size; i++){ - if (CONFIG_T::n_in / data_T::size > 1) { - #pragma HLS PIPELINE - } + #pragma HLS PIPELINE II=ii + data_T in_pack = data.read(); SoftmaxArrayPackLoop: for(unsigned j = 0; j < data_T::size; j++){ #pragma HLS UNROLL - data_array[i * data_T::size + j] = in_pack[j]; + data_array[j] = in_pack[j]; } - } - // Find the max and compute all delta(x_i, x_max) - Op_max op_max; - typename data_T::value_type x_max = reduce>(data_array, op_max); + // Find the max and compute all delta(x_i, x_max) + Op_max op_max; + typename data_T::value_type x_max = reduce>(data_array, op_max); - // For the diffs, use the same type as the input but force rounding and saturation - ap_fixed d_xi_xmax[CONFIG_T::n_in]; - for(unsigned i = 0; i < CONFIG_T::n_in; i++){ - #pragma HLS UNROLL - d_xi_xmax[i] = data_array[i] - x_max; - } + // For the diffs, use the same type as the input but force rounding and saturation + ap_fixed d_xi_xmax[data_T::size]; + for(unsigned j = 0; j < data_T::size; j++){ + #pragma HLS UNROLL + d_xi_xmax[j] = data_array[j] - x_max; + } - // Calculate all the e^x's - typename CONFIG_T::exp_table_t exp_res[CONFIG_T::n_in]; - #pragma HLS ARRAY_PARTITION variable=exp_res complete - typename CONFIG_T::exp_table_t exp_sum(0); - for(unsigned i = 0; i < CONFIG_T::n_in; i++){ - #pragma HLS UNROLL - unsigned x = softmax_idx_from_real_val(d_xi_xmax[i]); - exp_res[i] = exp_table[x]; - } + // Calculate all the e^x's + typename CONFIG_T::exp_table_t exp_res[data_T::size]; + #pragma HLS ARRAY_PARTITION variable=exp_res complete + typename CONFIG_T::exp_table_t exp_sum(0); + for(unsigned j = 0; j < data_T::size; j++){ + #pragma HLS UNROLL + unsigned x = softmax_idx_from_real_val(d_xi_xmax[j]); + exp_res[j] = exp_table[x]; + } - // Explicitly sum the results with an adder tree. - // Rounding & Saturation mode, which improve accuracy, prevent Vivado from expression balancing - Op_add op_add; - exp_sum = reduce>(exp_res, op_add); + // Explicitly sum the results with an adder tree. + // Rounding & Saturation mode, which improve accuracy, prevent Vivado from expression balancing + Op_add op_add; + exp_sum = reduce>(exp_res, op_add); - typename CONFIG_T::inv_table_t inv_exp_sum = invert_table[softmax_idx_from_real_val(exp_sum)]; - SoftmaxInvLoop: for(unsigned i = 0; i < CONFIG_T::n_in / res_T::size; i++){ - #pragma HLS PIPELINE II=ii + typename CONFIG_T::inv_table_t inv_exp_sum = invert_table[softmax_idx_from_real_val(exp_sum)]; res_T out_pack; #pragma HLS DATA_PACK variable=out_pack SoftmaxInvPackLoop: for(unsigned j = 0; j < res_T::size; j++){ #pragma HLS UNROLL #pragma HLS ALLOCATION instances=mul limit=multiplier_limit operation - out_pack[i * res_T::size + j] = exp_res[i * res_T::size + j] * inv_exp_sum; + out_pack[j] = exp_res[j] * inv_exp_sum; } res.write(out_pack); } @@ -275,52 +267,48 @@ void softmax_legacy(hls::stream &data, hls::stream &res) { } // Index into the lookup table based on data for exponentials - typename CONFIG_T::table_t exp_res[CONFIG_T::n_in]; + typename CONFIG_T::table_t exp_res[data_T::size]; typename CONFIG_T::table_t exp_diff_res; - typename data_T::value_type data_cache[CONFIG_T::n_in]; + typename data_T::value_type data_cache[data_T::size]; - SoftmaxInitLoop: for(unsigned i = 0; i < CONFIG_T::n_in / data_T::size; i++) { + SoftmaxInitLoop: for(unsigned s = 0; s < CONFIG_T::n_in / data_T::size; s++) { #pragma HLS PIPELINE data_T in_pack = data.read(); SoftmaxInitPackLoop: for(unsigned j = 0; j < data_T::size; j++) { #pragma HLS UNROLL - data_cache[i * data_T::size + j] = in_pack[j]; - exp_res[i * data_T::size + j] = 0; + data_cache[j] = in_pack[j]; + exp_res[j] = 0; } - } - SoftmaxExpLoop: for (int i = 0; i < CONFIG_T::n_in; i++) { - #pragma HLS PIPELINE - SoftmaxExpInner: for (int j = 0; j < CONFIG_T::n_in; j++) { + SoftmaxExpLoop: for (int i = 0; i < data_T::size; i++) { #pragma HLS UNROLL - - if (i == j) { - exp_diff_res = 1; - } else { - int data_round = (data_cache[j] - data_cache[i]) * CONFIG_T::table_size / 16; - int index = data_round + 8 * CONFIG_T::table_size / 16; - if (index < 0) index = 0; - if (index > CONFIG_T::table_size - 1) index = CONFIG_T::table_size - 1; - exp_diff_res = exp_table[index]; + SoftmaxExpInner: for (int j = 0; j < data_T::size; j++) { + #pragma HLS UNROLL + + if (i == j) { + exp_diff_res = 1; + } else { + int data_round = (data_cache[j] - data_cache[i]) * CONFIG_T::table_size / 16; + int index = data_round + 8 * CONFIG_T::table_size / 16; + if (index < 0) index = 0; + if (index > CONFIG_T::table_size - 1) index = CONFIG_T::table_size - 1; + exp_diff_res = exp_table[index]; + } + + exp_res[i] += exp_diff_res; } - - exp_res[i] += exp_diff_res; } - } - - SoftmaxInvLoop: for(unsigned i = 0; i < CONFIG_T::n_in / res_T::size; i++) { - #pragma HLS PIPELINE res_T out_pack; #pragma HLS DATA_PACK variable=out_pack SoftmaxInvPackLoop: for(unsigned j = 0; j < res_T::size; j++) { #pragma HLS UNROLL - - int exp_res_index = exp_res[i * res_T::size + j] * CONFIG_T::table_size / 64; + + int exp_res_index = exp_res[j] * CONFIG_T::table_size / 64; if (exp_res_index < 0) exp_res_index = 0; if (exp_res_index > CONFIG_T::table_size - 1) exp_res_index = CONFIG_T::table_size - 1; - - out_pack[i * res_T::size + j] = (typename res_T::value_type) invert_table[exp_res_index]; + + out_pack[j] = (typename res_T::value_type) invert_table[exp_res_index]; } res.write(out_pack); } @@ -328,6 +316,8 @@ void softmax_legacy(hls::stream &data, hls::stream &res) { template void softmax(hls::stream &data, hls::stream &res){ + assert(CONFIG_T::axis == -1); + switch(CONFIG_T::implementation){ case softmax_implementation::latency: softmax_latency(data, res); diff --git a/hls4ml/templates/vivado_template.py b/hls4ml/templates/vivado_template.py index 5b1c3b03c8..149b52f1d5 100644 --- a/hls4ml/templates/vivado_template.py +++ b/hls4ml/templates/vivado_template.py @@ -121,6 +121,7 @@ static const unsigned table_size = {table_size}; static const unsigned io_type = nnet::{iotype}; static const unsigned reuse_factor = {reuse}; + static const unsigned axis = {axis}; static const nnet::softmax_implementation implementation = nnet::softmax_implementation::{implementation}; typedef {exp_table_t} exp_table_t; typedef {inv_table_t} inv_table_t; diff --git a/test/pytest/test_softmax.py b/test/pytest/test_softmax.py index 5263a55ba4..ef98902cc9 100644 --- a/test/pytest/test_softmax.py +++ b/test/pytest/test_softmax.py @@ -4,42 +4,51 @@ import pytest from sklearn.metrics import accuracy_score -def flat_distribution(N, M): - return np.random.rand(N, M) -def high_accuracy_distribution(N, M): - '''Start with a flat distribution, then pick a random member of each row to amplify''' - x = np.random.rand(N, M) - imax = np.random.randint(0,M,size=N) - x[:,imax] *= 10 - return x +def flat_distribution(shape): + return np.random.rand(*shape) + + +def high_accuracy_distribution(shape): + '''Start with a flat distribution, then pick a random member of each row to amplify''' + x = np.random.rand(*shape) + imax = np.random.randint(0, shape[1], size=shape[0]) + x[:, imax] *= 10 + return x + @pytest.fixture() -def generate_data(function): - return function(1000,8) +def generate_data(function, input_shape): + return function((1000, *input_shape)) + # TODO: include latency strategy with flat_distribution when it can be made to pass -#@pytest.mark.parametrize('strategy,function', [('latency', flat_distribution), -# ('stable', flat_distribution), -# ('stable', high_accuracy_distribution)]) -@pytest.mark.parametrize('strategy,function', [('stable', flat_distribution), - ('stable', high_accuracy_distribution)]) -def test_softmax(strategy, generate_data): - X = generate_data - model = tf.keras.models.Sequential() - model.add(tf.keras.layers.Activation(input_shape=(8,), activation='softmax', name='softmax')) - model.compile() - cfg = hls4ml.utils.config_from_keras_model(model, granularity='name') - cfg['LayerName']['softmax']['Strategy'] = strategy - cfg['LayerName']['softmax']['inv_table_t'] = 'ap_fixed<18,8,AP_RND,AP_SAT>' - cfg['LayerName']['softmax']['exp_table_t'] = 'ap_fixed<18,8,AP_RND,AP_SAT>' - hls_model = hls4ml.converters.convert_from_keras_model(model, hls_config=cfg, output_dir='hls4mlprj_softmax_{}'.format(strategy)) - hls_model.compile() - y_keras = model.predict(X) - y_hls4ml = hls_model.predict(X) - - acc_hls4ml = accuracy_score(np.argmax(y_keras, axis=1), np.argmax(y_hls4ml, axis=1)) - - print('Accuracy hls4ml relative to keras: {}'.format(acc_hls4ml)) - - assert acc_hls4ml >= 0.98 +@pytest.mark.parametrize('strategy,function,input_shape,io_type', [#('latency', flat_distribution, (8,), 'io_parallel'), + #('latency', flat_distribution, (8, 8, 3), 'io_stream'), + ('stable', flat_distribution, (8,), 'io_parallel'), + ('stable', high_accuracy_distribution, (8,), 'io_parallel'), + ('stable', flat_distribution, (8,), 'io_stream'), + ('stable', high_accuracy_distribution, (8,), 'io_stream'), + # Multi-dimensional tests, only for io_stream for now + ('stable', flat_distribution, (8, 8, 3), 'io_stream'), + ('stable', high_accuracy_distribution, (8, 8, 3), 'io_stream')]) +def test_softmax(strategy, generate_data, input_shape, io_type): + X = generate_data + model = tf.keras.models.Sequential() + model.add(tf.keras.layers.Activation(input_shape=input_shape, activation='softmax', name='softmax')) + model.compile() + cfg = hls4ml.utils.config_from_keras_model(model, granularity='name') + cfg['LayerName']['softmax']['Strategy'] = strategy + cfg['LayerName']['softmax']['inv_table_t'] = 'ap_fixed<18,8,AP_RND,AP_SAT>' + cfg['LayerName']['softmax']['exp_table_t'] = 'ap_fixed<18,8,AP_RND,AP_SAT>' + hls_model = hls4ml.converters.convert_from_keras_model(model, hls_config=cfg, io_type=io_type, + output_dir='hls4mlprj_softmax_{}'.format(strategy)) + hls_model.compile() + y_keras = model.predict(X) + y_hls4ml = hls_model.predict(X).reshape(y_keras.shape) + + acc_hls4ml = accuracy_score(np.argmax(y_keras, axis=-1).ravel(), np.argmax(y_hls4ml, axis=-1).ravel()) + + print('Accuracy hls4ml relative to keras: {}'.format(acc_hls4ml)) + + assert acc_hls4ml >= 0.98 From 9f5c249bcef9ed2ea5e1e4388071c2f3b23a854a Mon Sep 17 00:00:00 2001 From: Sioni Summers Date: Tue, 9 Nov 2021 16:08:29 +0100 Subject: [PATCH 048/102] Disable some unsupported layers --- hls4ml/converters/onnx/core.py | 5 ++++- hls4ml/converters/pytorch/core.py | 9 +++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/hls4ml/converters/onnx/core.py b/hls4ml/converters/onnx/core.py index 208fae7caf..985d941549 100644 --- a/hls4ml/converters/onnx/core.py +++ b/hls4ml/converters/onnx/core.py @@ -23,7 +23,10 @@ def parse_gemm_layer(reader, node, inputs_map, input_shapes, graph, config): return layer, output_shape #------------------Global paras for activations -activation_layers = ['Relu', 'Tanh', 'Sigmoid', 'LeakyRelu', 'ThresholdedRelu', 'HardSigmoid', 'Elu', 'Selu', 'PRelu', 'Softmax', 'Softsign', 'Softplus', 'Clip'] +# TODO: repair HardSigmoid support +# https://github.com/fastmachinelearning/hls4ml/issues/409 +#activation_layers = ['Relu', 'Tanh', 'Sigmoid', 'LeakyRelu', 'ThresholdedRelu', 'HardSigmoid', 'Elu', 'Selu', 'PRelu', 'Softmax', 'Softsign', 'Softplus', 'Clip'] +activation_layers = ['Relu', 'Tanh', 'Sigmoid', 'LeakyRelu', 'ThresholdedRelu', 'Elu', 'Selu', 'PRelu', 'Softmax', 'Softsign', 'Softplus', 'Clip'] activation_map = {'Relu':'ReLU', 'Tanh':'Activation', 'Sigmoid':'Activation', 'LeakyRelu':'LeakyReLU', diff --git a/hls4ml/converters/pytorch/core.py b/hls4ml/converters/pytorch/core.py index eb5f7f3cea..cafbf1a463 100644 --- a/hls4ml/converters/pytorch/core.py +++ b/hls4ml/converters/pytorch/core.py @@ -2,6 +2,8 @@ from hls4ml.converters.pytorch_to_hls import pytorch_handler +# TODO: propagate use_bias info properly +# https://github.com/fastmachinelearning/hls4ml/issues/409 @pytorch_handler('Linear') def parse_linear_layer(pytorch_layer, layer_name, input_shapes, data_reader, config): assert('Linear' in pytorch_layer.__class__.__name__) @@ -15,6 +17,7 @@ def parse_linear_layer(pytorch_layer, layer_name, input_shapes, data_reader, con layer['n_out'] = pytorch_layer.out_features #Handling whether bias is used or not + assert not pytorch_layer.bias is None, "PyTorch Linear with bias=False not yet supported" if pytorch_layer.bias is None: layer['use_bias'] = False else: @@ -24,8 +27,10 @@ def parse_linear_layer(pytorch_layer, layer_name, input_shapes, data_reader, con return layer, output_shape - -activation_layers = ['LeakyReLU', 'ThresholdedReLU', 'ELU', 'PReLU', 'Softmax', 'ReLU'] +# TODO: propagate parametrized activation parameters +# https://github.com/fastmachinelearning/hls4ml/issues/409 +# activation_layers = ['LeakyReLU', 'ThresholdedReLU', 'ELU', 'PReLU', 'Softmax', 'ReLU'] +activation_layers = ['Softmax', 'ReLU'] @pytorch_handler(*activation_layers) def parse_activation_layer(pytorch_layer, layer_name, input_shapes, data_reader, config): From ab076fc0d119c753b861f9287b46d34275391087 Mon Sep 17 00:00:00 2001 From: Giuseppe Di Guglielmo Date: Fri, 26 Nov 2021 09:54:58 -0800 Subject: [PATCH 049/102] Start integrating Vivado Accelerator AXI-m backend --- hls4ml/templates/supported_boards.json | 16 +++- .../python_drivers/axi_stream_driver.py | 75 +++++++++++++++ .../pynq-z1/tcl_scripts/axi_lite_design.tcl | 26 ++++++ .../pynq-z1/tcl_scripts/axi_master_design.tcl | 86 ++++++++++++++++++ .../pynq-z1/tcl_scripts/axi_stream_design.tcl | 59 ++++++++++++ .../ultra96v2/c_drivers/axi_master_driver.c | 6 ++ .../ultra96v2/c_drivers/axi_master_driver.h | 6 ++ .../python_drivers/axi_stream_driver.py | 75 +++++++++++++++ .../ultra96v2/tcl_scripts/axi_lite_design.tcl | 26 ++++++ .../tcl_scripts/axi_master_design.tcl | 91 +++++++++++++++++++ .../tcl_scripts/axi_stream_design.tcl | 58 ++++++++++++ hls4ml/writer/vivado_accelerator_writer.py | 2 +- 12 files changed, 523 insertions(+), 3 deletions(-) create mode 100644 hls4ml/templates/vivado_accelerator/pynq-z1/python_drivers/axi_stream_driver.py create mode 100644 hls4ml/templates/vivado_accelerator/pynq-z1/tcl_scripts/axi_lite_design.tcl create mode 100644 hls4ml/templates/vivado_accelerator/pynq-z1/tcl_scripts/axi_master_design.tcl create mode 100644 hls4ml/templates/vivado_accelerator/pynq-z1/tcl_scripts/axi_stream_design.tcl create mode 100644 hls4ml/templates/vivado_accelerator/ultra96v2/c_drivers/axi_master_driver.c create mode 100644 hls4ml/templates/vivado_accelerator/ultra96v2/c_drivers/axi_master_driver.h create mode 100644 hls4ml/templates/vivado_accelerator/ultra96v2/python_drivers/axi_stream_driver.py create mode 100644 hls4ml/templates/vivado_accelerator/ultra96v2/tcl_scripts/axi_lite_design.tcl create mode 100644 hls4ml/templates/vivado_accelerator/ultra96v2/tcl_scripts/axi_master_design.tcl create mode 100644 hls4ml/templates/vivado_accelerator/ultra96v2/tcl_scripts/axi_stream_design.tcl diff --git a/hls4ml/templates/supported_boards.json b/hls4ml/templates/supported_boards.json index 34d676d9cf..8640d1e978 100644 --- a/hls4ml/templates/supported_boards.json +++ b/hls4ml/templates/supported_boards.json @@ -1,4 +1,10 @@ { + "pynq-z1": { + "part": "xc7z020clg400-1", + "tcl_scripts": {"axi_lite": "axi_lite_design.tcl", "axi_stream": "axi_stream_design.tcl", "axi_master": "axi_master_design.tcl"}, + "python_drivers": {"axi_stream": "axi_stream_driver.py"}, + "c_drivers": { "axi_master": "axi_master_design.c"} + }, "pynq-z2": { "part": "xc7z020clg400-1", "tcl_scripts": {"axi_lite": "axi_lite_design.tcl", "axi_stream": "axi_stream_design.tcl"}, @@ -7,8 +13,14 @@ }, "zcu102": { "part": "xczu9eg-ffvb1156-2-e", - "tcl_scripts": { "axi_stream": "axi_stream_design.tcl"}, + "tcl_scripts": {"axi_stream": "axi_stream_design.tcl"}, "python_drivers": {"axi_stream": "axi_stream_driver.py"}, "c_drivers": {} + }, + "ultra96v2": { + "part": "xczu3eg-sbva484-1-e", + "tcl_scripts": {"axi_lite": "axi_lite_design.tcl", "axi_stream": "axi_stream_design.tcl", "axi_master": "axi_master_design.tcl"}, + "python_drivers": {"axi_stream": "axi_stream_driver.py"}, + "c_drivers": { "axi_master": "axi_master_design.c"} } -} \ No newline at end of file +} diff --git a/hls4ml/templates/vivado_accelerator/pynq-z1/python_drivers/axi_stream_driver.py b/hls4ml/templates/vivado_accelerator/pynq-z1/python_drivers/axi_stream_driver.py new file mode 100644 index 0000000000..4adb187ab4 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/pynq-z1/python_drivers/axi_stream_driver.py @@ -0,0 +1,75 @@ +from pynq import DefaultHierarchy, DefaultIP, allocate +from pynq import Overlay +from datetime import datetime +import pynq.lib.dma +import numpy as np + + +class NeuralNetworkOverlay(Overlay): + def __init__(self, bitfile_name, x_shape, y_shape, dtype=np.float32, dtbo=None, download=True, ignore_version=False, + device=None): + super().__init__(bitfile_name, dtbo=None, download=True, ignore_version=False, device=None) + self.sendchannel = self.hier_0.axi_dma_0.sendchannel + self.recvchannel = self.hier_0.axi_dma_0.recvchannel + self.input_buffer = allocate(shape=x_shape, dtype=dtype) + self.output_buffer = allocate(shape=y_shape, dtype=dtype) + + def _print_dt(self, timea, timeb, N): + dt = (timeb - timea) + dts = dt.seconds + dt.microseconds * 10 ** -6 + rate = N / dts + print("Classified {} samples in {} seconds ({} inferences / s)".format(N, dts, rate)) + return dts, rate + + def predict(self, X, debug=False, profile=False, encode=None, decode=None): + """ + Obtain the predictions of the NN implemented in the FPGA. + Parameters: + - X : the input vector. Should be numpy ndarray. + - dtype : the data type of the elements of the input/output vectors. + Note: it should be set depending on the interface of the accelerator; if it uses 'float' + types for the 'data' AXI-Stream field, 'np.float32' dtype is the correct one to use. + Instead if it uses 'ap_fixed', 'np.intA' is the correct one to use (note that A cannot + any integer value, but it can assume {..., 8, 16, 32, ...} values. Check `numpy` + doc for more info). + In this case the encoding/decoding has to be computed by the PS. For example for + 'ap_fixed<16,6>' type the following 2 functions are the correct one to use for encode/decode + 'float' -> 'ap_fixed<16,6>': + ``` + def encode(xi): + return np.int16(round(xi * 2**10)) # note 2**10 = 2**(A-B) + def decode(yi): + return yi * 2**-10 + encode_v = np.vectorize(encode) # to apply them element-wise + decode_v = np.vectorize(decode) + ``` + - profile : boolean. Set it to `True` to print the performance of the algorithm in term of `inference/s`. + - encode/decode: function pointers. See `dtype` section for more information. + - return: an output array based on `np.ndarray` with a shape equal to `y_shape` and a `dtype` equal to + the namesake parameter. + """ + if profile: + timea = datetime.now() + if encode is not None: + X = encode(X) + self.input_buffer[:] = X + self.sendchannel.transfer(self.input_buffer) + self.recvchannel.transfer(self.output_buffer) + if debug: + print("Transfer OK") + self.sendchannel.wait() + if debug: + print("Send OK") + self.recvchannel.wait() + if debug: + print("Receive OK") + # result = self.output_buffer.copy() + if decode is not None: + self.output_buffer = decode(self.output_buffer) + + if profile: + timeb = datetime.now() + dts, rate = self._print_dt(timea, timeb, len(X)) + return self.output_buffer, dts, rate + else: + return self.output_buffer \ No newline at end of file diff --git a/hls4ml/templates/vivado_accelerator/pynq-z1/tcl_scripts/axi_lite_design.tcl b/hls4ml/templates/vivado_accelerator/pynq-z1/tcl_scripts/axi_lite_design.tcl new file mode 100644 index 0000000000..4f6847ae70 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/pynq-z1/tcl_scripts/axi_lite_design.tcl @@ -0,0 +1,26 @@ +set tcldir [file dirname [info script]] +source [file join $tcldir project.tcl] + +create_project project_1 ${myproject}_vivado_accelerator -part xc7z020clg400-1 -force + +set_property board_part tul.com.tw:pynq-z2:part0:1.0 [current_project] +set_property ip_repo_paths ${myproject}_prj [current_project] +update_ip_catalog + +# Create Block Designer design +create_bd_design "design_1" +create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7:5.5 processing_system7_0 +apply_bd_automation -rule xilinx.com:bd_rule:processing_system7 -config {make_external "FIXED_IO, DDR" apply_board_preset "1" Master "Disable" Slave "Disable" } [get_bd_cells processing_system7_0] +create_bd_cell -type ip -vlnv xilinx.com:hls:${myproject}_axi:1.0 ${myproject}_axi_0 +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { Clk_master {Auto} Clk_slave {Auto} Clk_xbar {Auto} Master {/processing_system7_0/M_AXI_GP0} Slave {/${myproject}_axi_0/s_axi_AXILiteS} ddr_seg {Auto} intc_ip {New AXI Interconnect} master_apm {0}} [get_bd_intf_pins ${myproject}_axi_0/s_axi_AXILiteS] + +make_wrapper -files [get_files ./${myproject}_vivado_accelerator/project_1.srcs/sources_1/bd/design_1/design_1.bd] -top +add_files -norecurse ./${myproject}_vivado_accelerator/project_1.srcs/sources_1/bd/design_1/hdl/design_1_wrapper.v + +reset_run impl_1 +reset_run synth_1 +launch_runs impl_1 -to_step write_bitstream -jobs 6 +wait_on_run -timeout 360 impl_1 + +open_run impl_1 +report_utilization -file util.rpt -hierarchical -hierarchical_percentages diff --git a/hls4ml/templates/vivado_accelerator/pynq-z1/tcl_scripts/axi_master_design.tcl b/hls4ml/templates/vivado_accelerator/pynq-z1/tcl_scripts/axi_master_design.tcl new file mode 100644 index 0000000000..a62f7e54f2 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/pynq-z1/tcl_scripts/axi_master_design.tcl @@ -0,0 +1,86 @@ +set tcldir [file dirname [info script]] +source [file join $tcldir project.tcl] + +# Project names +set project_name "project_1" +set design_name "design_1" +set hls_solution_name "solution1" +set ps_name "processing_system7_0" +set acc_name "${myproject}_axi_0" + +# Board and chip part names +create_project ${project_name} ${myproject}_vivado_accelerator -part xc7z020clg400-1 -force +set_property board_part www.digilentinc.com:pynq-z1:part0:1.0 [current_project] + +# Create block design +create_bd_design ${design_name} + +# Setup IP repo +#set_property ip_repo_paths ${myproject}_prj [current_project] +set_property ip_repo_paths ${myproject}_prj/${hls_solution_name}/impl/ip [current_project] +update_ip_catalog + +# Create and setup PS +create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7:5.5 ${ps_name} +apply_bd_automation -rule xilinx.com:bd_rule:processing_system7 -config {make_external "FIXED_IO, DDR" apply_board_preset "1" Master "Disable" Slave "Disable" } [get_bd_cells ${ps_name}] +set_property -dict [list CONFIG.PCW_USE_S_AXI_GP0 {1} CONFIG.PCW_USE_FABRIC_INTERRUPT {1} CONFIG.PCW_IRQ_F2P_INTR {1}] [get_bd_cells ${ps_name}] + +# Create accelerator +create_bd_cell -type ip -vlnv xilinx.com:hls:myproject_axi:1.0 ${acc_name} + +# Wiring +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { \ + Clk_master {Auto} \ + Clk_slave {Auto} \ + Clk_xbar {Auto} \ + Master {/myproject_axi_0/m_axi_IN_BUS} \ + Slave {/processing_system7_0/S_AXI_GP0} \ + intc_ip {Auto} \ + master_apm {0}} [get_bd_intf_pins processing_system7_0/S_AXI_GP0] + +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { \ + Clk_master {Auto} \ + Clk_slave {Auto} \ + Clk_xbar {Auto} \ + Master {/processing_system7_0/M_AXI_GP0} \ + Slave {/myproject_axi_0/s_axi_CTRL_BUS} \ + intc_ip {New AXI Interconnect} \ + master_apm {0}} [get_bd_intf_pins myproject_axi_0/s_axi_CTRL_BUS] + +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { \ + Clk_master {/processing_system7_0/FCLK_CLK0 (100 MHz)} \ + Clk_slave {/processing_system7_0/FCLK_CLK0 (100 MHz)} \ + Clk_xbar {/processing_system7_0/FCLK_CLK0 (100 MHz)} \ + Master {/myproject_axi_0/m_axi_OUT_BUS} \ + Slave {/processing_system7_0/S_AXI_GP0} \ + intc_ip {/axi_smc} \ + master_apm {0}} [get_bd_intf_pins myproject_axi_0/m_axi_OUT_BUS] + +# Wiring interrupt signal +connect_bd_net [get_bd_pins myproject_axi_0/interrupt] [get_bd_pins processing_system7_0/IRQ_F2P] + +# Top level wrapper +make_wrapper -files [get_files ./${myproject}_vivado_accelerator/${project_name}.srcs/sources_1/bd/${design_name}/${design_name}.bd] -top +add_files -norecurse ./${myproject}_vivado_accelerator/${project_name}.srcs/sources_1/bd/${design_name}/hdl/${design_name}_wrapper.v + +# Memory mapping +delete_bd_objs [get_bd_addr_segs myproject_axi_0/Data_m_axi_IN_BUS/SEG_processing_system7_0_GP0_QSPI_LINEAR] +delete_bd_objs [get_bd_addr_segs -excluded myproject_axi_0/Data_m_axi_IN_BUS/SEG_processing_system7_0_GP0_IOP] +delete_bd_objs [get_bd_addr_segs -excluded myproject_axi_0/Data_m_axi_IN_BUS/SEG_processing_system7_0_GP0_M_AXI_GP0] +delete_bd_objs [get_bd_addr_segs myproject_axi_0/Data_m_axi_OUT_BUS/SEG_processing_system7_0_GP0_QSPI_LINEAR] +delete_bd_objs [get_bd_addr_segs -excluded myproject_axi_0/Data_m_axi_OUT_BUS/SEG_processing_system7_0_GP0_IOP] +delete_bd_objs [get_bd_addr_segs -excluded myproject_axi_0/Data_m_axi_OUT_BUS/SEG_processing_system7_0_GP0_M_AXI_GP0] + +# Run synthesis and implementation +reset_run impl_1 +reset_run synth_1 +launch_runs impl_1 -to_step write_bitstream -jobs 6 +wait_on_run -timeout 360 impl_1 + +# Reporting +open_run impl_1 +report_utilization -file util.rpt -hierarchical -hierarchical_percentages + +# Export HDF file for SDK flow +file mkdir ./hdf +file copy -force ${myproject}_vivado_accelerator/${project_name}.runs/impl_1/${design_name}_wrapper.sysdef ../sdk/hdf/${design_name}_wrapper.hdf diff --git a/hls4ml/templates/vivado_accelerator/pynq-z1/tcl_scripts/axi_stream_design.tcl b/hls4ml/templates/vivado_accelerator/pynq-z1/tcl_scripts/axi_stream_design.tcl new file mode 100644 index 0000000000..f5901c7f37 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/pynq-z1/tcl_scripts/axi_stream_design.tcl @@ -0,0 +1,59 @@ +#@todo: try to remove startgroup and endgroup and see if it work +set tcldir [file dirname [info script]] +source [file join $tcldir project.tcl] + +create_project project_1 ${myproject}_vivado_accelerator -part xc7z020clg400-1 -force + +set_property board_part tul.com.tw:pynq-z2:part0:1.0 [current_project] +set_property ip_repo_paths ${myproject}_prj [current_project] +update_ip_catalog + +create_bd_design "design_1" + +startgroup +create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7:5.5 processing_system7_0 +endgroup + +apply_bd_automation -rule xilinx.com:bd_rule:processing_system7 -config {make_external "FIXED_IO, DDR" apply_board_preset "1" Master "Disable" Slave "Disable" } [get_bd_cells processing_system7_0] + +startgroup +set_property -dict [list CONFIG.PCW_USE_S_AXI_HP0 {1}] [get_bd_cells processing_system7_0] +endgroup + +startgroup +create_bd_cell -type ip -vlnv xilinx.com:ip:axi_dma:7.1 axi_dma_0 +endgroup + +set_property -dict [list CONFIG.c_s_axis_s2mm_tdata_width.VALUE_SRC USER] [get_bd_cells axi_dma_0] +set_property -dict [list CONFIG.c_include_sg {0} CONFIG.c_sg_length_width {26} CONFIG.c_sg_include_stscntrl_strm {0} CONFIG.c_m_axi_mm2s_data_width ${bit_width_hls_input} CONFIG.c_m_axis_mm2s_tdata_width ${bit_width_hls_input} CONFIG.c_mm2s_burst_size {256} CONFIG.c_s_axis_s2mm_tdata_width ${bit_width_hls_output} CONFIG.c_s_axis_s2mm_data_width ${bit_width_hls_output} CONFIG.c_s2mm_burst_size {256}] [get_bd_cells axi_dma_0] + +startgroup +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { Clk_master {Auto} Clk_slave {Auto} Clk_xbar {Auto} Master {/processing_system7_0/M_AXI_GP0} Slave {/axi_dma_0/S_AXI_LITE} ddr_seg {Auto} intc_ip {New AXI Interconnect} master_apm {0}} [get_bd_intf_pins axi_dma_0/S_AXI_LITE] + +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { Clk_master {Auto} Clk_slave {Auto} Clk_xbar {Auto} Master {/axi_dma_0/M_AXI_MM2S} Slave {/processing_system7_0/S_AXI_HP0} ddr_seg {Auto} intc_ip {New AXI Interconnect} master_apm {0}} [get_bd_intf_pins processing_system7_0/S_AXI_HP0] +endgroup + +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { Clk_master {Auto} Clk_slave {/processing_system7_0/FCLK_CLK0 (100 MHz)} Clk_xbar {/processing_system7_0/FCLK_CLK0 (100 MHz)} Master {/axi_dma_0/M_AXI_S2MM} Slave {/processing_system7_0/S_AXI_HP0} ddr_seg {Auto} intc_ip {/axi_mem_intercon} master_apm {0}} [get_bd_intf_pins axi_dma_0/M_AXI_S2MM] + +startgroup +create_bd_cell -type ip -vlnv xilinx.com:hls:${myproject}_axi:1.0 ${myproject}_axi_0 +endgroup + +connect_bd_intf_net [get_bd_intf_pins axi_dma_0/M_AXIS_MM2S] [get_bd_intf_pins ${myproject}_axi_0/in_r] +connect_bd_intf_net [get_bd_intf_pins ${myproject}_axi_0/out_r] [get_bd_intf_pins axi_dma_0/S_AXIS_S2MM] + +apply_bd_automation -rule xilinx.com:bd_rule:clkrst -config { Clk {/processing_system7_0/FCLK_CLK0 (100 MHz)} Freq {100} Ref_Clk0 {} Ref_Clk1 {} Ref_Clk2 {}} [get_bd_pins ${myproject}_axi_0/ap_clk] + +group_bd_cells hier_0 [get_bd_cells axi_dma_0] [get_bd_cells ${myproject}_axi_0] + +make_wrapper -files [get_files ./${myproject}_vivado_accelerator/project_1.srcs/sources_1/bd/design_1/design_1.bd] -top + +add_files -norecurse ./${myproject}_vivado_accelerator/project_1.srcs/sources_1/bd/design_1/hdl/design_1_wrapper.v + +reset_run impl_1 +reset_run synth_1 +launch_runs impl_1 -to_step write_bitstream -jobs 6 +wait_on_run -timeout 360 impl_1 + +open_run impl_1 +report_utilization -file util.rpt -hierarchical -hierarchical_percentages diff --git a/hls4ml/templates/vivado_accelerator/ultra96v2/c_drivers/axi_master_driver.c b/hls4ml/templates/vivado_accelerator/ultra96v2/c_drivers/axi_master_driver.c new file mode 100644 index 0000000000..8a46df8bde --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/ultra96v2/c_drivers/axi_master_driver.c @@ -0,0 +1,6 @@ +#include "xil_printf.h" + +int main(void) { + xil_printf("Hello world!\r\n"); + return 0; +} diff --git a/hls4ml/templates/vivado_accelerator/ultra96v2/c_drivers/axi_master_driver.h b/hls4ml/templates/vivado_accelerator/ultra96v2/c_drivers/axi_master_driver.h new file mode 100644 index 0000000000..8a46df8bde --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/ultra96v2/c_drivers/axi_master_driver.h @@ -0,0 +1,6 @@ +#include "xil_printf.h" + +int main(void) { + xil_printf("Hello world!\r\n"); + return 0; +} diff --git a/hls4ml/templates/vivado_accelerator/ultra96v2/python_drivers/axi_stream_driver.py b/hls4ml/templates/vivado_accelerator/ultra96v2/python_drivers/axi_stream_driver.py new file mode 100644 index 0000000000..4adb187ab4 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/ultra96v2/python_drivers/axi_stream_driver.py @@ -0,0 +1,75 @@ +from pynq import DefaultHierarchy, DefaultIP, allocate +from pynq import Overlay +from datetime import datetime +import pynq.lib.dma +import numpy as np + + +class NeuralNetworkOverlay(Overlay): + def __init__(self, bitfile_name, x_shape, y_shape, dtype=np.float32, dtbo=None, download=True, ignore_version=False, + device=None): + super().__init__(bitfile_name, dtbo=None, download=True, ignore_version=False, device=None) + self.sendchannel = self.hier_0.axi_dma_0.sendchannel + self.recvchannel = self.hier_0.axi_dma_0.recvchannel + self.input_buffer = allocate(shape=x_shape, dtype=dtype) + self.output_buffer = allocate(shape=y_shape, dtype=dtype) + + def _print_dt(self, timea, timeb, N): + dt = (timeb - timea) + dts = dt.seconds + dt.microseconds * 10 ** -6 + rate = N / dts + print("Classified {} samples in {} seconds ({} inferences / s)".format(N, dts, rate)) + return dts, rate + + def predict(self, X, debug=False, profile=False, encode=None, decode=None): + """ + Obtain the predictions of the NN implemented in the FPGA. + Parameters: + - X : the input vector. Should be numpy ndarray. + - dtype : the data type of the elements of the input/output vectors. + Note: it should be set depending on the interface of the accelerator; if it uses 'float' + types for the 'data' AXI-Stream field, 'np.float32' dtype is the correct one to use. + Instead if it uses 'ap_fixed', 'np.intA' is the correct one to use (note that A cannot + any integer value, but it can assume {..., 8, 16, 32, ...} values. Check `numpy` + doc for more info). + In this case the encoding/decoding has to be computed by the PS. For example for + 'ap_fixed<16,6>' type the following 2 functions are the correct one to use for encode/decode + 'float' -> 'ap_fixed<16,6>': + ``` + def encode(xi): + return np.int16(round(xi * 2**10)) # note 2**10 = 2**(A-B) + def decode(yi): + return yi * 2**-10 + encode_v = np.vectorize(encode) # to apply them element-wise + decode_v = np.vectorize(decode) + ``` + - profile : boolean. Set it to `True` to print the performance of the algorithm in term of `inference/s`. + - encode/decode: function pointers. See `dtype` section for more information. + - return: an output array based on `np.ndarray` with a shape equal to `y_shape` and a `dtype` equal to + the namesake parameter. + """ + if profile: + timea = datetime.now() + if encode is not None: + X = encode(X) + self.input_buffer[:] = X + self.sendchannel.transfer(self.input_buffer) + self.recvchannel.transfer(self.output_buffer) + if debug: + print("Transfer OK") + self.sendchannel.wait() + if debug: + print("Send OK") + self.recvchannel.wait() + if debug: + print("Receive OK") + # result = self.output_buffer.copy() + if decode is not None: + self.output_buffer = decode(self.output_buffer) + + if profile: + timeb = datetime.now() + dts, rate = self._print_dt(timea, timeb, len(X)) + return self.output_buffer, dts, rate + else: + return self.output_buffer \ No newline at end of file diff --git a/hls4ml/templates/vivado_accelerator/ultra96v2/tcl_scripts/axi_lite_design.tcl b/hls4ml/templates/vivado_accelerator/ultra96v2/tcl_scripts/axi_lite_design.tcl new file mode 100644 index 0000000000..2df93afca5 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/ultra96v2/tcl_scripts/axi_lite_design.tcl @@ -0,0 +1,26 @@ +set tcldir [file dirname [info script]] +source [file join $tcldir project.tcl] + +create_project project_1 ${myproject}_vivado_accelerator -part xczu3eg-sbva484-1-e -force + +set_property board_part em.avnet.com:ultra96:part0:1.2 [current_project] +set_property ip_repo_paths ${myproject}_prj [current_project] +update_ip_catalog + +# Create Block Designer design +create_bd_design "design_1" +create_bd_cell -type ip -vlnv xilinx.com:ip:zynq_ultra_ps_e:3.3 zynq_ultra_ps_e +apply_bd_automation -rule xilinx.com:bd_rule:zynq_ultra_ps_e -config {make_external "FIXED_IO, DDR" apply_board_preset "1" Master "Disable" Slave "Disable" } [get_bd_cells zynq_ultra_ps_e] +create_bd_cell -type ip -vlnv xilinx.com:hls:${myproject}_axi:1.0 ${myproject}_axi_0 +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { Clk_master {Auto} Clk_slave {Auto} Clk_xbar {Auto} Master {/processing_system7_0/M_AXI_GP0} Slave {/${myproject}_axi_0/s_axi_AXILiteS} ddr_seg {Auto} intc_ip {New AXI Interconnect} master_apm {0}} [get_bd_intf_pins ${myproject}_axi_0/s_axi_AXILiteS] + +make_wrapper -files [get_files ./${myproject}_vivado_accelerator/project_1.srcs/sources_1/bd/design_1/design_1.bd] -top +add_files -norecurse ./${myproject}_vivado_accelerator/project_1.srcs/sources_1/bd/design_1/hdl/design_1_wrapper.v + +reset_run impl_1 +reset_run synth_1 +launch_runs impl_1 -to_step write_bitstream -jobs 6 +wait_on_run -timeout 360 impl_1 + +open_run impl_1 +report_utilization -file util.rpt -hierarchical -hierarchical_percentages diff --git a/hls4ml/templates/vivado_accelerator/ultra96v2/tcl_scripts/axi_master_design.tcl b/hls4ml/templates/vivado_accelerator/ultra96v2/tcl_scripts/axi_master_design.tcl new file mode 100644 index 0000000000..c0ad4c418e --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/ultra96v2/tcl_scripts/axi_master_design.tcl @@ -0,0 +1,91 @@ +set tcldir [file dirname [info script]] +source [file join $tcldir project.tcl] + +# Project names +set project_name "project_1" +set design_name "design_1" +set hls_solution_name "solution1" +set ps_name "zynq_ultra_ps_e_0" +set acc_name "${myproject}_axi_0" + +# Board and chip part names +create_project ${project_name} ${myproject}_vivado_accelerator -part xczu9eg-ffvb1156-2-e -force +set_property board_part avnet.com:ultra96v2:part0:1.2 [current_project] + +# Create block design +create_bd_design ${design_name} + +# Setup IP repo +#set_property ip_repo_paths ${myproject}_prj [current_project] +set_property ip_repo_paths ${myproject}_prj/${hls_solution_name}/impl/ip [current_project] +update_ip_catalog + +# Create and setup PS +create_bd_cell -type ip -vlnv xilinx.com:ip:zynq_ultra_ps_e:3.3 ${ps_name} +apply_bd_automation -rule xilinx.com:bd_rule:zynq_ultra_ps_e -config {apply_board_preset "1" } [get_bd_cells ${ps_name}] +set_property -dict [list CONFIG.PSU__USE__S_AXI_GP0 {1} CONFIG.PSU__SAXIGP0__DATA_WIDTH {32}] [get_bd_cells ${ps_name}] + +# Create accelerator +create_bd_cell -type ip -vlnv xilinx.com:hls:myproject_axi:1.0 ${acc_name} + +# Wiring +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { \ + Clk_master {Auto} \ + Clk_slave {Auto} \ + Clk_xbar {Auto} \ + Master "/zynq_ultra_ps_e_0/M_AXI_HPM0_FPD" \ + Slave "/myproject_axi_0/s_axi_CTRL_BUS" \ + intc_ip {New AXI Interconnect} \ + master_apm {0}} [get_bd_intf_pins ${acc_name}/s_axi_CTRL_BUS] + +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { \ + Clk_master {Auto} \ + Clk_slave "/zynq_ultra_ps_e_0/pl_clk0 (100 MHz)" \ + Clk_xbar "/zynq_ultra_ps_e_0/pl_clk0 (100 MHz)" \ + Master "/zynq_ultra_ps_e_0/M_AXI_HPM1_FPD" \ + Slave "/myproject_axi_0/s_axi_CTRL_BUS" \ + intc_ip {/ps8_0_axi_periph} \ + master_apm {0}} [get_bd_intf_pins zynq_ultra_ps_e_0/M_AXI_HPM1_FPD] + +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { \ + Clk_master "/zynq_ultra_ps_e_0/pl_clk0 (100 MHz)" \ + Clk_slave {Auto} \ + Clk_xbar {Auto} \ + Master "/myproject_axi_0/m_axi_IN_BUS" \ + Slave "/zynq_ultra_ps_e_0/S_AXI_HPC0_FPD" \ + intc_ip {Auto} \ + master_apm {0}} [get_bd_intf_pins zynq_ultra_ps_e_0/S_AXI_HPC0_FPD] + +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { \ + Clk_master "/zynq_ultra_ps_e_0/pl_clk0 (100 MHz)" \ + Clk_slave "/zynq_ultra_ps_e_0/pl_clk0 (100 MHz)" \ + Clk_xbar "/zynq_ultra_ps_e_0/pl_clk0 (100 MHz)" \ + Master "/myproject_axi_0/m_axi_OUT_BUS" \ + Slave "/zynq_ultra_ps_e_0/S_AXI_HPC0_FPD" \ + intc_ip {/axi_smc} \ + master_apm {0}} [get_bd_intf_pins ${acc_name}/m_axi_OUT_BUS] + +# Wiring interrupt signal +connect_bd_net [get_bd_pins ${acc_name}/interrupt] [get_bd_pins ${ps_name}/pl_ps_irq0] + +# Top level wrapper +make_wrapper -files [get_files ./${myproject}_vivado_accelerator/${project_name}.srcs/sources_1/bd/${design_name}/${design_name}.bd] -top +add_files -norecurse ./${myproject}_vivado_accelerator/${project_name}.srcs/sources_1/bd/${design_name}/hdl/${design_name}_wrapper.v + +# Memory mapping +delete_bd_objs [get_bd_addr_segs -excluded ${acc_name}/Data_m_axi_IN_BUS/SEG_${ps_name}_HPC0_LPS_OCM] +delete_bd_objs [get_bd_addr_segs -excluded ${acc_name}/Data_m_axi_OUT_BUS/SEG_${ps_name}_HPC0_LPS_OCM] + +# Run synthesis and implementation +reset_run impl_1 +reset_run synth_1 +launch_runs impl_1 -to_step write_bitstream -jobs 6 +wait_on_run -timeout 360 impl_1 + +# Reporting +open_run impl_1 +report_utilization -file util.rpt -hierarchical -hierarchical_percentages + +# Export HDF file for SDK flow +file mkdir ./hdf +file copy -force ${myproject}_vivado_accelerator/${project_name}.runs/impl_1/${design_name}_wrapper.sysdef ../sdk/hdf/${design_name}_wrapper.hdf diff --git a/hls4ml/templates/vivado_accelerator/ultra96v2/tcl_scripts/axi_stream_design.tcl b/hls4ml/templates/vivado_accelerator/ultra96v2/tcl_scripts/axi_stream_design.tcl new file mode 100644 index 0000000000..4721b59941 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/ultra96v2/tcl_scripts/axi_stream_design.tcl @@ -0,0 +1,58 @@ +#@todo: try to remove startgroup and endgroup and see if it work +set tcldir [file dirname [info script]] +source [file join $tcldir project.tcl] + +create_project project_1 ${myproject}_vivado_accelerator -part xczu9eg-ffvb1156-2-e -force + +set_property board_part em.avnet.com:ultra96:part0:1.2 [current_project] +set_property ip_repo_paths ${myproject}_prj [current_project] +update_ip_catalog + +create_bd_design "design_1" +set_property ip_repo_paths ${myproject}_prj/solution1/impl/ip [current_project] +update_ip_catalog + +startgroup +create_bd_cell -type ip -vlnv xilinx.com:ip:zynq_ultra_ps_e:3.3 zynq_ultra_ps_e_0 +endgroup + +apply_bd_automation -rule xilinx.com:bd_rule:zynq_ultra_ps_e -config {apply_board_preset "1" } [get_bd_cells zynq_ultra_ps_e_0] + +set_property -dict [list CONFIG.PSU__USE__S_AXI_GP0 {1} CONFIG.PSU__SAXIGP0__DATA_WIDTH {32}] [get_bd_cells zynq_ultra_ps_e_0] + +startgroup +create_bd_cell -type ip -vlnv xilinx.com:ip:axi_dma:7.1 axi_dma_0 +endgroup +set_property -dict [list CONFIG.c_m_axi_s2mm_data_width.VALUE_SRC USER CONFIG.c_s_axis_s2mm_tdata_width.VALUE_SRC USER] [get_bd_cells axi_dma_0] +set_property -dict [list CONFIG.c_include_sg {0} CONFIG.c_sg_length_width {26} CONFIG.c_sg_include_stscntrl_strm {0} CONFIG.c_m_axi_mm2s_data_width ${bit_width_hls_input} CONFIG.c_m_axis_mm2s_tdata_width ${bit_width_hls_input} CONFIG.c_mm2s_burst_size {256} CONFIG.c_m_axi_s2mm_data_width ${bit_width_hls_output} CONFIG.c_s_axis_s2mm_tdata_width ${bit_width_hls_output} CONFIG.c_s2mm_burst_size {256}] [get_bd_cells axi_dma_0] + +startgroup +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { Clk_master {Auto} Clk_slave {Auto} Clk_xbar {Auto} Master {/zynq_ultra_ps_e_0/M_AXI_HPM0_FPD} Slave {/axi_dma_0/S_AXI_LITE} ddr_seg {Auto} intc_ip {New AXI Interconnect} master_apm {0}} [get_bd_intf_pins axi_dma_0/S_AXI_LITE] +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { Clk_master {Auto} Clk_slave {Auto} Clk_xbar {Auto} Master {/axi_dma_0/M_AXI_MM2S} Slave {/zynq_ultra_ps_e_0/S_AXI_HPC0_FPD} ddr_seg {Auto} intc_ip {New AXI SmartConnect} master_apm {0}} [get_bd_intf_pins zynq_ultra_ps_e_0/S_AXI_HPC0_FPD] +endgroup + +startgroup +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { Clk_master {Auto} Clk_slave {/zynq_ultra_ps_e_0/pl_clk0 (99 MHz)} Clk_xbar {/zynq_ultra_ps_e_0/pl_clk0 (99 MHz)} Master {/axi_dma_0/M_AXI_S2MM} Slave {/zynq_ultra_ps_e_0/S_AXI_HPC0_FPD} ddr_seg {Auto} intc_ip {/axi_smc} master_apm {0}} [get_bd_intf_pins axi_dma_0/M_AXI_S2MM] +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { Clk_master {Auto} Clk_slave {/zynq_ultra_ps_e_0/pl_clk0 (99 MHz)} Clk_xbar {/zynq_ultra_ps_e_0/pl_clk0 (99 MHz)} Master {/zynq_ultra_ps_e_0/M_AXI_HPM1_FPD} Slave {/axi_dma_0/S_AXI_LITE} ddr_seg {Auto} intc_ip {/ps8_0_axi_periph} master_apm {0}} [get_bd_intf_pins zynq_ultra_ps_e_0/M_AXI_HPM1_FPD] +endgroup + +startgroup +create_bd_cell -type ip -vlnv xilinx.com:hls:${myproject}_axi:1.0 ${myproject}_axi_0 +endgroup +connect_bd_intf_net [get_bd_intf_pins axi_dma_0/M_AXIS_MM2S] [get_bd_intf_pins ${myproject}_axi_0/in_r] +connect_bd_intf_net [get_bd_intf_pins axi_dma_0/S_AXIS_S2MM] [get_bd_intf_pins ${myproject}_axi_0/out_r] + +apply_bd_automation -rule xilinx.com:bd_rule:clkrst -config { Clk {/zynq_ultra_ps_e_0/pl_clk0 (99 MHz)} Freq {100} Ref_Clk0 {} Ref_Clk1 {} Ref_Clk2 {}} [get_bd_pins ${myproject}_axi_0/ap_clk] +group_bd_cells hier_0 [get_bd_cells axi_dma_0] [get_bd_cells ${myproject}_axi_0] + +make_wrapper -files [get_files ./${myproject}_vivado_accelerator/project_1.srcs/sources_1/bd/design_1/design_1.bd] -top + +add_files -norecurse ./${myproject}_vivado_accelerator/project_1.srcs/sources_1/bd/design_1/hdl/design_1_wrapper.v + +reset_run impl_1 +reset_run synth_1 +launch_runs impl_1 -to_step write_bitstream -jobs 6 +wait_on_run -timeout 360 impl_1 + +open_run impl_1 +report_utilization -file util.rpt -hierarchical -hierarchical_percentages diff --git a/hls4ml/writer/vivado_accelerator_writer.py b/hls4ml/writer/vivado_accelerator_writer.py index c5206e002d..2628199996 100644 --- a/hls4ml/writer/vivado_accelerator_writer.py +++ b/hls4ml/writer/vivado_accelerator_writer.py @@ -343,7 +343,7 @@ def write_hls(self, model): model.get_output_variables()) super(VivadoAcceleratorWriter, self).write_hls(model) self.write_board_script(model) - self.write_driver(model) + #self.write_driver(model) self.write_wrapper_test(model) self.write_axi_wrapper(model) self.modify_build_script(model) From fa4bd2bb61cc5ef320fa23fb34f1f988ff469f8c Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Sat, 27 Nov 2021 00:36:16 +0100 Subject: [PATCH 050/102] build_prj.tcl fixed for vivadoaccelerator - there will be problems for vivado backend --- hls4ml/templates/vivado/build_prj.tcl | 45 +++++---------------------- 1 file changed, 8 insertions(+), 37 deletions(-) diff --git a/hls4ml/templates/vivado/build_prj.tcl b/hls4ml/templates/vivado/build_prj.tcl index 62f628686f..aa278e7060 100644 --- a/hls4ml/templates/vivado/build_prj.tcl +++ b/hls4ml/templates/vivado/build_prj.tcl @@ -14,37 +14,7 @@ array set opt { set tcldir [file dirname [info script]] source [file join $tcldir project.tcl] -proc add_exit_instruction_tcl {} { - global myproject - set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}] - - set filename ${myproject}_prj/solution1/sim/verilog/${myproject}_axi.tcl - set temp $filename.new.$timestamp - # set backup $filename.bak.$timestamp - - set in [open $filename r] - set out [open $temp w] - - # line-by-line, read the original file - while {[gets $in line] != -1} { - if {[string equal "$line" "run all"]} { - set line {run all -quit -} - } - # then write the transformed line - puts $out $line - } - - close $in - close $out - - # move the new data to the proper filename - file delete -force $filename - file rename -force $temp $filename -} - -proc clean_script {} { +proc remove_recursive_log_wave {} { global myproject set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}] @@ -59,15 +29,16 @@ proc clean_script {} { while {[gets $in line] != -1} { if {[string equal "$line" "log_wave -r /"]} { set line { } + } puts $out $line } - close $in - close $out + close $in + close $out - # move the new data to the proper filename - file delete -force $filename - file rename -force $temp $filename + # move the new data to the proper filename + file delete -force $filename + file rename -force $temp $filename } proc add_vcd_instructions_tcl {} { @@ -216,7 +187,7 @@ if {$opt(cosim)} { add_vcd_instructions_tcl } - clean_script + remove_recursive_log_wave set old_pwd [pwd] cd ${myproject}_prj/solution1/sim/verilog/ source run_sim.tcl From a1384cdf532427a12e43b7abb02fa4ed2bb8540f Mon Sep 17 00:00:00 2001 From: nicologhielmetti Date: Sat, 27 Nov 2021 00:36:55 +0100 Subject: [PATCH 051/102] update example-models --- example-models | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example-models b/example-models index 0d4cc7277e..ff74f73dbc 160000 --- a/example-models +++ b/example-models @@ -1 +1 @@ -Subproject commit 0d4cc7277eac9bb9020e3d73a992dc15dbdcce4e +Subproject commit ff74f73dbc253d1aa7de1603ee10ede551919548 From 8f6467514a12d914f842bbdaa127907d4e5f05c6 Mon Sep 17 00:00:00 2001 From: Giuseppe Di Guglielmo Date: Sat, 27 Nov 2021 18:03:30 -0800 Subject: [PATCH 052/102] Setup AXI-m backend for PYNQ-Z1 and PYNQ-Z2 --- hls4ml/templates/supported_boards.json | 12 +-- .../pynq-z1/tcl_scripts/axi_master_design.tcl | 8 +- .../pynq-z2/tcl_scripts/axi_master_design.tcl | 88 +++++++++++++++++++ 3 files changed, 99 insertions(+), 9 deletions(-) create mode 100644 hls4ml/templates/vivado_accelerator/pynq-z2/tcl_scripts/axi_master_design.tcl diff --git a/hls4ml/templates/supported_boards.json b/hls4ml/templates/supported_boards.json index 8640d1e978..a6973f7266 100644 --- a/hls4ml/templates/supported_boards.json +++ b/hls4ml/templates/supported_boards.json @@ -2,25 +2,25 @@ "pynq-z1": { "part": "xc7z020clg400-1", "tcl_scripts": {"axi_lite": "axi_lite_design.tcl", "axi_stream": "axi_stream_design.tcl", "axi_master": "axi_master_design.tcl"}, - "python_drivers": {"axi_stream": "axi_stream_driver.py"}, + "python_drivers": {"axi_stream": "axi_stream_driver.py"}, "c_drivers": { "axi_master": "axi_master_design.c"} }, "pynq-z2": { "part": "xc7z020clg400-1", - "tcl_scripts": {"axi_lite": "axi_lite_design.tcl", "axi_stream": "axi_stream_design.tcl"}, - "python_drivers": {"axi_stream": "axi_stream_driver.py"}, - "c_drivers": {} + "tcl_scripts": {"axi_lite": "axi_lite_design.tcl", "axi_stream": "axi_stream_design.tcl", "axi_master": "axi_master_design.tcl"}, + "python_drivers": {"axi_stream": "axi_stream_driver.py"}, + "c_drivers": { "axi_master": "axi_master_design.c"} }, "zcu102": { "part": "xczu9eg-ffvb1156-2-e", "tcl_scripts": {"axi_stream": "axi_stream_design.tcl"}, - "python_drivers": {"axi_stream": "axi_stream_driver.py"}, + "python_drivers": {"axi_stream": "axi_stream_driver.py"}, "c_drivers": {} }, "ultra96v2": { "part": "xczu3eg-sbva484-1-e", "tcl_scripts": {"axi_lite": "axi_lite_design.tcl", "axi_stream": "axi_stream_design.tcl", "axi_master": "axi_master_design.tcl"}, - "python_drivers": {"axi_stream": "axi_stream_driver.py"}, + "python_drivers": {"axi_stream": "axi_stream_driver.py"}, "c_drivers": { "axi_master": "axi_master_design.c"} } } diff --git a/hls4ml/templates/vivado_accelerator/pynq-z1/tcl_scripts/axi_master_design.tcl b/hls4ml/templates/vivado_accelerator/pynq-z1/tcl_scripts/axi_master_design.tcl index a62f7e54f2..37adda0fc7 100644 --- a/hls4ml/templates/vivado_accelerator/pynq-z1/tcl_scripts/axi_master_design.tcl +++ b/hls4ml/templates/vivado_accelerator/pynq-z1/tcl_scripts/axi_master_design.tcl @@ -7,10 +7,12 @@ set design_name "design_1" set hls_solution_name "solution1" set ps_name "processing_system7_0" set acc_name "${myproject}_axi_0" +set part_name "xc7z020clg400-1" +set board_name "www.digilentinc.com:pynq-z1:part0:1.0" -# Board and chip part names -create_project ${project_name} ${myproject}_vivado_accelerator -part xc7z020clg400-1 -force -set_property board_part www.digilentinc.com:pynq-z1:part0:1.0 [current_project] +# Set board and chip part names +create_project ${project_name} ${myproject}_vivado_accelerator -part ${part_name} -force +set_property board_part ${board_name} [current_project] # Create block design create_bd_design ${design_name} diff --git a/hls4ml/templates/vivado_accelerator/pynq-z2/tcl_scripts/axi_master_design.tcl b/hls4ml/templates/vivado_accelerator/pynq-z2/tcl_scripts/axi_master_design.tcl new file mode 100644 index 0000000000..e33c6d7ee9 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/pynq-z2/tcl_scripts/axi_master_design.tcl @@ -0,0 +1,88 @@ +set tcldir [file dirname [info script]] +source [file join $tcldir project.tcl] + +# Project names +set project_name "project_1" +set design_name "design_1" +set hls_solution_name "solution1" +set ps_name "processing_system7_0" +set acc_name "${myproject}_axi_0" +set part_name "xc7z020clg400-1" +set board_name "tul.com.tw:pynq-z2:part0:1.0" + +# Set board and chip part names +create_project ${project_name} ${myproject}_vivado_accelerator -part ${part_name} -force +set_property board_part ${board_name} [current_project] + +# Create block design +create_bd_design ${design_name} + +# Setup IP repo +#set_property ip_repo_paths ${myproject}_prj [current_project] +set_property ip_repo_paths ${myproject}_prj/${hls_solution_name}/impl/ip [current_project] +update_ip_catalog + +# Create and setup PS +create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7:5.5 ${ps_name} +apply_bd_automation -rule xilinx.com:bd_rule:processing_system7 -config {make_external "FIXED_IO, DDR" apply_board_preset "1" Master "Disable" Slave "Disable" } [get_bd_cells ${ps_name}] +set_property -dict [list CONFIG.PCW_USE_S_AXI_GP0 {1} CONFIG.PCW_USE_FABRIC_INTERRUPT {1} CONFIG.PCW_IRQ_F2P_INTR {1}] [get_bd_cells ${ps_name}] + +# Create accelerator +create_bd_cell -type ip -vlnv xilinx.com:hls:myproject_axi:1.0 ${acc_name} + +# Wiring +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { \ + Clk_master {Auto} \ + Clk_slave {Auto} \ + Clk_xbar {Auto} \ + Master {/myproject_axi_0/m_axi_IN_BUS} \ + Slave {/processing_system7_0/S_AXI_GP0} \ + intc_ip {Auto} \ + master_apm {0}} [get_bd_intf_pins processing_system7_0/S_AXI_GP0] + +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { \ + Clk_master {Auto} \ + Clk_slave {Auto} \ + Clk_xbar {Auto} \ + Master {/processing_system7_0/M_AXI_GP0} \ + Slave {/myproject_axi_0/s_axi_CTRL_BUS} \ + intc_ip {New AXI Interconnect} \ + master_apm {0}} [get_bd_intf_pins myproject_axi_0/s_axi_CTRL_BUS] + +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { \ + Clk_master {/processing_system7_0/FCLK_CLK0 (100 MHz)} \ + Clk_slave {/processing_system7_0/FCLK_CLK0 (100 MHz)} \ + Clk_xbar {/processing_system7_0/FCLK_CLK0 (100 MHz)} \ + Master {/myproject_axi_0/m_axi_OUT_BUS} \ + Slave {/processing_system7_0/S_AXI_GP0} \ + intc_ip {/axi_smc} \ + master_apm {0}} [get_bd_intf_pins myproject_axi_0/m_axi_OUT_BUS] + +# Wiring interrupt signal +connect_bd_net [get_bd_pins myproject_axi_0/interrupt] [get_bd_pins processing_system7_0/IRQ_F2P] + +# Top level wrapper +make_wrapper -files [get_files ./${myproject}_vivado_accelerator/${project_name}.srcs/sources_1/bd/${design_name}/${design_name}.bd] -top +add_files -norecurse ./${myproject}_vivado_accelerator/${project_name}.srcs/sources_1/bd/${design_name}/hdl/${design_name}_wrapper.v + +# Memory mapping +delete_bd_objs [get_bd_addr_segs myproject_axi_0/Data_m_axi_IN_BUS/SEG_processing_system7_0_GP0_QSPI_LINEAR] +delete_bd_objs [get_bd_addr_segs -excluded myproject_axi_0/Data_m_axi_IN_BUS/SEG_processing_system7_0_GP0_IOP] +delete_bd_objs [get_bd_addr_segs -excluded myproject_axi_0/Data_m_axi_IN_BUS/SEG_processing_system7_0_GP0_M_AXI_GP0] +delete_bd_objs [get_bd_addr_segs myproject_axi_0/Data_m_axi_OUT_BUS/SEG_processing_system7_0_GP0_QSPI_LINEAR] +delete_bd_objs [get_bd_addr_segs -excluded myproject_axi_0/Data_m_axi_OUT_BUS/SEG_processing_system7_0_GP0_IOP] +delete_bd_objs [get_bd_addr_segs -excluded myproject_axi_0/Data_m_axi_OUT_BUS/SEG_processing_system7_0_GP0_M_AXI_GP0] + +# Run synthesis and implementation +reset_run impl_1 +reset_run synth_1 +launch_runs impl_1 -to_step write_bitstream -jobs 6 +wait_on_run -timeout 360 impl_1 + +# Reporting +open_run impl_1 +report_utilization -file util.rpt -hierarchical -hierarchical_percentages + +# Export HDF file for SDK flow +file mkdir ./hdf +file copy -force ${myproject}_vivado_accelerator/${project_name}.runs/impl_1/${design_name}_wrapper.sysdef ../sdk/hdf/${design_name}_wrapper.hdf From 1a64d4b3f36f872d2c94f841c4684ceaeb0dcb7a Mon Sep 17 00:00:00 2001 From: Giuseppe Di Guglielmo Date: Sun, 28 Nov 2021 08:59:14 -0800 Subject: [PATCH 053/102] Add C drivers to PYNQ-Z1 --- .../pynq-z1/c_drivers/sdk/Makefile | 33 +++ .../pynq-z1/c_drivers/sdk/common/main.c | 242 ++++++++++++++++++ .../pynq-z1/c_drivers/sdk/setup.tcl | 12 + .../pynq-z1/tcl_scripts/axi_master_design.tcl | 2 +- .../pynq-z2/tcl_scripts/axi_master_design.tcl | 2 +- hls4ml/templates/vivado_accelerator_config.py | 14 +- hls4ml/writer/vivado_accelerator_writer.py | 11 +- 7 files changed, 306 insertions(+), 10 deletions(-) create mode 100644 hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/Makefile create mode 100644 hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/common/main.c create mode 100644 hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/setup.tcl diff --git a/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/Makefile b/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/Makefile new file mode 100644 index 0000000000..03ab9b8de7 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/Makefile @@ -0,0 +1,33 @@ +DESIGN := design_1 + +help: + @echo "INFO: make to show targets" +.PHONY: help + +--setup: + xsct ./setup.tcl $(DESIGN) +.PHONY: --setup + +sdk: --setup + rm -f $(DESIGN)_standalone/src/helloworld.c + cd $(DESIGN)_standalone/src && ln -s ../../common/main.c main.c + cd $(DESIGN)_standalone/src && ln -s ../../common/data.h data.h +.PHONY: sdk + +gui: + xsdk --workspace . & +.PHONY: gui + +clean: + rm -rf $(DESIGN)_platform + rm -rf $(DESIGN)_standalone + rm -rf $(DESIGN)_standalone_bsp + rm -rf RemoteSystemsTempFiles + rm -rf .Xil + rm -rf .metadata + rm -f *.log +.PHONY: clean + +ultraclean: clean + rm -rf hdf/*.hdf +.PHONY: ultraclean diff --git a/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/common/main.c b/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/common/main.c new file mode 100644 index 0000000000..59325a60da --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/common/main.c @@ -0,0 +1,242 @@ +/** + * + * Set Heap Size in ldscript.ld to 0x1000000 (16MB) + * + */ + +#include "xmyproject_axi.h" /* TODO: design-dependent name */ +#include "stdio.h" /* PRINTF */ +#include "unistd.h" /* sleep */ +#include "stdlib.h" +#include "malloc.h" +#include "assert.h" +#include "xil_io.h" /* peripheral read/write wrappers */ +#include "xtime_l.h" /* to measure performance of the system */ +#include "platform.h" /* platform init/cleanup functions */ +#include "xil_cache.h" /* enable/disable caches etc */ +#include "xil_printf.h" /* UART debug print functions */ +#include "xparameters.h" /* peripherals base addresses */ + +#include "data.h" + +//#define __DEBUG__ + +#define MAX_PRINT_ELEMENTS (16) + +#define PRINTF printf + +const unsigned INPUT_N_ELEMENTS = N_SAMPLES * N_X_INPUTS; +const unsigned OUTPUT_N_ELEMENTS = N_SAMPLES * N_Y_OUTPUTS; + +#if 0 +#define REFERENCE_OUTPUTS data_y_outputs +#define REFERENCE_OUTPUTS data_y_keras_outputs +#endif +#define REFERENCE_OUTPUTS data_y_hls_outputs + + +float *inputs_mem = NULL; +float *outputs_mem = NULL; +float *reference_mem = NULL; + +/* Accelerator configuration */ +XMyproject_axi accelerator; /* TODO: design-dependent name */ +XMyproject_axi_Config *accelerator_cfg; /* TODO: design-dependent name */ + +/* Accelerator initialization routine */ +void init_accelerators() { + PRINTF("INFO: Initializing accelerator\r\n"); + accelerator_cfg = XMyproject_axi_LookupConfig(XPAR_MYPROJECT_AXI_0_DEVICE_ID); /* TODO: design-dependent name */ + if (accelerator_cfg) { + int status = XMyproject_axi_CfgInitialize(&accelerator, accelerator_cfg); /* TODO: design-dependent name */ + if (status != XST_SUCCESS) { + PRINTF("ERROR: Initializing accelerator\r\n"); + } + } +} + +//#if defined(__HPC_ACCELERATOR__) || defined(__ACP_ACCELERATOR__) +///* +// * TODO: remember to edit core_baremetal_polling_bsp/psu_cortexa53_0/libsrc/standalon_v6_5/src/bspconfig.h +// * +// * #define EL1_NONSECURE 1 +// * +// */ +//void init_accelerator_coherency(UINTPTR base_addr) +//{ +// /* Enable snooping of APU caches from CCI */ +// Xil_Out32(0xFD6E4000, 0x1); +// +// /* Configure AxCACHE for write-back read and write-allocate (ARCACHE is [7:4], AWCACHE is [11:8]) */ +// /* Configure AxPROT[2:0] for data access [2], secure access [1], unprivileged access [0] */ +// Xil_Out32(base_addr, 0xFF0); +//} +//#endif + +/* Reference implementation of the accelerator in software */ +int sw_reference_implementation(float *sw_inputs_mem, float *sw_outputs_mem, unsigned n_samples, unsigned n_X_inputs, unsigned n_y_ouputs) { + PRINTF("INFO: Reference outputs are pre-compiled. It would be nice to run a software model here.\r\n"); + /* See data.h for inputs and outputs */ + for (unsigned i = 0; i < n_samples * n_y_ouputs; i++) { + sw_outputs_mem[i] = REFERENCE_OUTPUTS[i]; + } + return 0; +} + +/* profiling function */ +double get_elapsed_time(XTime start, XTime stop) { + return 1.0 * (stop - start) / (COUNTS_PER_SECOND); +} + +/* Dump data to the console */ +void dump_data(const char* label, float* data, unsigned n_samples, unsigned feature_count) { + PRINTF("INFO: %s[%u][%u]:\r\n", label, n_samples, feature_count); + /* Print at most MAX_PRINT_ELEMENTS */ + for (unsigned i = 0; i < n_samples && i < MAX_PRINT_ELEMENTS; i++) { + PRINTF("INFO: [%u] ", i); + for (unsigned j = 0; j < feature_count; j++) { + unsigned index = i * feature_count + j; + PRINTF("%f ", data[index]); + } + PRINTF("\r\n"); + } +} + +/* The top of the hill :-) */ +int main(int argc, char** argv) { + + XTime start, stop; + double calibration_time; + double sw_elapsed = 0; + double hw_elapsed = 0; + double cache_elapsed = 0; + unsigned hw_errors; + + char __attribute__ ((unused)) dummy; /* dummy input */ + + /* Initialize platform (uart and caches) */ + init_platform(); + + PRINTF("\r\n"); + PRINTF("INFO: ==================================================\r\n"); + PRINTF("INFO: XMyproject_axi (w/ polling)\r\n"); /* TODO: design-dependent name */ + PRINTF("INFO: ==================================================\r\n"); + + init_accelerators(); + + inputs_mem = malloc(INPUT_N_ELEMENTS * sizeof(float)); + outputs_mem = malloc(OUTPUT_N_ELEMENTS * sizeof(float)); + reference_mem = malloc(OUTPUT_N_ELEMENTS * sizeof(float)); + + /* Calibration */ + XTime_GetTime(&start); + sleep(1); + XTime_GetTime(&stop); + calibration_time = get_elapsed_time(start, stop); + PRINTF("INFO: Time calibration for one second (%lf sec)\r\n", calibration_time); + + /* initialize memory */ + PRINTF("INFO: Initialize memory\r\n"); + PRINTF("INFO: - Samples count: %u\r\n", N_SAMPLES); /* Same as dst_SAMPLE_COUNT */ + PRINTF("INFO: - Inputs count: %u\r\n", N_X_INPUTS); + PRINTF("INFO: - Outputs count: %u\r\n", N_Y_OUTPUTS); + PRINTF("INFO: - Data size: %u B\r\n", sizeof(float)); + PRINTF("INFO: - Total input size: %u B, %.2f KB, %.2f MB\r\n", N_X_INPUTS * N_SAMPLES * sizeof(float), (N_X_INPUTS * N_SAMPLES * sizeof(float)) / (float)1024, (N_X_INPUTS * N_SAMPLES * sizeof(float)) / (float)(1024*1024)); + PRINTF("INFO: - Total output size: %u B, %.2f KB, %.2f MB\r\n", N_Y_OUTPUTS * N_SAMPLES * sizeof(float), (N_Y_OUTPUTS * N_SAMPLES * sizeof(float)) / (float)1024, (N_Y_OUTPUTS * N_SAMPLES * sizeof(float)) / (float)(1024*1024)); + + // Set Heap Size in ldscript.ld to 0x1000000 (16MB) + //malloc_stats(); + + for (int i = 0; i < INPUT_N_ELEMENTS; i++) { + inputs_mem[i] = data_X_inputs[i]; + } + for (int i = 0; i < OUTPUT_N_ELEMENTS; i++) { + outputs_mem[i] = 0x0; + } + + /* ****** SW REFERENCE ****** */ + PRINTF("INFO: ==================================================\r\n"); + PRINTF("INFO: Start SW reference implementation\r\n"); + XTime_GetTime(&start); + sw_reference_implementation(inputs_mem, reference_mem, N_SAMPLES, N_X_INPUTS, N_Y_OUTPUTS); + XTime_GetTime(&stop); + sw_elapsed = get_elapsed_time(start, stop); + PRINTF("INFO: ==================================================\r\n"); + PRINTF("INFO: Press any key to start:\r\n"); + dummy = inbyte(); + //PRINTF("INFO:"); + + /* ****** HW ACCELERATOR ****** */ + PRINTF("INFO: Start HW accelerator\r\n"); + + XTime_GetTime(&start); + Xil_DCacheFlushRange((UINTPTR)inputs_mem, INPUT_N_ELEMENTS * sizeof(float)); + Xil_DCacheFlushRange((UINTPTR)outputs_mem, OUTPUT_N_ELEMENTS * sizeof(float)); + Xil_DCacheFlushRange((UINTPTR)reference_mem, OUTPUT_N_ELEMENTS * sizeof(float)); + XTime_GetTime(&stop); + cache_elapsed = get_elapsed_time(start, stop); + + for (unsigned j = 0; j < N_SAMPLES; j++) { + float *inputs_mem_i = inputs_mem + j * N_X_INPUTS; + float *outputs_mem_i = outputs_mem + j * N_Y_OUTPUTS; + + /* Configure the accelerator */ + XTime_GetTime(&start); + XMyproject_axi_Set_in_r(&accelerator, (unsigned)inputs_mem_i); /* TODO: design-dependent name */ + XMyproject_axi_Set_out_r(&accelerator, (unsigned)outputs_mem_i); /* TODO: design-dependent name */ + + XMyproject_axi_Start(&accelerator); /* TODO: design-dependent name */ + + /* polling */ + while (!XMyproject_axi_IsDone(&accelerator)); /* TODO: design-dependent name */ + + /* get error status */ + //hw_flags = XMyproject_axi_Get_return(&accelerator); /* TODO: design-dependent name */ + XTime_GetTime(&stop); + hw_elapsed += get_elapsed_time(start, stop); + } + + XTime_GetTime(&start); + Xil_DCacheFlushRange((UINTPTR)outputs_mem, OUTPUT_N_ELEMENTS * sizeof(float)); + XTime_GetTime(&stop); + cache_elapsed += get_elapsed_time(start, stop); + + PRINTF("INFO: HW accelerator done!\r\n"); + + /* ****** VALIDATION ****** */ + PRINTF("INFO: ================== Verification ==================\r\n"); +#ifdef __DEBUG__ + PRINTF("INFO: Dump data\r\n"); + dump_data("inputs_mem", inputs_mem, N_SAMPLES, N_X_INPUTS); + dump_data("outputs_mem", outputs_mem, N_SAMPLES, N_Y_OUTPUTS); + dump_data("reference_mem", reference_mem, N_SAMPLES, N_Y_OUTPUTS); +#endif + + PRINTF("INFO: SW execution time: %f sec\r\n", sw_elapsed); + PRINTF("INFO: Total HW-acceleration execution time (%d inferences): %f sec\r\n", N_SAMPLES, hw_elapsed); + PRINTF("INFO: Per-inference HW-acceleration execution time (average): %.12f sec (%f ns)\r\n", hw_elapsed / (N_SAMPLES), (hw_elapsed*1000.0) / (N_SAMPLES)); + PRINTF("INFO: Cache flush time: %f sec\r\n", cache_elapsed); + PRINTF("INFO: HW/SW speedup (the software is fake so this does not count...): %.2f X\r\n", (sw_elapsed >= (hw_elapsed+cache_elapsed))?(sw_elapsed/(hw_elapsed+cache_elapsed)):-((hw_elapsed+cache_elapsed)/sw_elapsed)); + + /* Accelerator validation */ + hw_errors = 0; + for (int i = 0; i < OUTPUT_N_ELEMENTS; i++) { + if (outputs_mem[i] != reference_mem[i]) { + PRINTF("ERROR: [%d]: Accelerator HW %f != SW %f\r\n", i, outputs_mem[i], reference_mem[i]); + hw_errors++; + } + } + PRINTF("INFO: Total errors = %d (out of %d elements)\r\n", hw_errors, OUTPUT_N_ELEMENTS); + if (hw_errors > 0) + PRINTF("INFO: Verification: FAIL\r\n"); + else + PRINTF("INFO: Verification: PASS!\r\n"); + + PRINTF("INFO: ==================================================\r\n"); + + cleanup_platform(); + + return 0; +} + + diff --git a/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/setup.tcl b/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/setup.tcl new file mode 100644 index 0000000000..1c9d37b799 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/setup.tcl @@ -0,0 +1,12 @@ +# See +# https://www.xilinx.com/html_docs/xilinx2019_1/SDK_Doc/xsct/intro/xsct_introduction.html + +setws . +if { $::argc == 1 } { + set myproject [lindex $::argv 0] + createhw -name ${myproject}\_platform -hwspec ../hdf/${myproject}\_wrapper.hdf + createapp -name ${myproject}\_standalone -app {Hello World} -proc ps7_cortexa9_0 -hwproject ${myproject}\_platform -os standalone + #createapp -name ${myproject}\_standalone -app {Hello World} -proc psu_cortexa53_0 -hwproject ${myproject}\_platform -os standalone -arch 64 + #configapp -app ${myproject}\_standalone -add define-compiler-symbols {FLAG=VALUE} + #projects -build +} diff --git a/hls4ml/templates/vivado_accelerator/pynq-z1/tcl_scripts/axi_master_design.tcl b/hls4ml/templates/vivado_accelerator/pynq-z1/tcl_scripts/axi_master_design.tcl index 37adda0fc7..6de05e15a7 100644 --- a/hls4ml/templates/vivado_accelerator/pynq-z1/tcl_scripts/axi_master_design.tcl +++ b/hls4ml/templates/vivado_accelerator/pynq-z1/tcl_scripts/axi_master_design.tcl @@ -85,4 +85,4 @@ report_utilization -file util.rpt -hierarchical -hierarchical_percentages # Export HDF file for SDK flow file mkdir ./hdf -file copy -force ${myproject}_vivado_accelerator/${project_name}.runs/impl_1/${design_name}_wrapper.sysdef ../sdk/hdf/${design_name}_wrapper.hdf +file copy -force ${myproject}_vivado_accelerator/${project_name}.runs/impl_1/${design_name}_wrapper.sysdef ./hdf/${design_name}_wrapper.hdf diff --git a/hls4ml/templates/vivado_accelerator/pynq-z2/tcl_scripts/axi_master_design.tcl b/hls4ml/templates/vivado_accelerator/pynq-z2/tcl_scripts/axi_master_design.tcl index e33c6d7ee9..b3c3ba9c0d 100644 --- a/hls4ml/templates/vivado_accelerator/pynq-z2/tcl_scripts/axi_master_design.tcl +++ b/hls4ml/templates/vivado_accelerator/pynq-z2/tcl_scripts/axi_master_design.tcl @@ -85,4 +85,4 @@ report_utilization -file util.rpt -hierarchical -hierarchical_percentages # Export HDF file for SDK flow file mkdir ./hdf -file copy -force ${myproject}_vivado_accelerator/${project_name}.runs/impl_1/${design_name}_wrapper.sysdef ../sdk/hdf/${design_name}_wrapper.hdf +file copy -force ${myproject}_vivado_accelerator/${project_name}.runs/impl_1/${design_name}_wrapper.sysdef ./hdf/${design_name}_wrapper.hdf diff --git a/hls4ml/templates/vivado_accelerator_config.py b/hls4ml/templates/vivado_accelerator_config.py index 2896d3d144..085a54f754 100644 --- a/hls4ml/templates/vivado_accelerator_config.py +++ b/hls4ml/templates/vivado_accelerator_config.py @@ -120,11 +120,15 @@ def get_board(self): def get_driver_path(self): return '../templates/vivado_accelerator/' + self.board + '/' + self.driver + '_drivers/' + \ - self.get_driver_file() - - def get_driver_file(self): - driver_ext = '.py' if self.driver == 'python' else '.h' - return self.interface + '_driver' + driver_ext + self.get_driver_files() + + def get_driver_files(self): + if self.driver == 'c': + driver_dir = 'sdk' + return driver_dir + elif self.driver == 'python': + driver_ext = '.py' + return self.interface + '_driver' + driver_ext def get_input_type(self): return self.input_type diff --git a/hls4ml/writer/vivado_accelerator_writer.py b/hls4ml/writer/vivado_accelerator_writer.py index 2628199996..50551aa35f 100644 --- a/hls4ml/writer/vivado_accelerator_writer.py +++ b/hls4ml/writer/vivado_accelerator_writer.py @@ -1,5 +1,6 @@ import os from shutil import copyfile +from shutil import copytree from hls4ml.templates.vivado_accelerator_config import VivadoAcceleratorConfig from hls4ml.writer.vivado_writer import VivadoWriter @@ -328,8 +329,12 @@ def write_board_script(self, model): def write_driver(self, model): filedir = os.path.dirname(os.path.abspath(__file__)) - copyfile(os.path.join(filedir, self.vivado_accelerator_config.get_driver_path()), - ('{}/' + self.vivado_accelerator_config.get_driver_file()).format(model.config.get_output_dir())) + if os.path.isdir(os.path.join(filedir, self.vivado_accelerator_config.get_driver_path())): + copytree(os.path.join(filedir, self.vivado_accelerator_config.get_driver_path()), + ('{}/' + self.vivado_accelerator_config.get_driver_files()).format(model.config.get_output_dir())) + else: + copyfile(os.path.join(filedir, self.vivado_accelerator_config.get_driver_path()), + ('{}/' + self.vivado_accelerator_config.get_driver_files()).format(model.config.get_output_dir())) def write_new_tar(self, model): os.remove(model.config.get_output_dir() + '.tar.gz') @@ -343,7 +348,7 @@ def write_hls(self, model): model.get_output_variables()) super(VivadoAcceleratorWriter, self).write_hls(model) self.write_board_script(model) - #self.write_driver(model) + self.write_driver(model) self.write_wrapper_test(model) self.write_axi_wrapper(model) self.modify_build_script(model) From c1f467066b6c8ec31f009d0f9ea1878084dcf5da Mon Sep 17 00:00:00 2001 From: Giuseppe Di Guglielmo Date: Sun, 28 Nov 2021 17:53:54 -0800 Subject: [PATCH 054/102] Move data.h generator into hls4ml --- .../pynq-z1/c_drivers/sdk/setup.tcl | 1 + hls4ml/writer/vivado_accelerator_writer.py | 56 +++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/setup.tcl b/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/setup.tcl index 1c9d37b799..88fb41fe4e 100644 --- a/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/setup.tcl +++ b/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/setup.tcl @@ -6,6 +6,7 @@ if { $::argc == 1 } { set myproject [lindex $::argv 0] createhw -name ${myproject}\_platform -hwspec ../hdf/${myproject}\_wrapper.hdf createapp -name ${myproject}\_standalone -app {Hello World} -proc ps7_cortexa9_0 -hwproject ${myproject}\_platform -os standalone + configapp -app ${myproject}\_standalone build-config release #createapp -name ${myproject}\_standalone -app {Hello World} -proc psu_cortexa53_0 -hwproject ${myproject}\_platform -os standalone -arch 64 #configapp -app ${myproject}\_standalone -add define-compiler-symbols {FLAG=VALUE} #projects -build diff --git a/hls4ml/writer/vivado_accelerator_writer.py b/hls4ml/writer/vivado_accelerator_writer.py index 50551aa35f..f030572662 100644 --- a/hls4ml/writer/vivado_accelerator_writer.py +++ b/hls4ml/writer/vivado_accelerator_writer.py @@ -327,6 +327,62 @@ def write_board_script(self, model): f.write('set bit_width_hls_input {}\n'.format(out_bit)) f.close() + # TODO: Extract parameters from the model + def write_header_file(X, y, y_keras, y_hls, n_samples, filename='data.h'): + header_file = open(filename, 'w') + (n_X_samples, n_X_inputs) = X.shape + (n_y_samples, n_y_outputs) = y.shape + (n_y_keras_samples, n_y_keras_outputs) = y_keras.shape + (n_y_hls_samples, n_y_hls_outputs) = y_hls.shape + + header_file.write('#ifndef __DATA_H__\n') + header_file.write('#define __DATA_H__\n') + header_file.write('/* ouf of {} */\n'.format(n_X_samples)) + header_file.write('#define N_SAMPLES {}\n'.format(n_samples)) + header_file.write('\n') + header_file.write('#define N_X_INPUTS {}\n'.format(n_X_inputs)) + header_file.write('const float data_X_inputs[N_SAMPLES*N_X_INPUTS] = {\n') + for s in range(n_samples): + header_file.write(' ') + for i in range(n_X_inputs): + header_file.write('{}, '.format(X[s][i])) + header_file.write('\n') + header_file.write('};\n') + header_file.write('\n') + header_file.write('/* Ground truth - for validation */\n') + header_file.write('#define N_Y_OUTPUTS {}\n'.format(n_y_outputs)) + header_file.write('const float data_y_outputs[N_SAMPLES*N_Y_OUTPUTS] = {\n') + for s in range(n_samples): + header_file.write(' ') + for o in range(n_y_outputs): + header_file.write('{}, '.format(y[s][o])) + header_file.write('\n') + header_file.write('};\n') + header_file.write('\n') + header_file.write('/* Keras outputs - for validation */\n') + header_file.write('#define N_Y_KERAS_OUTPUTS {}\n'.format(n_y_keras_outputs)) + header_file.write('') + header_file.write('const float data_y_keras_outputs[N_SAMPLES*N_Y_KERAS_OUTPUTS] = {\n') + for s in range(n_samples): + header_file.write(' ') + for o in range(n_y_keras_outputs): + header_file.write('{}, '.format(y_keras[s][o])) + header_file.write('\n') + header_file.write('};\n') + header_file.write('\n') + header_file.write('/* csim outputs - for verification */\n') + header_file.write('#define N_Y_HLS_OUTPUTS {}\n'.format(n_y_hls_outputs)) + header_file.write('') + header_file.write('const float data_y_hls_outputs[N_SAMPLES*N_Y_HLS_OUTPUTS] = {\n') + for s in range(n_samples): + header_file.write(' ') + for o in range(n_y_hls_outputs): + header_file.write('{}, '.format(y_hls[s][o])) + header_file.write('\n') + header_file.write('};\n') + header_file.write('#endif\n') + header_file.close() + def write_driver(self, model): filedir = os.path.dirname(os.path.abspath(__file__)) if os.path.isdir(os.path.join(filedir, self.vivado_accelerator_config.get_driver_path())): From aefe0c910fe1e05fb1dfa32e6df148b93cfef988 Mon Sep 17 00:00:00 2001 From: Giuseppe Di Guglielmo Date: Wed, 1 Dec 2021 19:36:49 -0800 Subject: [PATCH 055/102] Copy directory even when the directory exists --- hls4ml/writer/vivado_accelerator_writer.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/hls4ml/writer/vivado_accelerator_writer.py b/hls4ml/writer/vivado_accelerator_writer.py index f030572662..3901c339a8 100644 --- a/hls4ml/writer/vivado_accelerator_writer.py +++ b/hls4ml/writer/vivado_accelerator_writer.py @@ -385,12 +385,12 @@ def write_header_file(X, y, y_keras, y_hls, n_samples, filename='data.h'): def write_driver(self, model): filedir = os.path.dirname(os.path.abspath(__file__)) - if os.path.isdir(os.path.join(filedir, self.vivado_accelerator_config.get_driver_path())): - copytree(os.path.join(filedir, self.vivado_accelerator_config.get_driver_path()), - ('{}/' + self.vivado_accelerator_config.get_driver_files()).format(model.config.get_output_dir())) + srcfiles = os.path.join(filedir, self.vivado_accelerator_config.get_driver_path()) + dstfiles = ('{}/' + self.vivado_accelerator_config.get_driver_files()).format(model.config.get_output_dir()) + if os.path.isdir(srcfiles): + copytree(srcfiles, dstfiles, dirs_exist_ok=True) else: - copyfile(os.path.join(filedir, self.vivado_accelerator_config.get_driver_path()), - ('{}/' + self.vivado_accelerator_config.get_driver_files()).format(model.config.get_output_dir())) + copyfile(srcfiles, dstfiles) def write_new_tar(self, model): os.remove(model.config.get_output_dir() + '.tar.gz') From 77ff677fe026ac6a6ab7ccfdd2655e0ddbebd34e Mon Sep 17 00:00:00 2001 From: Giuseppe Di Guglielmo Date: Sat, 11 Dec 2021 14:59:47 -0800 Subject: [PATCH 056/102] String compare with '==' rather than 'is' --- hls4ml/templates/vivado_accelerator_config.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hls4ml/templates/vivado_accelerator_config.py b/hls4ml/templates/vivado_accelerator_config.py index 085a54f754..b7c90f0973 100644 --- a/hls4ml/templates/vivado_accelerator_config.py +++ b/hls4ml/templates/vivado_accelerator_config.py @@ -61,16 +61,16 @@ def __init__(self, config, model_inputs, model_outputs): if out_axi_t not in ['float', 'double']: self.output_type = self._next_factor8_type(config.backend.convert_precision_string(out_axi_t)) - if self.input_type is 'float': + if self.input_type == 'float': self.input_bitwidth = 32 - elif self.input_type is 'double': + elif self.input_type == 'double': self.input_bitwidth = 64 else: self.input_bitwidth = config.backend.convert_precision_string(inp_axi_t).width - if out_axi_t is 'float': + if out_axi_t == 'float': self.output_bitwidth = 32 - elif out_axi_t is 'double': + elif out_axi_t == 'double': self.output_bitwidth = 64 else: self.output_bitwidth = config.backend.convert_precision_string(out_axi_t).width From a9aeb33ae8df17006fcc04241403a14ff13cb4fc Mon Sep 17 00:00:00 2001 From: Giuseppe Di Guglielmo Date: Mon, 3 Jan 2022 14:47:19 -0800 Subject: [PATCH 057/102] Add validation besides verification to the software application (Pynq-Z1) --- .../pynq-z1/c_drivers/sdk/common/main.c | 78 ++++++++++++------- 1 file changed, 49 insertions(+), 29 deletions(-) diff --git a/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/common/main.c b/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/common/main.c index 59325a60da..7dd2be22a8 100644 --- a/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/common/main.c +++ b/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/common/main.c @@ -28,12 +28,25 @@ const unsigned INPUT_N_ELEMENTS = N_SAMPLES * N_X_INPUTS; const unsigned OUTPUT_N_ELEMENTS = N_SAMPLES * N_Y_OUTPUTS; -#if 0 +#if 1 +/* Accelerator verification */ +#define REFERENCE_OUTPUTS data_y_hls_outputs +#else +/* Accelerator validation */ #define REFERENCE_OUTPUTS data_y_outputs -#define REFERENCE_OUTPUTS data_y_keras_outputs +//#define REFERENCE_OUTPUTS data_y_keras_outputs #endif -#define REFERENCE_OUTPUTS data_y_hls_outputs +unsigned get_max(float *data, unsigned n_elements) { + float max_value = 0.0; + unsigned max_index = 0; + for (unsigned i = 0; i < n_elements; i++) + if (data[i] >= max_value) { + max_index = i; + max_value = data[i]; + } + return max_index; +} float *inputs_mem = NULL; float *outputs_mem = NULL; @@ -55,27 +68,11 @@ void init_accelerators() { } } -//#if defined(__HPC_ACCELERATOR__) || defined(__ACP_ACCELERATOR__) -///* -// * TODO: remember to edit core_baremetal_polling_bsp/psu_cortexa53_0/libsrc/standalon_v6_5/src/bspconfig.h -// * -// * #define EL1_NONSECURE 1 -// * -// */ -//void init_accelerator_coherency(UINTPTR base_addr) -//{ -// /* Enable snooping of APU caches from CCI */ -// Xil_Out32(0xFD6E4000, 0x1); -// -// /* Configure AxCACHE for write-back read and write-allocate (ARCACHE is [7:4], AWCACHE is [11:8]) */ -// /* Configure AxPROT[2:0] for data access [2], secure access [1], unprivileged access [0] */ -// Xil_Out32(base_addr, 0xFF0); -//} -//#endif - /* Reference implementation of the accelerator in software */ int sw_reference_implementation(float *sw_inputs_mem, float *sw_outputs_mem, unsigned n_samples, unsigned n_X_inputs, unsigned n_y_ouputs) { +#ifdef __DEBUG__ PRINTF("INFO: Reference outputs are pre-compiled. It would be nice to run a software model here.\r\n"); +#endif /* See data.h for inputs and outputs */ for (unsigned i = 0; i < n_samples * n_y_ouputs; i++) { sw_outputs_mem[i] = REFERENCE_OUTPUTS[i]; @@ -83,7 +80,7 @@ int sw_reference_implementation(float *sw_inputs_mem, float *sw_outputs_mem, uns return 0; } -/* profiling function */ +/* Profiling function */ double get_elapsed_time(XTime start, XTime stop) { return 1.0 * (stop - start) / (COUNTS_PER_SECOND); } @@ -135,7 +132,7 @@ int main(int argc, char** argv) { calibration_time = get_elapsed_time(start, stop); PRINTF("INFO: Time calibration for one second (%lf sec)\r\n", calibration_time); - /* initialize memory */ + /* Initialize memory */ PRINTF("INFO: Initialize memory\r\n"); PRINTF("INFO: - Samples count: %u\r\n", N_SAMPLES); /* Same as dst_SAMPLE_COUNT */ PRINTF("INFO: - Inputs count: %u\r\n", N_X_INPUTS); @@ -187,10 +184,10 @@ int main(int argc, char** argv) { XMyproject_axi_Start(&accelerator); /* TODO: design-dependent name */ - /* polling */ + /* Polling */ while (!XMyproject_axi_IsDone(&accelerator)); /* TODO: design-dependent name */ - /* get error status */ + /* Get error status */ //hw_flags = XMyproject_axi_Get_return(&accelerator); /* TODO: design-dependent name */ XTime_GetTime(&stop); hw_elapsed += get_elapsed_time(start, stop); @@ -212,14 +209,20 @@ int main(int argc, char** argv) { dump_data("reference_mem", reference_mem, N_SAMPLES, N_Y_OUTPUTS); #endif +#ifdef __DEBUG__ PRINTF("INFO: SW execution time: %f sec\r\n", sw_elapsed); - PRINTF("INFO: Total HW-acceleration execution time (%d inferences): %f sec\r\n", N_SAMPLES, hw_elapsed); - PRINTF("INFO: Per-inference HW-acceleration execution time (average): %.12f sec (%f ns)\r\n", hw_elapsed / (N_SAMPLES), (hw_elapsed*1000.0) / (N_SAMPLES)); +#endif + PRINTF("INFO: HW-acceleration exec. time (%d inferences):\r\n", N_SAMPLES); + PRINTF("INFO: - total %f sec\r\n", hw_elapsed); + PRINTF("INFO: - per-inference %.12f sec (%f ns)\r\n", hw_elapsed / (N_SAMPLES), (hw_elapsed*1000.0) / (N_SAMPLES)); PRINTF("INFO: Cache flush time: %f sec\r\n", cache_elapsed); +#ifdef __DEBUG__ PRINTF("INFO: HW/SW speedup (the software is fake so this does not count...): %.2f X\r\n", (sw_elapsed >= (hw_elapsed+cache_elapsed))?(sw_elapsed/(hw_elapsed+cache_elapsed)):-((hw_elapsed+cache_elapsed)/sw_elapsed)); +#endif - /* Accelerator validation */ hw_errors = 0; +#if 1 + /* Accelerator verification */ for (int i = 0; i < OUTPUT_N_ELEMENTS; i++) { if (outputs_mem[i] != reference_mem[i]) { PRINTF("ERROR: [%d]: Accelerator HW %f != SW %f\r\n", i, outputs_mem[i], reference_mem[i]); @@ -231,7 +234,24 @@ int main(int argc, char** argv) { PRINTF("INFO: Verification: FAIL\r\n"); else PRINTF("INFO: Verification: PASS!\r\n"); - +#else + /* Accelerator validation */ + for (unsigned s = 0; s < N_SAMPLES; s++) { + unsigned ref_digit = get_max(reference_mem + s * N_Y_OUTPUTS, N_Y_OUTPUTS); + unsigned hw_digit = get_max(outputs_mem + s * N_Y_OUTPUTS, N_Y_OUTPUTS); + if (hw_digit != ref_digit) { +#ifdef __DEBUG__ + PRINTF("ERROR: [%d]: Accelerator HW %u != SW %u\r\n", s, hw_digit, ref_digit); +#endif + hw_errors++; + } + } + float error_rate = (hw_errors / (float)(N_SAMPLES)) * 100.0; + float accuracy = 100 - ((hw_errors / (float)(N_SAMPLES)) * 100.0); + PRINTF("INFO: Total errors = %d (out of %d digits)\r\n", hw_errors, N_SAMPLES); + PRINTF("INFO: Error rate = %.2f %%\r\n", error_rate); + PRINTF("INFO: Accuracy = %.2f %%\r\n", accuracy); +#endif PRINTF("INFO: ==================================================\r\n"); cleanup_platform(); From d146994ab3ff10fca4945bf48dd47c8263d4caef Mon Sep 17 00:00:00 2001 From: Giuseppe Di Guglielmo Date: Wed, 5 Jan 2022 11:02:30 -0800 Subject: [PATCH 058/102] Set stack/heap size in the linker script --- .../vivado_accelerator/pynq-z1/c_drivers/sdk/setup.tcl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/setup.tcl b/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/setup.tcl index 88fb41fe4e..6aa52fe632 100644 --- a/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/setup.tcl +++ b/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/setup.tcl @@ -7,6 +7,9 @@ if { $::argc == 1 } { createhw -name ${myproject}\_platform -hwspec ../hdf/${myproject}\_wrapper.hdf createapp -name ${myproject}\_standalone -app {Hello World} -proc ps7_cortexa9_0 -hwproject ${myproject}\_platform -os standalone configapp -app ${myproject}\_standalone build-config release + configapp -app ${myproject}\_standalone -add linker-misc {-Wl,--defsym=_HEAP_SIZE=0x1000000} + configapp -app ${myproject}\_standalone -add linker-misc {-Wl,--defsym=_STACK_SIZE=0x40000} + #createapp -name ${myproject}\_standalone -app {Hello World} -proc psu_cortexa53_0 -hwproject ${myproject}\_platform -os standalone -arch 64 #configapp -app ${myproject}\_standalone -add define-compiler-symbols {FLAG=VALUE} #projects -build From 08ee073030838b00a5b04f289642542a06901d43 Mon Sep 17 00:00:00 2001 From: Giuseppe Di Guglielmo Date: Wed, 5 Jan 2022 11:03:41 -0800 Subject: [PATCH 059/102] ATTENTION: force 1 the size of the scratchpads in the AXI-M wrapper (this may break co-simulation, but uses far less resources) --- hls4ml/writer/vivado_accelerator_writer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hls4ml/writer/vivado_accelerator_writer.py b/hls4ml/writer/vivado_accelerator_writer.py index 3901c339a8..1da67a001b 100644 --- a/hls4ml/writer/vivado_accelerator_writer.py +++ b/hls4ml/writer/vivado_accelerator_writer.py @@ -99,8 +99,8 @@ def write_axi_wrapper(self, model): elif io_type == 'io_stream': newline += indent + 'hls::stream<' + inp.type.name + '> in_local("input_1");\n' newline += indent + 'hls::stream<' + out.type.name + '> out_local("output_1");\n\n' - newline += indent + '#pragma HLS STREAM variable=in_local depth=N_IN\n' - newline += indent + '#pragma HLS STREAM variable=out_local depth=N_OUT\n' + newline += indent + '#pragma HLS STREAM variable=in_local depth=1 /*N_IN*/\n' + newline += indent + '#pragma HLS STREAM variable=out_local depth=1 /*N_OUT*/\n' elif '//hls-fpga-machine-learning insert call' in line: newline = indent + '{}(in_local, out_local, in_size, out_size);\n'.format( model.config.get_project_name()) From cd27c4c7a20680f88024b577a1938174a9307ffe Mon Sep 17 00:00:00 2001 From: Giuseppe Di Guglielmo Date: Fri, 7 Jan 2022 13:52:54 -0800 Subject: [PATCH 060/102] Set software for ultra96-v2 --- .../pynq-z1/c_drivers/sdk/setup.tcl | 4 +- .../ultra96v2/c_drivers/sdk/Makefile | 33 +++ .../ultra96v2/c_drivers/sdk/common/main.c | 262 ++++++++++++++++++ .../ultra96v2/c_drivers/sdk/setup.tcl | 18 ++ .../tcl_scripts/axi_master_design.tcl | 2 +- 5 files changed, 315 insertions(+), 4 deletions(-) create mode 100644 hls4ml/templates/vivado_accelerator/ultra96v2/c_drivers/sdk/Makefile create mode 100644 hls4ml/templates/vivado_accelerator/ultra96v2/c_drivers/sdk/common/main.c create mode 100644 hls4ml/templates/vivado_accelerator/ultra96v2/c_drivers/sdk/setup.tcl diff --git a/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/setup.tcl b/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/setup.tcl index 6aa52fe632..5e9e92d501 100644 --- a/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/setup.tcl +++ b/hls4ml/templates/vivado_accelerator/pynq-z1/c_drivers/sdk/setup.tcl @@ -9,8 +9,6 @@ if { $::argc == 1 } { configapp -app ${myproject}\_standalone build-config release configapp -app ${myproject}\_standalone -add linker-misc {-Wl,--defsym=_HEAP_SIZE=0x1000000} configapp -app ${myproject}\_standalone -add linker-misc {-Wl,--defsym=_STACK_SIZE=0x40000} - - #createapp -name ${myproject}\_standalone -app {Hello World} -proc psu_cortexa53_0 -hwproject ${myproject}\_platform -os standalone -arch 64 + projects -build #configapp -app ${myproject}\_standalone -add define-compiler-symbols {FLAG=VALUE} - #projects -build } diff --git a/hls4ml/templates/vivado_accelerator/ultra96v2/c_drivers/sdk/Makefile b/hls4ml/templates/vivado_accelerator/ultra96v2/c_drivers/sdk/Makefile new file mode 100644 index 0000000000..03ab9b8de7 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/ultra96v2/c_drivers/sdk/Makefile @@ -0,0 +1,33 @@ +DESIGN := design_1 + +help: + @echo "INFO: make to show targets" +.PHONY: help + +--setup: + xsct ./setup.tcl $(DESIGN) +.PHONY: --setup + +sdk: --setup + rm -f $(DESIGN)_standalone/src/helloworld.c + cd $(DESIGN)_standalone/src && ln -s ../../common/main.c main.c + cd $(DESIGN)_standalone/src && ln -s ../../common/data.h data.h +.PHONY: sdk + +gui: + xsdk --workspace . & +.PHONY: gui + +clean: + rm -rf $(DESIGN)_platform + rm -rf $(DESIGN)_standalone + rm -rf $(DESIGN)_standalone_bsp + rm -rf RemoteSystemsTempFiles + rm -rf .Xil + rm -rf .metadata + rm -f *.log +.PHONY: clean + +ultraclean: clean + rm -rf hdf/*.hdf +.PHONY: ultraclean diff --git a/hls4ml/templates/vivado_accelerator/ultra96v2/c_drivers/sdk/common/main.c b/hls4ml/templates/vivado_accelerator/ultra96v2/c_drivers/sdk/common/main.c new file mode 100644 index 0000000000..7dd2be22a8 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/ultra96v2/c_drivers/sdk/common/main.c @@ -0,0 +1,262 @@ +/** + * + * Set Heap Size in ldscript.ld to 0x1000000 (16MB) + * + */ + +#include "xmyproject_axi.h" /* TODO: design-dependent name */ +#include "stdio.h" /* PRINTF */ +#include "unistd.h" /* sleep */ +#include "stdlib.h" +#include "malloc.h" +#include "assert.h" +#include "xil_io.h" /* peripheral read/write wrappers */ +#include "xtime_l.h" /* to measure performance of the system */ +#include "platform.h" /* platform init/cleanup functions */ +#include "xil_cache.h" /* enable/disable caches etc */ +#include "xil_printf.h" /* UART debug print functions */ +#include "xparameters.h" /* peripherals base addresses */ + +#include "data.h" + +//#define __DEBUG__ + +#define MAX_PRINT_ELEMENTS (16) + +#define PRINTF printf + +const unsigned INPUT_N_ELEMENTS = N_SAMPLES * N_X_INPUTS; +const unsigned OUTPUT_N_ELEMENTS = N_SAMPLES * N_Y_OUTPUTS; + +#if 1 +/* Accelerator verification */ +#define REFERENCE_OUTPUTS data_y_hls_outputs +#else +/* Accelerator validation */ +#define REFERENCE_OUTPUTS data_y_outputs +//#define REFERENCE_OUTPUTS data_y_keras_outputs +#endif + +unsigned get_max(float *data, unsigned n_elements) { + float max_value = 0.0; + unsigned max_index = 0; + for (unsigned i = 0; i < n_elements; i++) + if (data[i] >= max_value) { + max_index = i; + max_value = data[i]; + } + return max_index; +} + +float *inputs_mem = NULL; +float *outputs_mem = NULL; +float *reference_mem = NULL; + +/* Accelerator configuration */ +XMyproject_axi accelerator; /* TODO: design-dependent name */ +XMyproject_axi_Config *accelerator_cfg; /* TODO: design-dependent name */ + +/* Accelerator initialization routine */ +void init_accelerators() { + PRINTF("INFO: Initializing accelerator\r\n"); + accelerator_cfg = XMyproject_axi_LookupConfig(XPAR_MYPROJECT_AXI_0_DEVICE_ID); /* TODO: design-dependent name */ + if (accelerator_cfg) { + int status = XMyproject_axi_CfgInitialize(&accelerator, accelerator_cfg); /* TODO: design-dependent name */ + if (status != XST_SUCCESS) { + PRINTF("ERROR: Initializing accelerator\r\n"); + } + } +} + +/* Reference implementation of the accelerator in software */ +int sw_reference_implementation(float *sw_inputs_mem, float *sw_outputs_mem, unsigned n_samples, unsigned n_X_inputs, unsigned n_y_ouputs) { +#ifdef __DEBUG__ + PRINTF("INFO: Reference outputs are pre-compiled. It would be nice to run a software model here.\r\n"); +#endif + /* See data.h for inputs and outputs */ + for (unsigned i = 0; i < n_samples * n_y_ouputs; i++) { + sw_outputs_mem[i] = REFERENCE_OUTPUTS[i]; + } + return 0; +} + +/* Profiling function */ +double get_elapsed_time(XTime start, XTime stop) { + return 1.0 * (stop - start) / (COUNTS_PER_SECOND); +} + +/* Dump data to the console */ +void dump_data(const char* label, float* data, unsigned n_samples, unsigned feature_count) { + PRINTF("INFO: %s[%u][%u]:\r\n", label, n_samples, feature_count); + /* Print at most MAX_PRINT_ELEMENTS */ + for (unsigned i = 0; i < n_samples && i < MAX_PRINT_ELEMENTS; i++) { + PRINTF("INFO: [%u] ", i); + for (unsigned j = 0; j < feature_count; j++) { + unsigned index = i * feature_count + j; + PRINTF("%f ", data[index]); + } + PRINTF("\r\n"); + } +} + +/* The top of the hill :-) */ +int main(int argc, char** argv) { + + XTime start, stop; + double calibration_time; + double sw_elapsed = 0; + double hw_elapsed = 0; + double cache_elapsed = 0; + unsigned hw_errors; + + char __attribute__ ((unused)) dummy; /* dummy input */ + + /* Initialize platform (uart and caches) */ + init_platform(); + + PRINTF("\r\n"); + PRINTF("INFO: ==================================================\r\n"); + PRINTF("INFO: XMyproject_axi (w/ polling)\r\n"); /* TODO: design-dependent name */ + PRINTF("INFO: ==================================================\r\n"); + + init_accelerators(); + + inputs_mem = malloc(INPUT_N_ELEMENTS * sizeof(float)); + outputs_mem = malloc(OUTPUT_N_ELEMENTS * sizeof(float)); + reference_mem = malloc(OUTPUT_N_ELEMENTS * sizeof(float)); + + /* Calibration */ + XTime_GetTime(&start); + sleep(1); + XTime_GetTime(&stop); + calibration_time = get_elapsed_time(start, stop); + PRINTF("INFO: Time calibration for one second (%lf sec)\r\n", calibration_time); + + /* Initialize memory */ + PRINTF("INFO: Initialize memory\r\n"); + PRINTF("INFO: - Samples count: %u\r\n", N_SAMPLES); /* Same as dst_SAMPLE_COUNT */ + PRINTF("INFO: - Inputs count: %u\r\n", N_X_INPUTS); + PRINTF("INFO: - Outputs count: %u\r\n", N_Y_OUTPUTS); + PRINTF("INFO: - Data size: %u B\r\n", sizeof(float)); + PRINTF("INFO: - Total input size: %u B, %.2f KB, %.2f MB\r\n", N_X_INPUTS * N_SAMPLES * sizeof(float), (N_X_INPUTS * N_SAMPLES * sizeof(float)) / (float)1024, (N_X_INPUTS * N_SAMPLES * sizeof(float)) / (float)(1024*1024)); + PRINTF("INFO: - Total output size: %u B, %.2f KB, %.2f MB\r\n", N_Y_OUTPUTS * N_SAMPLES * sizeof(float), (N_Y_OUTPUTS * N_SAMPLES * sizeof(float)) / (float)1024, (N_Y_OUTPUTS * N_SAMPLES * sizeof(float)) / (float)(1024*1024)); + + // Set Heap Size in ldscript.ld to 0x1000000 (16MB) + //malloc_stats(); + + for (int i = 0; i < INPUT_N_ELEMENTS; i++) { + inputs_mem[i] = data_X_inputs[i]; + } + for (int i = 0; i < OUTPUT_N_ELEMENTS; i++) { + outputs_mem[i] = 0x0; + } + + /* ****** SW REFERENCE ****** */ + PRINTF("INFO: ==================================================\r\n"); + PRINTF("INFO: Start SW reference implementation\r\n"); + XTime_GetTime(&start); + sw_reference_implementation(inputs_mem, reference_mem, N_SAMPLES, N_X_INPUTS, N_Y_OUTPUTS); + XTime_GetTime(&stop); + sw_elapsed = get_elapsed_time(start, stop); + PRINTF("INFO: ==================================================\r\n"); + PRINTF("INFO: Press any key to start:\r\n"); + dummy = inbyte(); + //PRINTF("INFO:"); + + /* ****** HW ACCELERATOR ****** */ + PRINTF("INFO: Start HW accelerator\r\n"); + + XTime_GetTime(&start); + Xil_DCacheFlushRange((UINTPTR)inputs_mem, INPUT_N_ELEMENTS * sizeof(float)); + Xil_DCacheFlushRange((UINTPTR)outputs_mem, OUTPUT_N_ELEMENTS * sizeof(float)); + Xil_DCacheFlushRange((UINTPTR)reference_mem, OUTPUT_N_ELEMENTS * sizeof(float)); + XTime_GetTime(&stop); + cache_elapsed = get_elapsed_time(start, stop); + + for (unsigned j = 0; j < N_SAMPLES; j++) { + float *inputs_mem_i = inputs_mem + j * N_X_INPUTS; + float *outputs_mem_i = outputs_mem + j * N_Y_OUTPUTS; + + /* Configure the accelerator */ + XTime_GetTime(&start); + XMyproject_axi_Set_in_r(&accelerator, (unsigned)inputs_mem_i); /* TODO: design-dependent name */ + XMyproject_axi_Set_out_r(&accelerator, (unsigned)outputs_mem_i); /* TODO: design-dependent name */ + + XMyproject_axi_Start(&accelerator); /* TODO: design-dependent name */ + + /* Polling */ + while (!XMyproject_axi_IsDone(&accelerator)); /* TODO: design-dependent name */ + + /* Get error status */ + //hw_flags = XMyproject_axi_Get_return(&accelerator); /* TODO: design-dependent name */ + XTime_GetTime(&stop); + hw_elapsed += get_elapsed_time(start, stop); + } + + XTime_GetTime(&start); + Xil_DCacheFlushRange((UINTPTR)outputs_mem, OUTPUT_N_ELEMENTS * sizeof(float)); + XTime_GetTime(&stop); + cache_elapsed += get_elapsed_time(start, stop); + + PRINTF("INFO: HW accelerator done!\r\n"); + + /* ****** VALIDATION ****** */ + PRINTF("INFO: ================== Verification ==================\r\n"); +#ifdef __DEBUG__ + PRINTF("INFO: Dump data\r\n"); + dump_data("inputs_mem", inputs_mem, N_SAMPLES, N_X_INPUTS); + dump_data("outputs_mem", outputs_mem, N_SAMPLES, N_Y_OUTPUTS); + dump_data("reference_mem", reference_mem, N_SAMPLES, N_Y_OUTPUTS); +#endif + +#ifdef __DEBUG__ + PRINTF("INFO: SW execution time: %f sec\r\n", sw_elapsed); +#endif + PRINTF("INFO: HW-acceleration exec. time (%d inferences):\r\n", N_SAMPLES); + PRINTF("INFO: - total %f sec\r\n", hw_elapsed); + PRINTF("INFO: - per-inference %.12f sec (%f ns)\r\n", hw_elapsed / (N_SAMPLES), (hw_elapsed*1000.0) / (N_SAMPLES)); + PRINTF("INFO: Cache flush time: %f sec\r\n", cache_elapsed); +#ifdef __DEBUG__ + PRINTF("INFO: HW/SW speedup (the software is fake so this does not count...): %.2f X\r\n", (sw_elapsed >= (hw_elapsed+cache_elapsed))?(sw_elapsed/(hw_elapsed+cache_elapsed)):-((hw_elapsed+cache_elapsed)/sw_elapsed)); +#endif + + hw_errors = 0; +#if 1 + /* Accelerator verification */ + for (int i = 0; i < OUTPUT_N_ELEMENTS; i++) { + if (outputs_mem[i] != reference_mem[i]) { + PRINTF("ERROR: [%d]: Accelerator HW %f != SW %f\r\n", i, outputs_mem[i], reference_mem[i]); + hw_errors++; + } + } + PRINTF("INFO: Total errors = %d (out of %d elements)\r\n", hw_errors, OUTPUT_N_ELEMENTS); + if (hw_errors > 0) + PRINTF("INFO: Verification: FAIL\r\n"); + else + PRINTF("INFO: Verification: PASS!\r\n"); +#else + /* Accelerator validation */ + for (unsigned s = 0; s < N_SAMPLES; s++) { + unsigned ref_digit = get_max(reference_mem + s * N_Y_OUTPUTS, N_Y_OUTPUTS); + unsigned hw_digit = get_max(outputs_mem + s * N_Y_OUTPUTS, N_Y_OUTPUTS); + if (hw_digit != ref_digit) { +#ifdef __DEBUG__ + PRINTF("ERROR: [%d]: Accelerator HW %u != SW %u\r\n", s, hw_digit, ref_digit); +#endif + hw_errors++; + } + } + float error_rate = (hw_errors / (float)(N_SAMPLES)) * 100.0; + float accuracy = 100 - ((hw_errors / (float)(N_SAMPLES)) * 100.0); + PRINTF("INFO: Total errors = %d (out of %d digits)\r\n", hw_errors, N_SAMPLES); + PRINTF("INFO: Error rate = %.2f %%\r\n", error_rate); + PRINTF("INFO: Accuracy = %.2f %%\r\n", accuracy); +#endif + PRINTF("INFO: ==================================================\r\n"); + + cleanup_platform(); + + return 0; +} + + diff --git a/hls4ml/templates/vivado_accelerator/ultra96v2/c_drivers/sdk/setup.tcl b/hls4ml/templates/vivado_accelerator/ultra96v2/c_drivers/sdk/setup.tcl new file mode 100644 index 0000000000..ea386d4281 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/ultra96v2/c_drivers/sdk/setup.tcl @@ -0,0 +1,18 @@ +# See +# https://www.xilinx.com/html_docs/xilinx2019_1/SDK_Doc/xsct/intro/xsct_introduction.html + +setws . +if { $::argc == 1 } { + set myproject [lindex $::argv 0] + createhw -name ${myproject}\_platform -hwspec ../hdf/${myproject}\_wrapper.hdf + createapp -name ${myproject}\_standalone -app {Hello World} -proc psu_cortexa53_0 -hwproject ${myproject}\_platform -os standalone -arch 64 + configbsp -bsp ${myproject}\_standalone_bsp stdin psu_uart_1 + configbsp -bsp ${myproject}\_standalone_bsp stdout psu_uart_1 + updatemss -mss ${myproject}\_standalone_bsp/system.mss + regenbsp -bsp ${myproject}\_standalone_bsp + configapp -app ${myproject}\_standalone build-config release + configapp -app ${myproject}\_standalone -add linker-misc {-Wl,--defsym=_HEAP_SIZE=0x1000000} + configapp -app ${myproject}\_standalone -add linker-misc {-Wl,--defsym=_STACK_SIZE=0x40000} + projects -build + #configapp -app ${myproject}\_standalone -add define-compiler-symbols {FLAG=VALUE} +} diff --git a/hls4ml/templates/vivado_accelerator/ultra96v2/tcl_scripts/axi_master_design.tcl b/hls4ml/templates/vivado_accelerator/ultra96v2/tcl_scripts/axi_master_design.tcl index c0ad4c418e..bb91ba9ee2 100644 --- a/hls4ml/templates/vivado_accelerator/ultra96v2/tcl_scripts/axi_master_design.tcl +++ b/hls4ml/templates/vivado_accelerator/ultra96v2/tcl_scripts/axi_master_design.tcl @@ -88,4 +88,4 @@ report_utilization -file util.rpt -hierarchical -hierarchical_percentages # Export HDF file for SDK flow file mkdir ./hdf -file copy -force ${myproject}_vivado_accelerator/${project_name}.runs/impl_1/${design_name}_wrapper.sysdef ../sdk/hdf/${design_name}_wrapper.hdf +file copy -force ${myproject}_vivado_accelerator/${project_name}.runs/impl_1/${design_name}_wrapper.sysdef ./hdf/${design_name}_wrapper.hdf From feef1f93b66efc8cf4a28ff210a37e3ce6dfeb25 Mon Sep 17 00:00:00 2001 From: Jules Date: Tue, 11 Jan 2022 13:59:08 -0600 Subject: [PATCH 061/102] init commit of QDenseBN --- hls4ml/converters/keras/core.py | 3 +- hls4ml/converters/keras/qkeras_layers.py | 9 +++++ hls4ml/model/hls_layers.py | 51 ++++++++++++++++++++++++ hls4ml/templates/vivado_template.py | 1 + hls4ml/utils/config.py | 2 +- 5 files changed, 64 insertions(+), 2 deletions(-) diff --git a/hls4ml/converters/keras/core.py b/hls4ml/converters/keras/core.py index bb5ac5ec97..77ec2a0b92 100644 --- a/hls4ml/converters/keras/core.py +++ b/hls4ml/converters/keras/core.py @@ -104,7 +104,8 @@ def parse_activation_layer(keras_layer, input_names, input_shapes, data_reader, @keras_handler('BatchNormalization') def parse_batchnorm_layer(keras_layer, input_names, input_shapes, data_reader, config): - assert('BatchNormalization' in keras_layer['class_name'] or 'QConv2DBatchnorm' in keras_layer['class_name']) + print(keras_layer['class_name']) + assert('BatchNormalization' in keras_layer['class_name'] or 'QConv2DBatchnorm' in keras_layer['class_name'] or 'QDenseBatchnorm' in keras_layer['class_name']) layer = parse_default_keras_layer(keras_layer, input_names) diff --git a/hls4ml/converters/keras/qkeras_layers.py b/hls4ml/converters/keras/qkeras_layers.py index eecacd84bb..fed2daec0b 100644 --- a/hls4ml/converters/keras/qkeras_layers.py +++ b/hls4ml/converters/keras/qkeras_layers.py @@ -110,3 +110,12 @@ def parse_qconv2dbatchnorm_layer(keras_layer, input_names, input_shapes, data_re temp_shape = intermediate_shape batch_layer, out_shape = parse_batchnorm_layer(keras_layer, input_names, temp_shape, data_reader, config) return {**conv_layer, **batch_layer}, out_shape + +@keras_handler('QDenseBatchnorm') +def parse_qdensebatchnorm_layer(keras_layer, input_names, input_shapes, data_reader, config): + intermediate_shape = list() + dense_layer, shape_qdense = parse_qdense_layer(keras_layer, input_names, input_shapes, data_reader, config) + intermediate_shape.append(shape_qdense) + temp_shape = intermediate_shape + batch_layer, out_shape = parse_batchnorm_layer(keras_layer, input_names, temp_shape, data_reader, config) + return {**dense_layer, **batch_layer}, out_shape diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index 9560bfcd40..e370af2f84 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -650,6 +650,56 @@ def config_cpp(self): params['strategy'] = self.get_attr('strategy') return self._config_template.format(**params) +class DenseBatchnorm(Dense): + def _get_folded_weights(self): + """ + Function to get the batchnorm folded weights. + This function converts the weights by folding batchnorm parameters into + the weight of QConv2D. The high-level equation: + W_fold = gamma * W / sqrt(variance + epsilon) + bias_fold = gamma * (bias - moving_mean) / sqrt(variance + epsilon) + beta + """ + kernel = self.model.get_weights_data(self.name, 'kernel') + bias = self.model.get_weights_data(self.name, 'bias') + if bias is None: + bias = 0 + + # get batchnorm weights and moving stats + gamma = self.model.get_weights_data(self.name, 'gamma') + beta = self.model.get_weights_data(self.name, 'beta') + moving_mean = self.model.get_weights_data(self.name, 'moving_mean') + moving_variance = self.model.get_weights_data(self.name, 'moving_variance') + # get the inversion factor so that we replace division by multiplication + inv = np.reciprocal(np.sqrt(moving_variance + self.get_attr('epsilon'))) + if gamma is not None: + inv *= gamma + + # wrap conv kernel and bias with bn parameters + folded_kernel = inv * kernel + folded_bias = inv * (bias - moving_mean) + beta + + return [folded_kernel, folded_bias] + + def initialize(self): + super(DenseBatchnorm, self).initialize() + folded_weights, folded_bias = self._get_folded_weights() + if self.model.config.is_resource_strategy(self) and self.model.config.backend.name == 'Vivado': + self.weights['weight'].data_unquantized = np.transpose(folded_weights, axes=[3, 0, 1, 2]) + self.weights['weight'].data = self.get_attr('weight_quantizer')(self.weights['weight'].data_unquantized) + + else: + self.weights['weight'].data_unquantized = folded_weights + self.weights['weight'].data = self.get_attr('weight_quantizer')(folded_weights) + self.weights['bias'].data_unquantized = folded_bias + bias_q = self.get_attr('bias_quantizer') + if bias_q is not None: + self.weights['bias'].data = bias_q(folded_bias) + + def function_cpp(self): + return super(DenseBatchnorm, self).function_cpp() + + def config_cpp(self): + return super(DenseBatchnorm, self).config_cpp() class Conv1D(Layer): def initialize(self): @@ -1867,6 +1917,7 @@ def _get_transforms_config(self, params): 'BinaryDense' : Dense, 'TernaryDense' : Dense, 'QDense' : Dense, + 'QDenseBatchnorm' : DenseBatchnorm, 'Conv1D' : Conv1D, 'QConv1D' : Conv1D, 'Conv2D' : Conv2D, diff --git a/hls4ml/templates/vivado_template.py b/hls4ml/templates/vivado_template.py index 149b52f1d5..0e20ea7287 100644 --- a/hls4ml/templates/vivado_template.py +++ b/hls4ml/templates/vivado_template.py @@ -386,6 +386,7 @@ def __init__(self, name='Vivado'): super(VivadoBackend, self).__init__(name) self.register_templates('Dense', dense_function_template, dense_config_template, dense_include_list) self.register_templates('BinaryDense' , dense_function_template, dense_config_template, dense_include_list) + self.register_templates('DenseBatchnorm' , dense_function_template, dense_config_template, dense_include_list) self.register_templates('BatchNormalization' , batchnorm_function_template, batchnorm_config_template, batchnorm_include_list) self.register_templates('Conv1D' , conv1d_function_template, [conv1d_config_template, conv_mult_config_template], conv1d_include_list) self.register_templates('Conv2D' , conv2d_function_template, [conv2d_config_template, conv_mult_config_template], conv2d_include_list) diff --git a/hls4ml/utils/config.py b/hls4ml/utils/config.py index b907350bb4..1a99b888b2 100644 --- a/hls4ml/utils/config.py +++ b/hls4ml/utils/config.py @@ -108,7 +108,7 @@ def config_from_keras_model(model, granularity='model', default_precision='ap_fi norm_layers = ['BatchNormalization'] activation_layers = ['Activation', 'LeakyReLU', 'ThresholdedReLU', 'ELU', 'PReLU', 'Softmax', 'ReLU'] merge_layers = ['Add', 'Subtract', 'Multiply', 'Average', 'Maximum', 'Minimum', 'Concatenate', 'Dot'] - qkeras_layers = ['QDense', 'QActivation', 'QConv1D', 'QConv2D', 'QBatchNormalization', 'QConv2DBatchnorm'] + qkeras_layers = ['QDense', 'QActivation', 'QConv1D', 'QConv2D', 'QBatchNormalization', 'QConv2DBatchnorm', 'QDenseBatchnorm'] #Define layers to skip because they're not configurable or not converted to HLS skip_layers = ['Dropout', 'Flatten', 'Reshape', 'Permute'] #All supported layers From 97b14ea43eaf733cc665506b59d8bf8104b5939c Mon Sep 17 00:00:00 2001 From: anmeza Date: Sun, 16 Jan 2022 13:44:32 -0800 Subject: [PATCH 062/102] Added changes needed to carry out the relu_merge optimization --- hls4ml/model/hls_layers.py | 22 +- hls4ml/model/hls_model.py | 13 + hls4ml/model/optimizer/__init__.py | 2 + hls4ml/model/optimizer/passes/relu_merge.py | 29 ++ hls4ml/templates/vivado/firmware/parameters.h | 1 + .../vivado/nnet_utils/nnet_dense_resource.h | 265 +++++++++++++++++- hls4ml/templates/vivado_template.py | 4 + 7 files changed, 322 insertions(+), 14 deletions(-) create mode 100644 hls4ml/model/optimizer/passes/relu_merge.py diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index 9560bfcd40..cc4975ea2f 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -199,7 +199,7 @@ def __init__(self, shape, dim_names, proxy, **kwargs): self.shape = shape self.dim_names = dim_names self.type = proxy.type - self.cppname = proxy.name + self.name = proxy.name self.size = proxy.size def get_shape(self): @@ -410,6 +410,10 @@ def get_output_variable(self, output_name=None): else: return next(iter(self.variables.values())) + def set_output_variable(self, output_name, output_value): + self.variables[output_name] = output_value + + def get_weights(self, var_name=None): if var_name: return self.weights[var_name] @@ -450,8 +454,6 @@ def make_array_variable(self, shape, dim_names, var_name='layer{index}_out', typ def make_stream_variable(self, shape, dim_names, var_name='layer{index}_out', type_name='layer{index}_t', precision=None, depth=0): pack_factor = self.model.config.get_layer_config_value(self, 'PackFactor', default=1) - if depth == 0: - depth = self.model.config.get_layer_config_value(self, 'StreamDepth', default=0) return StreamVariable(shape, dim_names, var_name=var_name, type_name=type_name, precision=precision, n_pack=pack_factor, depth=depth, index=self.index) @@ -522,8 +524,8 @@ def _default_function_params(self): params['config'] = 'config{}'.format(self.index) params['input_t'] = self.get_input_variable().type.name params['output_t'] = self.get_output_variable().type.name - params['input'] = self.get_input_variable().cppname - params['output'] = self.get_output_variable().cppname + params['input'] = self.get_input_variable().name + params['output'] = self.get_output_variable().name return params @@ -591,7 +593,6 @@ def initialize(self): out_name = self.outputs[0] proxy = self.get_input_variable() out = InplaceVariable(shape, dims, proxy, index=self.get_input_node().index) - self.variables[out_name] = out self.model.register_output_variable(out_name, out) @@ -648,7 +649,8 @@ def config_cpp(self): params['nonzeros'] = self.get_weights('weight').nonzeros params['product_type'] = self.model.config.backend.product_type(self.get_input_variable().type.precision, self.get_weights('weight').type.precision) params['strategy'] = self.get_attr('strategy') - + params['merged_relu'] = "false" + params['out_t'] = self.get_output_variable().type.name return self._config_template.format(**params) class Conv1D(Layer): @@ -856,7 +858,11 @@ def initialize(self): else: shape = [self.attributes['n_filt'], self.attributes['out_height'], self.attributes['out_width']] dims = ['N_FILT_{}'.format(self.index), 'OUT_HEIGHT_{}'.format(self.index), 'OUT_WIDTH_{}'.format(self.index)] + # self.index = self.index + 2 + # if(not bool(self.model.config.get_merged_relu())): + self.attributes['intermediate_index'] = self.index self.add_output_variable(shape, dims) + self.intermediate_op = self.get_output_variable() self.add_weights(quantizer=self.get_attr('weight_quantizer')) self.add_bias(quantizer=self.get_attr('bias_quantizer')) if len(self.weights['weight'].data.shape) == 2: # This can happen if we assign weights of Dense layer to 1x1 Conv2D @@ -923,6 +929,8 @@ def config_cpp(self): mult_params['n_in'] = self.get_attr('n_chan') * self.get_attr('filt_height') * self.get_attr('filt_width') mult_params['n_out'] = self.get_attr('n_filt') mult_params['product_type'] = self.model.config.backend.product_type(self.get_input_variable().type.precision, self.get_weights('weight').type.precision) + mult_params['merged_relu'] = str(bool(self.model.config.get_merged_relu())).lower() + mult_params['out_t'] = self.intermediate_op.type.name mult_config = self._config_template[1].format(**mult_params) return mult_config + '\n' + conv_config diff --git a/hls4ml/model/hls_model.py b/hls4ml/model/hls_model.py index 0f9c11ae3a..71db7bc5ad 100644 --- a/hls4ml/model/hls_model.py +++ b/hls4ml/model/hls_model.py @@ -1,4 +1,5 @@ from __future__ import print_function +from email.policy import default import six import os import sys @@ -59,6 +60,18 @@ def get_project_name(self): def get_output_dir(self): return self.get_config_value('OutputDir') + def get_merged_relu(self, default=None): + hls_config = self.config['HLSConfig'] + + model_config = hls_config.get('Model', None) + key = 'MergedRelu' + + if model_config is not None: + tempbool = model_config.get(key, default) + return tempbool + + return default + def get_layer_config_value(self, layer, key, default=None): hls_config = self.config['HLSConfig'] diff --git a/hls4ml/model/optimizer/__init__.py b/hls4ml/model/optimizer/__init__.py index 19915b553e..dc312e4121 100644 --- a/hls4ml/model/optimizer/__init__.py +++ b/hls4ml/model/optimizer/__init__.py @@ -12,6 +12,7 @@ from hls4ml.model.optimizer.passes.conv_same_pad import InsertZeroPaddingBeforeConv2D from hls4ml.model.optimizer.passes.pointwise import OptimizePointwiseConv from hls4ml.model.optimizer.passes.clone import CloneOutput +from hls4ml.model.optimizer.passes.relu_merge import MergeRelu from hls4ml.model.optimizer.passes.repack_stream import ReshapeStream, BroadcastStream, RemoveFinalReshape from hls4ml.model.optimizer.passes.transpose_opt import RemoveUselessTranspose from hls4ml.model.optimizer.passes.multi_dense import ReplaceMultidimensionalDenseWithConv @@ -40,6 +41,7 @@ register_pass('conv2d_same_pad', InsertZeroPaddingBeforeConv2D) register_pass('optimize_pointwise_conv', OptimizePointwiseConv) register_pass('clone_output', CloneOutput) +register_pass('relu_merge', MergeRelu) register_pass('remove_final_reshape', RemoveFinalReshape) register_pass('reshape_stream', ReshapeStream) register_pass('remove_useless_transpose', RemoveUselessTranspose) diff --git a/hls4ml/model/optimizer/passes/relu_merge.py b/hls4ml/model/optimizer/passes/relu_merge.py new file mode 100644 index 0000000000..2157ff6db3 --- /dev/null +++ b/hls4ml/model/optimizer/passes/relu_merge.py @@ -0,0 +1,29 @@ +from hls4ml.model.optimizer import OptimizerPass + +class MergeRelu(OptimizerPass): + def match(self, node): + supported_layers = ['Conv2D', 'Conv2DBatchnorm', 'Dense'] + is_match = node.get_input_node().__class__.__name__ in supported_layers + + #hls4ml names ReLU activations 'Activation' + is_match = is_match and (node.__class__.__name__ == 'Activation') + return is_match + + def transform(self, model, node): + #Merge ReLU and Convolution layer if needed + previous_node = node.get_input_node() + previous_node.index = node.index + if previous_node.get_attr('data_format') == 'channels_last': + shape = [previous_node.attributes['out_height'], previous_node.attributes['out_width'], previous_node.attributes['n_filt']] + dims = ['OUT_HEIGHT_{}'.format(previous_node.index), 'OUT_WIDTH_{}'.format(previous_node.index), 'N_FILT_{}'.format(previous_node.index)] + else: + shape = [previous_node.attributes['n_filt'], previous_node.attributes['out_height'], previous_node.attributes['out_width']] + dims = ['N_FILT_{}'.format(previous_node.index), 'OUT_HEIGHT_{}'.format(previous_node.index), 'OUT_WIDTH_{}'.format(previous_node.index)] + activation_precision, _ = model.config.get_precision(node, var='result') + previous_node.add_output_variable(shape, dims, precision=activation_precision) + if not node.get_output_nodes(): + print("WARNING: {} is the output layer! No rewiring performed.".format(node.name)) + model.remove_node(node, rewire=False) + else: + model.remove_node(node, rewire=True) + return True \ No newline at end of file diff --git a/hls4ml/templates/vivado/firmware/parameters.h b/hls4ml/templates/vivado/firmware/parameters.h index bb64135352..127a7b6672 100644 --- a/hls4ml/templates/vivado/firmware/parameters.h +++ b/hls4ml/templates/vivado/firmware/parameters.h @@ -3,6 +3,7 @@ #include "ap_int.h" #include "ap_fixed.h" +#include "defines.h" #include "nnet_utils/nnet_helpers.h" //hls-fpga-machine-learning insert includes diff --git a/hls4ml/templates/vivado/nnet_utils/nnet_dense_resource.h b/hls4ml/templates/vivado/nnet_utils/nnet_dense_resource.h index 756a627434..2388f048c0 100644 --- a/hls4ml/templates/vivado/nnet_utils/nnet_dense_resource.h +++ b/hls4ml/templates/vivado/nnet_utils/nnet_dense_resource.h @@ -261,6 +261,247 @@ void dense_resource_rf_gt_nin( } } +// Dense (with ReLU) +template +void dense_relu_resource_rf_leq_nin( + data_T data[CONFIG_T::n_in], + res_T res[CONFIG_T::n_out], + typename CONFIG_T::weight_t weights[CONFIG_T::n_in*CONFIG_T::n_out], + typename CONFIG_T::bias_t biases[CONFIG_T::n_out]) { + + const int rufactor = CONFIG_T::reuse_factor; + const int multfactor = MIN(CONFIG_T::n_in,CONFIG_T::reuse_factor); + const int multiplier_limit = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, multfactor); + const int block_factor = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, CONFIG_T::reuse_factor); + const int multscale = multiplier_limit/CONFIG_T::n_out; + const int nin = CONFIG_T::n_in; + const int nout = CONFIG_T::n_out; + + assert((multiplier_limit % nout == 0 || rufactor >= nin) && "The current Reuse Factor is not allowed"); + assert((multiplier_limit == block_factor) && "This function is correct only for RF <= N_IN"); + + #pragma HLS function_instantiate variable=weights,biases + //#pragma HLS RESOURCE variable=weights core=RAM_2P_BRAM Commenting out the deisgnation HLS seems to choose correctly + #pragma HLS ARRAY_RESHAPE variable=weights block factor=block_factor + #pragma HLS ARRAY_PARTITION variable=biases complete + + typename CONFIG_T::accum_t acc[CONFIG_T::n_out]; + #pragma HLS ARRAY_PARTITION variable=acc complete + + InitAccum: + for (int iacc = 0; iacc < nout; iacc++) { + #pragma HLS UNROLL + acc[iacc] = (typename CONFIG_T::accum_t) biases[iacc]; + } + + ReuseLoop: + for (int ir = 0; ir < rufactor; ir++) { + #pragma HLS PIPELINE II=1 rewind + + int w_index = ir; + int in_index = ir; + int out_index = 0; + int acc_step = 0; + + MultLoop: + for (int im = 0; im < block_factor; im++) { + #pragma HLS UNROLL + + acc[out_index] += CONFIG_T::template product::product(data[in_index], weights[w_index]); + + // Increment w_index + w_index += rufactor; + // Increment in_index + in_index += rufactor; + if (in_index >= nin) { + in_index = ir; + } + // Increment out_index + if (acc_step + 1 >= multscale) { + acc_step = 0; + out_index++; + } else { + acc_step++; + } + } + } + + // Cast to "res_t" type + Result: + for (int ires = 0; ires < CONFIG_T::n_out; ires++) { + #pragma HLS UNROLL + typename CONFIG_T::out_t act = cast(acc[ires]); + if (act > 0) res[ires] = act; + else res[ires] = 0; + } +} + +template +void dense_relu_resource_rf_gt_nin_rem0( + data_T data[CONFIG_T::n_in], + res_T res[CONFIG_T::n_out], + typename CONFIG_T::weight_t weights[CONFIG_T::n_in*CONFIG_T::n_out], + typename CONFIG_T::bias_t biases[CONFIG_T::n_out]) { + + const int rufactor = MIN(CONFIG_T::reuse_factor, CONFIG_T::n_in * CONFIG_T::n_out); + const int multfactor = MIN(CONFIG_T::n_in,CONFIG_T::reuse_factor); + const int multiplier_limit = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, multfactor); + const int block_factor = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, CONFIG_T::reuse_factor); + const int multscale = multiplier_limit/CONFIG_T::n_out; + const int nin = CONFIG_T::n_in; + const int nout = CONFIG_T::n_out; + + assert((multiplier_limit % nout == 0 || rufactor >= nin) && "The current Reuse Factor is not allowed"); + assert((rufactor > nin && rufactor % nin == 0) && "This function is correct only for RF > N_IN && RF % N_IN == 0"); + + #pragma HLS function_instantiate variable=weights,biases + //#pragma HLS RESOURCE variable=weights core=RAM_2P_BRAM Commenting out the deisgnation HLS seems to choose correctly + #pragma HLS ARRAY_RESHAPE variable=weights block factor=block_factor + #pragma HLS ARRAY_PARTITION variable=biases complete + + typename CONFIG_T::accum_t acc[CONFIG_T::n_out]; + #pragma HLS ARRAY_PARTITION variable=acc complete + + InitAccum: + for (int iacc = 0; iacc < nout; iacc++) { + #pragma HLS UNROLL + acc[iacc] = (typename CONFIG_T::accum_t) biases[iacc]; + } + + int w_index; + int in_index = 0; + int out_index; + int outstep = 0; + const int outscale = rufactor / nin; + + int outidx[rufactor]; + IndexLoop: + for (int ir = 0; ir < rufactor; ir++) { + outidx[ir] = outstep; + if ((ir + 1) % nin == 0) { + outstep++; + } + } + + ReuseLoop: + for (int ir = 0; ir < rufactor; ir++) { + #pragma HLS PIPELINE II=1 rewind + + w_index = ir; + out_index = outidx[ir]/*outstep*/; + + MultLoop: + for (int im = 0; im < block_factor; im++) { + #pragma HLS UNROLL + acc[out_index] += CONFIG_T::template product::product(data[in_index], weights[w_index]); + + w_index += rufactor; + if (w_index >= CONFIG_T::n_in * CONFIG_T::n_out) break; // check out of bounds + out_index += outscale; + } + + in_index++; + if (in_index >= nin) { + in_index = 0; + //outstep++; // This causes a huge increase in scheduling and RTL generation times, hence the above workaround. + } + } + + // Cast to "res_t" type + Result: + for (int ires = 0; ires < CONFIG_T::n_out; ires++) { + #pragma HLS UNROLL + typename CONFIG_T::out_t act = cast(acc[ires]); + if (act > 0) res[ires] = act; + else res[ires] = 0; + } +} + +template +void dense_relu_resource_rf_gt_nin( + data_T data[CONFIG_T::n_in], + res_T res[CONFIG_T::n_out], + typename CONFIG_T::weight_t weights[CONFIG_T::n_in*CONFIG_T::n_out], + typename CONFIG_T::bias_t biases[CONFIG_T::n_out]) { + + const int rufactor = CONFIG_T::reuse_factor; + const int multfactor = MIN(CONFIG_T::n_in,CONFIG_T::reuse_factor); + const int multiplier_limit = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, multfactor); + const int block_factor = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, CONFIG_T::reuse_factor); + const int multscale = multiplier_limit/CONFIG_T::n_out; + const int nin = CONFIG_T::n_in; + const int nout = CONFIG_T::n_out; + + assert((multiplier_limit % nout == 0 || rufactor >= nin) && "The current Reuse Factor is not allowed"); + assert((rufactor > nin) && "This function is correct only for RF > N_IN"); + + #pragma HLS function_instantiate variable=weights,biases + //#pragma HLS RESOURCE variable=weights core=RAM_2P_BRAM Commenting out the deisgnation HLS seems to choose correctly + #pragma HLS ARRAY_RESHAPE variable=weights block factor=block_factor + #pragma HLS ARRAY_PARTITION variable=biases complete + + typename CONFIG_T::accum_t acc[CONFIG_T::n_out]; + #pragma HLS ARRAY_PARTITION variable=acc complete + + InitAccum: + for (int iacc = 0; iacc < nout; iacc++) { + #pragma HLS UNROLL + acc[iacc] = (typename CONFIG_T::accum_t) biases[iacc]; + } + + ReuseLoop: + for (int ir = 0; ir < rufactor; ir++) { + #pragma HLS PIPELINE II=1 rewind + typename CONFIG_T::accum_t tmpmult[block_factor]; + #pragma HLS ARRAY_PARTITION variable=tmpmult complete + + MultLoop: + for (int im = 0; im < block_factor; im++) { + #pragma HLS UNROLL + int w_index = ir + rufactor * im; + int in_index = w_index % nin; + if (w_index >= CONFIG_T::n_in*CONFIG_T::n_out) continue; // check out of bounds + tmpmult[im] = CONFIG_T::template product::product(data[in_index], weights[w_index]); + } + + typename CONFIG_T::accum_t mult[multiplier_limit]; + #pragma HLS ARRAY_PARTITION variable=mult complete + + ResetMult: + for (int imult = 0; imult < multiplier_limit; imult++) { + #pragma HLS UNROLL + mult[imult] = 0; + } + + AccumLoop1: + for (int im = 0; im < block_factor; im++) { + #pragma HLS UNROLL + int w_index = ir + rufactor * im; + int out_index = w_index / multfactor; + if (out_index >= multiplier_limit) continue; // check out of bounds + mult[out_index] += tmpmult[im]; + } + + AccumLoop2: + for (int im = 0; im < multiplier_limit; im++) { + #pragma HLS UNROLL + //int out_index = im/multscale; // This is the general case + //acc[out_index] += mult[im]; + acc[im] += mult[im]; // If RF > N_IN then multiplier_limit == n_out + } + } + + // Cast to "res_t" type + Result: + for (int ires = 0; ires < CONFIG_T::n_out; ires++) { + #pragma HLS UNROLL + typename CONFIG_T::out_t act = cast(acc[ires]); + if (act > 0) res[ires] = act; + else res[ires] = 0; + } +} + + template void dense_resource( data_T data[CONFIG_T::n_in], @@ -270,13 +511,23 @@ void dense_resource( #pragma HLS INLINE region - if (CONFIG_T::reuse_factor <= CONFIG_T::n_in) { - dense_resource_rf_leq_nin(data, res, weights, biases); - } else if (CONFIG_T::reuse_factor % CONFIG_T::n_in == 0) { - dense_resource_rf_gt_nin_rem0(data, res, weights, biases); - } else { - dense_resource_rf_gt_nin(data, res, weights, biases); - } + if (CONFIG_T::merged_relu) { + if (CONFIG_T::reuse_factor <= CONFIG_T::n_in) { + dense_relu_resource_rf_leq_nin(data, res, weights, biases); + } else if (CONFIG_T::reuse_factor % CONFIG_T::n_in == 0) { + dense_relu_resource_rf_gt_nin_rem0(data, res, weights, biases); + } else { + dense_relu_resource_rf_gt_nin(data, res, weights, biases); + } + } else { + if (CONFIG_T::reuse_factor <= CONFIG_T::n_in) { + dense_resource_rf_leq_nin(data, res, weights, biases); + } else if (CONFIG_T::reuse_factor % CONFIG_T::n_in == 0) { + dense_resource_rf_gt_nin_rem0(data, res, weights, biases); + } else { + dense_resource_rf_gt_nin(data, res, weights, biases); + } + } } } diff --git a/hls4ml/templates/vivado_template.py b/hls4ml/templates/vivado_template.py index 149b52f1d5..99be3f0dc7 100644 --- a/hls4ml/templates/vivado_template.py +++ b/hls4ml/templates/vivado_template.py @@ -14,11 +14,13 @@ static const unsigned reuse_factor = {reuse}; static const unsigned n_zeros = {nzeros}; static const unsigned n_nonzeros = {nonzeros}; + static const bool merged_relu = {merged_relu}; static const bool store_weights_in_bram = false; typedef {accum_t} accum_t; typedef {bias_t} bias_t; typedef {weight_t} weight_t; typedef {index_t} index_t; + typedef {out_t}:: value_type out_t; template using product = nnet::product::{product_type}; }};\n""" @@ -65,9 +67,11 @@ static const unsigned n_out = {n_out}; static const unsigned reuse_factor = {reuse}; static const unsigned strategy = nnet::{strategy}; + static const bool merged_relu = {merged_relu}; typedef {accum_t} accum_t; typedef {bias_t} bias_t; typedef {weight_t} weight_t; + typedef {out_t}:: value_type out_t; template using product = nnet::product::{product_type}; }};\n""" From c499f470229461a21d2db52286713ad8bd29c143 Mon Sep 17 00:00:00 2001 From: Olivia Weng Date: Tue, 18 Jan 2022 15:24:20 -0800 Subject: [PATCH 063/102] clean up code and currently testing if checking the merged relu flag in the dense_resource() functions has worse resource reductions than the previous code duplication version --- hls4ml/model/hls_model.py | 1 - hls4ml/templates/vivado/firmware/parameters.h | 1 - .../vivado/nnet_utils/nnet_dense_resource.h | 565 ++++++++++-------- 3 files changed, 302 insertions(+), 265 deletions(-) diff --git a/hls4ml/model/hls_model.py b/hls4ml/model/hls_model.py index 71db7bc5ad..aeec6158ea 100644 --- a/hls4ml/model/hls_model.py +++ b/hls4ml/model/hls_model.py @@ -1,5 +1,4 @@ from __future__ import print_function -from email.policy import default import six import os import sys diff --git a/hls4ml/templates/vivado/firmware/parameters.h b/hls4ml/templates/vivado/firmware/parameters.h index 127a7b6672..bb64135352 100644 --- a/hls4ml/templates/vivado/firmware/parameters.h +++ b/hls4ml/templates/vivado/firmware/parameters.h @@ -3,7 +3,6 @@ #include "ap_int.h" #include "ap_fixed.h" -#include "defines.h" #include "nnet_utils/nnet_helpers.h" //hls-fpga-machine-learning insert includes diff --git a/hls4ml/templates/vivado/nnet_utils/nnet_dense_resource.h b/hls4ml/templates/vivado/nnet_utils/nnet_dense_resource.h index 2388f048c0..d245754234 100644 --- a/hls4ml/templates/vivado/nnet_utils/nnet_dense_resource.h +++ b/hls4ml/templates/vivado/nnet_utils/nnet_dense_resource.h @@ -93,10 +93,20 @@ void dense_resource_rf_leq_nin( } // Cast to "res_t" type - Result: - for (int ires = 0; ires < CONFIG_T::n_out; ires++) { - #pragma HLS UNROLL - res[ires] = cast(acc[ires]); + if (CONFIG_T::merged_relu) { + MergedReLU_Result: + for (int ires = 0; ires < CONFIG_T::n_out; ires++) { + #pragma HLS UNROLL + typename CONFIG_T::out_t act = cast(acc[ires]); + if (act > 0) res[ires] = act; + else res[ires] = 0; + } + } else { + Result: + for (int ires = 0; ires < CONFIG_T::n_out; ires++) { + #pragma HLS UNROLL + res[ires] = cast(acc[ires]); + } } } @@ -172,10 +182,20 @@ void dense_resource_rf_gt_nin_rem0( } // Cast to "res_t" type - Result: - for (int ires = 0; ires < CONFIG_T::n_out; ires++) { - #pragma HLS UNROLL - res[ires] = cast(acc[ires]); + if (CONFIG_T::merged_relu) { + MergedReLU_Result: + for (int ires = 0; ires < CONFIG_T::n_out; ires++) { + #pragma HLS UNROLL + typename CONFIG_T::out_t act = cast(acc[ires]); + if (act > 0) res[ires] = act; + else res[ires] = 0; + } + } else { + Result: + for (int ires = 0; ires < CONFIG_T::n_out; ires++) { + #pragma HLS UNROLL + res[ires] = cast(acc[ires]); + } } } @@ -254,251 +274,262 @@ void dense_resource_rf_gt_nin( } // Cast to "res_t" type - Result: - for (int ires = 0; ires < CONFIG_T::n_out; ires++) { - #pragma HLS UNROLL - res[ires] = cast(acc[ires]); - } -} - -// Dense (with ReLU) -template -void dense_relu_resource_rf_leq_nin( - data_T data[CONFIG_T::n_in], - res_T res[CONFIG_T::n_out], - typename CONFIG_T::weight_t weights[CONFIG_T::n_in*CONFIG_T::n_out], - typename CONFIG_T::bias_t biases[CONFIG_T::n_out]) { - - const int rufactor = CONFIG_T::reuse_factor; - const int multfactor = MIN(CONFIG_T::n_in,CONFIG_T::reuse_factor); - const int multiplier_limit = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, multfactor); - const int block_factor = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, CONFIG_T::reuse_factor); - const int multscale = multiplier_limit/CONFIG_T::n_out; - const int nin = CONFIG_T::n_in; - const int nout = CONFIG_T::n_out; - - assert((multiplier_limit % nout == 0 || rufactor >= nin) && "The current Reuse Factor is not allowed"); - assert((multiplier_limit == block_factor) && "This function is correct only for RF <= N_IN"); - - #pragma HLS function_instantiate variable=weights,biases - //#pragma HLS RESOURCE variable=weights core=RAM_2P_BRAM Commenting out the deisgnation HLS seems to choose correctly - #pragma HLS ARRAY_RESHAPE variable=weights block factor=block_factor - #pragma HLS ARRAY_PARTITION variable=biases complete - - typename CONFIG_T::accum_t acc[CONFIG_T::n_out]; - #pragma HLS ARRAY_PARTITION variable=acc complete - - InitAccum: - for (int iacc = 0; iacc < nout; iacc++) { - #pragma HLS UNROLL - acc[iacc] = (typename CONFIG_T::accum_t) biases[iacc]; - } - - ReuseLoop: - for (int ir = 0; ir < rufactor; ir++) { - #pragma HLS PIPELINE II=1 rewind - - int w_index = ir; - int in_index = ir; - int out_index = 0; - int acc_step = 0; - - MultLoop: - for (int im = 0; im < block_factor; im++) { + if (CONFIG_T::merged_relu) { + MergedReLU_Result: + for (int ires = 0; ires < CONFIG_T::n_out; ires++) { #pragma HLS UNROLL - - acc[out_index] += CONFIG_T::template product::product(data[in_index], weights[w_index]); - - // Increment w_index - w_index += rufactor; - // Increment in_index - in_index += rufactor; - if (in_index >= nin) { - in_index = ir; - } - // Increment out_index - if (acc_step + 1 >= multscale) { - acc_step = 0; - out_index++; - } else { - acc_step++; - } - } - } - - // Cast to "res_t" type - Result: - for (int ires = 0; ires < CONFIG_T::n_out; ires++) { - #pragma HLS UNROLL - typename CONFIG_T::out_t act = cast(acc[ires]); - if (act > 0) res[ires] = act; - else res[ires] = 0; - } -} - -template -void dense_relu_resource_rf_gt_nin_rem0( - data_T data[CONFIG_T::n_in], - res_T res[CONFIG_T::n_out], - typename CONFIG_T::weight_t weights[CONFIG_T::n_in*CONFIG_T::n_out], - typename CONFIG_T::bias_t biases[CONFIG_T::n_out]) { - - const int rufactor = MIN(CONFIG_T::reuse_factor, CONFIG_T::n_in * CONFIG_T::n_out); - const int multfactor = MIN(CONFIG_T::n_in,CONFIG_T::reuse_factor); - const int multiplier_limit = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, multfactor); - const int block_factor = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, CONFIG_T::reuse_factor); - const int multscale = multiplier_limit/CONFIG_T::n_out; - const int nin = CONFIG_T::n_in; - const int nout = CONFIG_T::n_out; - - assert((multiplier_limit % nout == 0 || rufactor >= nin) && "The current Reuse Factor is not allowed"); - assert((rufactor > nin && rufactor % nin == 0) && "This function is correct only for RF > N_IN && RF % N_IN == 0"); - - #pragma HLS function_instantiate variable=weights,biases - //#pragma HLS RESOURCE variable=weights core=RAM_2P_BRAM Commenting out the deisgnation HLS seems to choose correctly - #pragma HLS ARRAY_RESHAPE variable=weights block factor=block_factor - #pragma HLS ARRAY_PARTITION variable=biases complete - - typename CONFIG_T::accum_t acc[CONFIG_T::n_out]; - #pragma HLS ARRAY_PARTITION variable=acc complete - - InitAccum: - for (int iacc = 0; iacc < nout; iacc++) { - #pragma HLS UNROLL - acc[iacc] = (typename CONFIG_T::accum_t) biases[iacc]; - } - - int w_index; - int in_index = 0; - int out_index; - int outstep = 0; - const int outscale = rufactor / nin; - - int outidx[rufactor]; - IndexLoop: - for (int ir = 0; ir < rufactor; ir++) { - outidx[ir] = outstep; - if ((ir + 1) % nin == 0) { - outstep++; + typename CONFIG_T::out_t act = cast(acc[ires]); + if (act > 0) res[ires] = act; + else res[ires] = 0; } - } - - ReuseLoop: - for (int ir = 0; ir < rufactor; ir++) { - #pragma HLS PIPELINE II=1 rewind - - w_index = ir; - out_index = outidx[ir]/*outstep*/; - - MultLoop: - for (int im = 0; im < block_factor; im++) { + } else { + Result: + for (int ires = 0; ires < CONFIG_T::n_out; ires++) { #pragma HLS UNROLL - acc[out_index] += CONFIG_T::template product::product(data[in_index], weights[w_index]); - - w_index += rufactor; - if (w_index >= CONFIG_T::n_in * CONFIG_T::n_out) break; // check out of bounds - out_index += outscale; + res[ires] = cast(acc[ires]); } - - in_index++; - if (in_index >= nin) { - in_index = 0; - //outstep++; // This causes a huge increase in scheduling and RTL generation times, hence the above workaround. - } - } - - // Cast to "res_t" type - Result: - for (int ires = 0; ires < CONFIG_T::n_out; ires++) { - #pragma HLS UNROLL - typename CONFIG_T::out_t act = cast(acc[ires]); - if (act > 0) res[ires] = act; - else res[ires] = 0; } + } -template -void dense_relu_resource_rf_gt_nin( - data_T data[CONFIG_T::n_in], - res_T res[CONFIG_T::n_out], - typename CONFIG_T::weight_t weights[CONFIG_T::n_in*CONFIG_T::n_out], - typename CONFIG_T::bias_t biases[CONFIG_T::n_out]) { - - const int rufactor = CONFIG_T::reuse_factor; - const int multfactor = MIN(CONFIG_T::n_in,CONFIG_T::reuse_factor); - const int multiplier_limit = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, multfactor); - const int block_factor = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, CONFIG_T::reuse_factor); - const int multscale = multiplier_limit/CONFIG_T::n_out; - const int nin = CONFIG_T::n_in; - const int nout = CONFIG_T::n_out; - - assert((multiplier_limit % nout == 0 || rufactor >= nin) && "The current Reuse Factor is not allowed"); - assert((rufactor > nin) && "This function is correct only for RF > N_IN"); - - #pragma HLS function_instantiate variable=weights,biases - //#pragma HLS RESOURCE variable=weights core=RAM_2P_BRAM Commenting out the deisgnation HLS seems to choose correctly - #pragma HLS ARRAY_RESHAPE variable=weights block factor=block_factor - #pragma HLS ARRAY_PARTITION variable=biases complete - - typename CONFIG_T::accum_t acc[CONFIG_T::n_out]; - #pragma HLS ARRAY_PARTITION variable=acc complete - - InitAccum: - for (int iacc = 0; iacc < nout; iacc++) { - #pragma HLS UNROLL - acc[iacc] = (typename CONFIG_T::accum_t) biases[iacc]; - } - - ReuseLoop: - for (int ir = 0; ir < rufactor; ir++) { - #pragma HLS PIPELINE II=1 rewind - typename CONFIG_T::accum_t tmpmult[block_factor]; - #pragma HLS ARRAY_PARTITION variable=tmpmult complete - - MultLoop: - for (int im = 0; im < block_factor; im++) { - #pragma HLS UNROLL - int w_index = ir + rufactor * im; - int in_index = w_index % nin; - if (w_index >= CONFIG_T::n_in*CONFIG_T::n_out) continue; // check out of bounds - tmpmult[im] = CONFIG_T::template product::product(data[in_index], weights[w_index]); - } - - typename CONFIG_T::accum_t mult[multiplier_limit]; - #pragma HLS ARRAY_PARTITION variable=mult complete - - ResetMult: - for (int imult = 0; imult < multiplier_limit; imult++) { - #pragma HLS UNROLL - mult[imult] = 0; - } - - AccumLoop1: - for (int im = 0; im < block_factor; im++) { - #pragma HLS UNROLL - int w_index = ir + rufactor * im; - int out_index = w_index / multfactor; - if (out_index >= multiplier_limit) continue; // check out of bounds - mult[out_index] += tmpmult[im]; - } - - AccumLoop2: - for (int im = 0; im < multiplier_limit; im++) { - #pragma HLS UNROLL - //int out_index = im/multscale; // This is the general case - //acc[out_index] += mult[im]; - acc[im] += mult[im]; // If RF > N_IN then multiplier_limit == n_out - } - } - - // Cast to "res_t" type - Result: - for (int ires = 0; ires < CONFIG_T::n_out; ires++) { - #pragma HLS UNROLL - typename CONFIG_T::out_t act = cast(acc[ires]); - if (act > 0) res[ires] = act; - else res[ires] = 0; - } +// Dense (with ReLU) +// template +// void dense_relu_resource_rf_leq_nin( +// data_T data[CONFIG_T::n_in], +// res_T res[CONFIG_T::n_out], +// typename CONFIG_T::weight_t weights[CONFIG_T::n_in*CONFIG_T::n_out], +// typename CONFIG_T::bias_t biases[CONFIG_T::n_out]) { + +// const int rufactor = CONFIG_T::reuse_factor; +// const int multfactor = MIN(CONFIG_T::n_in,CONFIG_T::reuse_factor); +// const int multiplier_limit = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, multfactor); +// const int block_factor = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, CONFIG_T::reuse_factor); +// const int multscale = multiplier_limit/CONFIG_T::n_out; +// const int nin = CONFIG_T::n_in; +// const int nout = CONFIG_T::n_out; + +// assert((multiplier_limit % nout == 0 || rufactor >= nin) && "The current Reuse Factor is not allowed"); +// assert((multiplier_limit == block_factor) && "This function is correct only for RF <= N_IN"); + +// #pragma HLS function_instantiate variable=weights,biases +// //#pragma HLS RESOURCE variable=weights core=RAM_2P_BRAM Commenting out the deisgnation HLS seems to choose correctly +// #pragma HLS ARRAY_RESHAPE variable=weights block factor=block_factor +// #pragma HLS ARRAY_PARTITION variable=biases complete + +// typename CONFIG_T::accum_t acc[CONFIG_T::n_out]; +// #pragma HLS ARRAY_PARTITION variable=acc complete + +// InitAccum: +// for (int iacc = 0; iacc < nout; iacc++) { +// #pragma HLS UNROLL +// acc[iacc] = (typename CONFIG_T::accum_t) biases[iacc]; +// } + +// ReuseLoop: +// for (int ir = 0; ir < rufactor; ir++) { +// #pragma HLS PIPELINE II=1 rewind + +// int w_index = ir; +// int in_index = ir; +// int out_index = 0; +// int acc_step = 0; + +// MultLoop: +// for (int im = 0; im < block_factor; im++) { +// #pragma HLS UNROLL + +// acc[out_index] += CONFIG_T::template product::product(data[in_index], weights[w_index]); + +// // Increment w_index +// w_index += rufactor; +// // Increment in_index +// in_index += rufactor; +// if (in_index >= nin) { +// in_index = ir; +// } +// // Increment out_index +// if (acc_step + 1 >= multscale) { +// acc_step = 0; +// out_index++; +// } else { +// acc_step++; +// } +// } +// } + +// // Cast to "res_t" type +// Result: +// for (int ires = 0; ires < CONFIG_T::n_out; ires++) { +// #pragma HLS UNROLL +// typename CONFIG_T::out_t act = cast(acc[ires]); +// if (act > 0) res[ires] = act; +// else res[ires] = 0; +// } +// } + +// template +// void dense_relu_resource_rf_gt_nin_rem0( +// data_T data[CONFIG_T::n_in], +// res_T res[CONFIG_T::n_out], +// typename CONFIG_T::weight_t weights[CONFIG_T::n_in*CONFIG_T::n_out], +// typename CONFIG_T::bias_t biases[CONFIG_T::n_out]) { + +// const int rufactor = MIN(CONFIG_T::reuse_factor, CONFIG_T::n_in * CONFIG_T::n_out); +// const int multfactor = MIN(CONFIG_T::n_in,CONFIG_T::reuse_factor); +// const int multiplier_limit = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, multfactor); +// const int block_factor = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, CONFIG_T::reuse_factor); +// const int multscale = multiplier_limit/CONFIG_T::n_out; +// const int nin = CONFIG_T::n_in; +// const int nout = CONFIG_T::n_out; + +// assert((multiplier_limit % nout == 0 || rufactor >= nin) && "The current Reuse Factor is not allowed"); +// assert((rufactor > nin && rufactor % nin == 0) && "This function is correct only for RF > N_IN && RF % N_IN == 0"); + +// #pragma HLS function_instantiate variable=weights,biases +// //#pragma HLS RESOURCE variable=weights core=RAM_2P_BRAM Commenting out the deisgnation HLS seems to choose correctly +// #pragma HLS ARRAY_RESHAPE variable=weights block factor=block_factor +// #pragma HLS ARRAY_PARTITION variable=biases complete + +// typename CONFIG_T::accum_t acc[CONFIG_T::n_out]; +// #pragma HLS ARRAY_PARTITION variable=acc complete + +// InitAccum: +// for (int iacc = 0; iacc < nout; iacc++) { +// #pragma HLS UNROLL +// acc[iacc] = (typename CONFIG_T::accum_t) biases[iacc]; +// } + +// int w_index; +// int in_index = 0; +// int out_index; +// int outstep = 0; +// const int outscale = rufactor / nin; + +// int outidx[rufactor]; +// IndexLoop: +// for (int ir = 0; ir < rufactor; ir++) { +// outidx[ir] = outstep; +// if ((ir + 1) % nin == 0) { +// outstep++; +// } +// } + +// ReuseLoop: +// for (int ir = 0; ir < rufactor; ir++) { +// #pragma HLS PIPELINE II=1 rewind + +// w_index = ir; +// out_index = outidx[ir]/*outstep*/; + +// MultLoop: +// for (int im = 0; im < block_factor; im++) { +// #pragma HLS UNROLL +// acc[out_index] += CONFIG_T::template product::product(data[in_index], weights[w_index]); + +// w_index += rufactor; +// if (w_index >= CONFIG_T::n_in * CONFIG_T::n_out) break; // check out of bounds +// out_index += outscale; +// } + +// in_index++; +// if (in_index >= nin) { +// in_index = 0; +// //outstep++; // This causes a huge increase in scheduling and RTL generation times, hence the above workaround. +// } +// } + +// // Cast to "res_t" type +// Result: +// for (int ires = 0; ires < CONFIG_T::n_out; ires++) { +// #pragma HLS UNROLL +// typename CONFIG_T::out_t act = cast(acc[ires]); +// if (act > 0) res[ires] = act; +// else res[ires] = 0; +// } +// } + +// template +// void dense_relu_resource_rf_gt_nin( +// data_T data[CONFIG_T::n_in], +// res_T res[CONFIG_T::n_out], +// typename CONFIG_T::weight_t weights[CONFIG_T::n_in*CONFIG_T::n_out], +// typename CONFIG_T::bias_t biases[CONFIG_T::n_out]) { + +// const int rufactor = CONFIG_T::reuse_factor; +// const int multfactor = MIN(CONFIG_T::n_in,CONFIG_T::reuse_factor); +// const int multiplier_limit = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, multfactor); +// const int block_factor = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, CONFIG_T::reuse_factor); +// const int multscale = multiplier_limit/CONFIG_T::n_out; +// const int nin = CONFIG_T::n_in; +// const int nout = CONFIG_T::n_out; + +// assert((multiplier_limit % nout == 0 || rufactor >= nin) && "The current Reuse Factor is not allowed"); +// assert((rufactor > nin) && "This function is correct only for RF > N_IN"); + +// #pragma HLS function_instantiate variable=weights,biases +// //#pragma HLS RESOURCE variable=weights core=RAM_2P_BRAM Commenting out the deisgnation HLS seems to choose correctly +// #pragma HLS ARRAY_RESHAPE variable=weights block factor=block_factor +// #pragma HLS ARRAY_PARTITION variable=biases complete + +// typename CONFIG_T::accum_t acc[CONFIG_T::n_out]; +// #pragma HLS ARRAY_PARTITION variable=acc complete + +// InitAccum: +// for (int iacc = 0; iacc < nout; iacc++) { +// #pragma HLS UNROLL +// acc[iacc] = (typename CONFIG_T::accum_t) biases[iacc]; +// } + +// ReuseLoop: +// for (int ir = 0; ir < rufactor; ir++) { +// #pragma HLS PIPELINE II=1 rewind +// typename CONFIG_T::accum_t tmpmult[block_factor]; +// #pragma HLS ARRAY_PARTITION variable=tmpmult complete + +// MultLoop: +// for (int im = 0; im < block_factor; im++) { +// #pragma HLS UNROLL +// int w_index = ir + rufactor * im; +// int in_index = w_index % nin; +// if (w_index >= CONFIG_T::n_in*CONFIG_T::n_out) continue; // check out of bounds +// tmpmult[im] = CONFIG_T::template product::product(data[in_index], weights[w_index]); +// } + +// typename CONFIG_T::accum_t mult[multiplier_limit]; +// #pragma HLS ARRAY_PARTITION variable=mult complete + +// ResetMult: +// for (int imult = 0; imult < multiplier_limit; imult++) { +// #pragma HLS UNROLL +// mult[imult] = 0; +// } + +// AccumLoop1: +// for (int im = 0; im < block_factor; im++) { +// #pragma HLS UNROLL +// int w_index = ir + rufactor * im; +// int out_index = w_index / multfactor; +// if (out_index >= multiplier_limit) continue; // check out of bounds +// mult[out_index] += tmpmult[im]; +// } + +// AccumLoop2: +// for (int im = 0; im < multiplier_limit; im++) { +// #pragma HLS UNROLL +// //int out_index = im/multscale; // This is the general case +// //acc[out_index] += mult[im]; +// acc[im] += mult[im]; // If RF > N_IN then multiplier_limit == n_out +// } +// } + +// // Cast to "res_t" type +// Result: +// for (int ires = 0; ires < CONFIG_T::n_out; ires++) { +// #pragma HLS UNROLL +// typename CONFIG_T::out_t act = cast(acc[ires]); +// if (act > 0) res[ires] = act; +// else res[ires] = 0; +// } } @@ -511,23 +542,31 @@ void dense_resource( #pragma HLS INLINE region - if (CONFIG_T::merged_relu) { - if (CONFIG_T::reuse_factor <= CONFIG_T::n_in) { - dense_relu_resource_rf_leq_nin(data, res, weights, biases); - } else if (CONFIG_T::reuse_factor % CONFIG_T::n_in == 0) { - dense_relu_resource_rf_gt_nin_rem0(data, res, weights, biases); - } else { - dense_relu_resource_rf_gt_nin(data, res, weights, biases); - } - } else { - if (CONFIG_T::reuse_factor <= CONFIG_T::n_in) { - dense_resource_rf_leq_nin(data, res, weights, biases); - } else if (CONFIG_T::reuse_factor % CONFIG_T::n_in == 0) { - dense_resource_rf_gt_nin_rem0(data, res, weights, biases); - } else { - dense_resource_rf_gt_nin(data, res, weights, biases); - } - } + if (CONFIG_T::reuse_factor <= CONFIG_T::n_in) { + dense_resource_rf_leq_nin(data, res, weights, biases); + } else if (CONFIG_T::reuse_factor % CONFIG_T::n_in == 0) { + dense_resource_rf_gt_nin_rem0(data, res, weights, biases); + } else { + dense_resource_rf_gt_nin(data, res, weights, biases); + } + + // if (CONFIG_T::merged_relu) { + // if (CONFIG_T::reuse_factor <= CONFIG_T::n_in) { + // dense_relu_resource_rf_leq_nin(data, res, weights, biases); + // } else if (CONFIG_T::reuse_factor % CONFIG_T::n_in == 0) { + // dense_relu_resource_rf_gt_nin_rem0(data, res, weights, biases); + // } else { + // dense_relu_resource_rf_gt_nin(data, res, weights, biases); + // } + // } else { + // if (CONFIG_T::reuse_factor <= CONFIG_T::n_in) { + // dense_resource_rf_leq_nin(data, res, weights, biases); + // } else if (CONFIG_T::reuse_factor % CONFIG_T::n_in == 0) { + // dense_resource_rf_gt_nin_rem0(data, res, weights, biases); + // } else { + // dense_resource_rf_gt_nin(data, res, weights, biases); + // } + // } } } From 04a382ea89758f3ccf8cf07e918f56c077b512df Mon Sep 17 00:00:00 2001 From: Olivia Weng Date: Tue, 18 Jan 2022 16:20:01 -0800 Subject: [PATCH 064/102] remove comments and extra brace --- .../vivado/nnet_utils/nnet_dense_resource.h | 266 +----------------- 1 file changed, 3 insertions(+), 263 deletions(-) diff --git a/hls4ml/templates/vivado/nnet_utils/nnet_dense_resource.h b/hls4ml/templates/vivado/nnet_utils/nnet_dense_resource.h index d245754234..f8508b9641 100644 --- a/hls4ml/templates/vivado/nnet_utils/nnet_dense_resource.h +++ b/hls4ml/templates/vivado/nnet_utils/nnet_dense_resource.h @@ -94,7 +94,7 @@ void dense_resource_rf_leq_nin( // Cast to "res_t" type if (CONFIG_T::merged_relu) { - MergedReLU_Result: + MergedReluResult: for (int ires = 0; ires < CONFIG_T::n_out; ires++) { #pragma HLS UNROLL typename CONFIG_T::out_t act = cast(acc[ires]); @@ -183,7 +183,7 @@ void dense_resource_rf_gt_nin_rem0( // Cast to "res_t" type if (CONFIG_T::merged_relu) { - MergedReLU_Result: + MergedReluResult: for (int ires = 0; ires < CONFIG_T::n_out; ires++) { #pragma HLS UNROLL typename CONFIG_T::out_t act = cast(acc[ires]); @@ -275,7 +275,7 @@ void dense_resource_rf_gt_nin( // Cast to "res_t" type if (CONFIG_T::merged_relu) { - MergedReLU_Result: + MergedReluResult: for (int ires = 0; ires < CONFIG_T::n_out; ires++) { #pragma HLS UNROLL typename CONFIG_T::out_t act = cast(acc[ires]); @@ -289,250 +289,8 @@ void dense_resource_rf_gt_nin( res[ires] = cast(acc[ires]); } } - } -// Dense (with ReLU) -// template -// void dense_relu_resource_rf_leq_nin( -// data_T data[CONFIG_T::n_in], -// res_T res[CONFIG_T::n_out], -// typename CONFIG_T::weight_t weights[CONFIG_T::n_in*CONFIG_T::n_out], -// typename CONFIG_T::bias_t biases[CONFIG_T::n_out]) { - -// const int rufactor = CONFIG_T::reuse_factor; -// const int multfactor = MIN(CONFIG_T::n_in,CONFIG_T::reuse_factor); -// const int multiplier_limit = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, multfactor); -// const int block_factor = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, CONFIG_T::reuse_factor); -// const int multscale = multiplier_limit/CONFIG_T::n_out; -// const int nin = CONFIG_T::n_in; -// const int nout = CONFIG_T::n_out; - -// assert((multiplier_limit % nout == 0 || rufactor >= nin) && "The current Reuse Factor is not allowed"); -// assert((multiplier_limit == block_factor) && "This function is correct only for RF <= N_IN"); - -// #pragma HLS function_instantiate variable=weights,biases -// //#pragma HLS RESOURCE variable=weights core=RAM_2P_BRAM Commenting out the deisgnation HLS seems to choose correctly -// #pragma HLS ARRAY_RESHAPE variable=weights block factor=block_factor -// #pragma HLS ARRAY_PARTITION variable=biases complete - -// typename CONFIG_T::accum_t acc[CONFIG_T::n_out]; -// #pragma HLS ARRAY_PARTITION variable=acc complete - -// InitAccum: -// for (int iacc = 0; iacc < nout; iacc++) { -// #pragma HLS UNROLL -// acc[iacc] = (typename CONFIG_T::accum_t) biases[iacc]; -// } - -// ReuseLoop: -// for (int ir = 0; ir < rufactor; ir++) { -// #pragma HLS PIPELINE II=1 rewind - -// int w_index = ir; -// int in_index = ir; -// int out_index = 0; -// int acc_step = 0; - -// MultLoop: -// for (int im = 0; im < block_factor; im++) { -// #pragma HLS UNROLL - -// acc[out_index] += CONFIG_T::template product::product(data[in_index], weights[w_index]); - -// // Increment w_index -// w_index += rufactor; -// // Increment in_index -// in_index += rufactor; -// if (in_index >= nin) { -// in_index = ir; -// } -// // Increment out_index -// if (acc_step + 1 >= multscale) { -// acc_step = 0; -// out_index++; -// } else { -// acc_step++; -// } -// } -// } - -// // Cast to "res_t" type -// Result: -// for (int ires = 0; ires < CONFIG_T::n_out; ires++) { -// #pragma HLS UNROLL -// typename CONFIG_T::out_t act = cast(acc[ires]); -// if (act > 0) res[ires] = act; -// else res[ires] = 0; -// } -// } - -// template -// void dense_relu_resource_rf_gt_nin_rem0( -// data_T data[CONFIG_T::n_in], -// res_T res[CONFIG_T::n_out], -// typename CONFIG_T::weight_t weights[CONFIG_T::n_in*CONFIG_T::n_out], -// typename CONFIG_T::bias_t biases[CONFIG_T::n_out]) { - -// const int rufactor = MIN(CONFIG_T::reuse_factor, CONFIG_T::n_in * CONFIG_T::n_out); -// const int multfactor = MIN(CONFIG_T::n_in,CONFIG_T::reuse_factor); -// const int multiplier_limit = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, multfactor); -// const int block_factor = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, CONFIG_T::reuse_factor); -// const int multscale = multiplier_limit/CONFIG_T::n_out; -// const int nin = CONFIG_T::n_in; -// const int nout = CONFIG_T::n_out; - -// assert((multiplier_limit % nout == 0 || rufactor >= nin) && "The current Reuse Factor is not allowed"); -// assert((rufactor > nin && rufactor % nin == 0) && "This function is correct only for RF > N_IN && RF % N_IN == 0"); - -// #pragma HLS function_instantiate variable=weights,biases -// //#pragma HLS RESOURCE variable=weights core=RAM_2P_BRAM Commenting out the deisgnation HLS seems to choose correctly -// #pragma HLS ARRAY_RESHAPE variable=weights block factor=block_factor -// #pragma HLS ARRAY_PARTITION variable=biases complete - -// typename CONFIG_T::accum_t acc[CONFIG_T::n_out]; -// #pragma HLS ARRAY_PARTITION variable=acc complete - -// InitAccum: -// for (int iacc = 0; iacc < nout; iacc++) { -// #pragma HLS UNROLL -// acc[iacc] = (typename CONFIG_T::accum_t) biases[iacc]; -// } - -// int w_index; -// int in_index = 0; -// int out_index; -// int outstep = 0; -// const int outscale = rufactor / nin; - -// int outidx[rufactor]; -// IndexLoop: -// for (int ir = 0; ir < rufactor; ir++) { -// outidx[ir] = outstep; -// if ((ir + 1) % nin == 0) { -// outstep++; -// } -// } - -// ReuseLoop: -// for (int ir = 0; ir < rufactor; ir++) { -// #pragma HLS PIPELINE II=1 rewind - -// w_index = ir; -// out_index = outidx[ir]/*outstep*/; - -// MultLoop: -// for (int im = 0; im < block_factor; im++) { -// #pragma HLS UNROLL -// acc[out_index] += CONFIG_T::template product::product(data[in_index], weights[w_index]); - -// w_index += rufactor; -// if (w_index >= CONFIG_T::n_in * CONFIG_T::n_out) break; // check out of bounds -// out_index += outscale; -// } - -// in_index++; -// if (in_index >= nin) { -// in_index = 0; -// //outstep++; // This causes a huge increase in scheduling and RTL generation times, hence the above workaround. -// } -// } - -// // Cast to "res_t" type -// Result: -// for (int ires = 0; ires < CONFIG_T::n_out; ires++) { -// #pragma HLS UNROLL -// typename CONFIG_T::out_t act = cast(acc[ires]); -// if (act > 0) res[ires] = act; -// else res[ires] = 0; -// } -// } - -// template -// void dense_relu_resource_rf_gt_nin( -// data_T data[CONFIG_T::n_in], -// res_T res[CONFIG_T::n_out], -// typename CONFIG_T::weight_t weights[CONFIG_T::n_in*CONFIG_T::n_out], -// typename CONFIG_T::bias_t biases[CONFIG_T::n_out]) { - -// const int rufactor = CONFIG_T::reuse_factor; -// const int multfactor = MIN(CONFIG_T::n_in,CONFIG_T::reuse_factor); -// const int multiplier_limit = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, multfactor); -// const int block_factor = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, CONFIG_T::reuse_factor); -// const int multscale = multiplier_limit/CONFIG_T::n_out; -// const int nin = CONFIG_T::n_in; -// const int nout = CONFIG_T::n_out; - -// assert((multiplier_limit % nout == 0 || rufactor >= nin) && "The current Reuse Factor is not allowed"); -// assert((rufactor > nin) && "This function is correct only for RF > N_IN"); - -// #pragma HLS function_instantiate variable=weights,biases -// //#pragma HLS RESOURCE variable=weights core=RAM_2P_BRAM Commenting out the deisgnation HLS seems to choose correctly -// #pragma HLS ARRAY_RESHAPE variable=weights block factor=block_factor -// #pragma HLS ARRAY_PARTITION variable=biases complete - -// typename CONFIG_T::accum_t acc[CONFIG_T::n_out]; -// #pragma HLS ARRAY_PARTITION variable=acc complete - -// InitAccum: -// for (int iacc = 0; iacc < nout; iacc++) { -// #pragma HLS UNROLL -// acc[iacc] = (typename CONFIG_T::accum_t) biases[iacc]; -// } - -// ReuseLoop: -// for (int ir = 0; ir < rufactor; ir++) { -// #pragma HLS PIPELINE II=1 rewind -// typename CONFIG_T::accum_t tmpmult[block_factor]; -// #pragma HLS ARRAY_PARTITION variable=tmpmult complete - -// MultLoop: -// for (int im = 0; im < block_factor; im++) { -// #pragma HLS UNROLL -// int w_index = ir + rufactor * im; -// int in_index = w_index % nin; -// if (w_index >= CONFIG_T::n_in*CONFIG_T::n_out) continue; // check out of bounds -// tmpmult[im] = CONFIG_T::template product::product(data[in_index], weights[w_index]); -// } - -// typename CONFIG_T::accum_t mult[multiplier_limit]; -// #pragma HLS ARRAY_PARTITION variable=mult complete - -// ResetMult: -// for (int imult = 0; imult < multiplier_limit; imult++) { -// #pragma HLS UNROLL -// mult[imult] = 0; -// } - -// AccumLoop1: -// for (int im = 0; im < block_factor; im++) { -// #pragma HLS UNROLL -// int w_index = ir + rufactor * im; -// int out_index = w_index / multfactor; -// if (out_index >= multiplier_limit) continue; // check out of bounds -// mult[out_index] += tmpmult[im]; -// } - -// AccumLoop2: -// for (int im = 0; im < multiplier_limit; im++) { -// #pragma HLS UNROLL -// //int out_index = im/multscale; // This is the general case -// //acc[out_index] += mult[im]; -// acc[im] += mult[im]; // If RF > N_IN then multiplier_limit == n_out -// } -// } - -// // Cast to "res_t" type -// Result: -// for (int ires = 0; ires < CONFIG_T::n_out; ires++) { -// #pragma HLS UNROLL -// typename CONFIG_T::out_t act = cast(acc[ires]); -// if (act > 0) res[ires] = act; -// else res[ires] = 0; -// } -} - - template void dense_resource( data_T data[CONFIG_T::n_in], @@ -549,24 +307,6 @@ void dense_resource( } else { dense_resource_rf_gt_nin(data, res, weights, biases); } - - // if (CONFIG_T::merged_relu) { - // if (CONFIG_T::reuse_factor <= CONFIG_T::n_in) { - // dense_relu_resource_rf_leq_nin(data, res, weights, biases); - // } else if (CONFIG_T::reuse_factor % CONFIG_T::n_in == 0) { - // dense_relu_resource_rf_gt_nin_rem0(data, res, weights, biases); - // } else { - // dense_relu_resource_rf_gt_nin(data, res, weights, biases); - // } - // } else { - // if (CONFIG_T::reuse_factor <= CONFIG_T::n_in) { - // dense_resource_rf_leq_nin(data, res, weights, biases); - // } else if (CONFIG_T::reuse_factor % CONFIG_T::n_in == 0) { - // dense_resource_rf_gt_nin_rem0(data, res, weights, biases); - // } else { - // dense_resource_rf_gt_nin(data, res, weights, biases); - // } - // } } } From 7164673f815e456b7f669878ac1989a505e2492f Mon Sep 17 00:00:00 2001 From: Olivia Weng Date: Wed, 19 Jan 2022 15:12:09 -0800 Subject: [PATCH 065/102] revert back to verbose template because it achieves maximum resource savings --- .../vivado/nnet_utils/nnet_dense_resource.h | 313 +++++++++++++++--- 1 file changed, 267 insertions(+), 46 deletions(-) diff --git a/hls4ml/templates/vivado/nnet_utils/nnet_dense_resource.h b/hls4ml/templates/vivado/nnet_utils/nnet_dense_resource.h index f8508b9641..c6ee9479aa 100644 --- a/hls4ml/templates/vivado/nnet_utils/nnet_dense_resource.h +++ b/hls4ml/templates/vivado/nnet_utils/nnet_dense_resource.h @@ -93,20 +93,10 @@ void dense_resource_rf_leq_nin( } // Cast to "res_t" type - if (CONFIG_T::merged_relu) { - MergedReluResult: - for (int ires = 0; ires < CONFIG_T::n_out; ires++) { - #pragma HLS UNROLL - typename CONFIG_T::out_t act = cast(acc[ires]); - if (act > 0) res[ires] = act; - else res[ires] = 0; - } - } else { - Result: - for (int ires = 0; ires < CONFIG_T::n_out; ires++) { - #pragma HLS UNROLL - res[ires] = cast(acc[ires]); - } + Result: + for (int ires = 0; ires < CONFIG_T::n_out; ires++) { + #pragma HLS UNROLL + res[ires] = cast(acc[ires]); } } @@ -182,20 +172,10 @@ void dense_resource_rf_gt_nin_rem0( } // Cast to "res_t" type - if (CONFIG_T::merged_relu) { - MergedReluResult: - for (int ires = 0; ires < CONFIG_T::n_out; ires++) { - #pragma HLS UNROLL - typename CONFIG_T::out_t act = cast(acc[ires]); - if (act > 0) res[ires] = act; - else res[ires] = 0; - } - } else { - Result: - for (int ires = 0; ires < CONFIG_T::n_out; ires++) { - #pragma HLS UNROLL - res[ires] = cast(acc[ires]); - } + Result: + for (int ires = 0; ires < CONFIG_T::n_out; ires++) { + #pragma HLS UNROLL + res[ires] = cast(acc[ires]); } } @@ -274,23 +254,254 @@ void dense_resource_rf_gt_nin( } // Cast to "res_t" type - if (CONFIG_T::merged_relu) { - MergedReluResult: - for (int ires = 0; ires < CONFIG_T::n_out; ires++) { + Result: + for (int ires = 0; ires < CONFIG_T::n_out; ires++) { + #pragma HLS UNROLL + res[ires] = cast(acc[ires]); + } +} + +// Dense (with ReLU) +template +void dense_relu_resource_rf_leq_nin( + data_T data[CONFIG_T::n_in], + res_T res[CONFIG_T::n_out], + typename CONFIG_T::weight_t weights[CONFIG_T::n_in*CONFIG_T::n_out], + typename CONFIG_T::bias_t biases[CONFIG_T::n_out]) { + + const int rufactor = CONFIG_T::reuse_factor; + const int multfactor = MIN(CONFIG_T::n_in,CONFIG_T::reuse_factor); + const int multiplier_limit = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, multfactor); + const int block_factor = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, CONFIG_T::reuse_factor); + const int multscale = multiplier_limit/CONFIG_T::n_out; + const int nin = CONFIG_T::n_in; + const int nout = CONFIG_T::n_out; + + assert((multiplier_limit % nout == 0 || rufactor >= nin) && "The current Reuse Factor is not allowed"); + assert((multiplier_limit == block_factor) && "This function is correct only for RF <= N_IN"); + + #pragma HLS function_instantiate variable=weights,biases + //#pragma HLS RESOURCE variable=weights core=RAM_2P_BRAM Commenting out the deisgnation HLS seems to choose correctly + #pragma HLS ARRAY_RESHAPE variable=weights block factor=block_factor + #pragma HLS ARRAY_PARTITION variable=biases complete + + typename CONFIG_T::accum_t acc[CONFIG_T::n_out]; + #pragma HLS ARRAY_PARTITION variable=acc complete + + InitAccum: + for (int iacc = 0; iacc < nout; iacc++) { + #pragma HLS UNROLL + acc[iacc] = (typename CONFIG_T::accum_t) biases[iacc]; + } + + ReuseLoop: + for (int ir = 0; ir < rufactor; ir++) { + #pragma HLS PIPELINE II=1 rewind + + int w_index = ir; + int in_index = ir; + int out_index = 0; + int acc_step = 0; + + MultLoop: + for (int im = 0; im < block_factor; im++) { + #pragma HLS UNROLL + + acc[out_index] += CONFIG_T::template product::product(data[in_index], weights[w_index]); + + // Increment w_index + w_index += rufactor; + // Increment in_index + in_index += rufactor; + if (in_index >= nin) { + in_index = ir; + } + // Increment out_index + if (acc_step + 1 >= multscale) { + acc_step = 0; + out_index++; + } else { + acc_step++; + } + } + } + + // Cast to "res_t" type + Result: + for (int ires = 0; ires < CONFIG_T::n_out; ires++) { + #pragma HLS UNROLL + typename CONFIG_T::out_t act = cast(acc[ires]); + if (act > 0) res[ires] = act; + else res[ires] = 0; + } +} + +template +void dense_relu_resource_rf_gt_nin_rem0( + data_T data[CONFIG_T::n_in], + res_T res[CONFIG_T::n_out], + typename CONFIG_T::weight_t weights[CONFIG_T::n_in*CONFIG_T::n_out], + typename CONFIG_T::bias_t biases[CONFIG_T::n_out]) { + + const int rufactor = MIN(CONFIG_T::reuse_factor, CONFIG_T::n_in * CONFIG_T::n_out); + const int multfactor = MIN(CONFIG_T::n_in,CONFIG_T::reuse_factor); + const int multiplier_limit = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, multfactor); + const int block_factor = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, CONFIG_T::reuse_factor); + const int multscale = multiplier_limit/CONFIG_T::n_out; + const int nin = CONFIG_T::n_in; + const int nout = CONFIG_T::n_out; + + assert((multiplier_limit % nout == 0 || rufactor >= nin) && "The current Reuse Factor is not allowed"); + assert((rufactor > nin && rufactor % nin == 0) && "This function is correct only for RF > N_IN && RF % N_IN == 0"); + + #pragma HLS function_instantiate variable=weights,biases + //#pragma HLS RESOURCE variable=weights core=RAM_2P_BRAM Commenting out the deisgnation HLS seems to choose correctly + #pragma HLS ARRAY_RESHAPE variable=weights block factor=block_factor + #pragma HLS ARRAY_PARTITION variable=biases complete + + typename CONFIG_T::accum_t acc[CONFIG_T::n_out]; + #pragma HLS ARRAY_PARTITION variable=acc complete + + InitAccum: + for (int iacc = 0; iacc < nout; iacc++) { + #pragma HLS UNROLL + acc[iacc] = (typename CONFIG_T::accum_t) biases[iacc]; + } + + int w_index; + int in_index = 0; + int out_index; + int outstep = 0; + const int outscale = rufactor / nin; + + int outidx[rufactor]; + IndexLoop: + for (int ir = 0; ir < rufactor; ir++) { + outidx[ir] = outstep; + if ((ir + 1) % nin == 0) { + outstep++; + } + } + + ReuseLoop: + for (int ir = 0; ir < rufactor; ir++) { + #pragma HLS PIPELINE II=1 rewind + + w_index = ir; + out_index = outidx[ir]/*outstep*/; + + MultLoop: + for (int im = 0; im < block_factor; im++) { #pragma HLS UNROLL - typename CONFIG_T::out_t act = cast(acc[ires]); - if (act > 0) res[ires] = act; - else res[ires] = 0; + acc[out_index] += CONFIG_T::template product::product(data[in_index], weights[w_index]); + + w_index += rufactor; + if (w_index >= CONFIG_T::n_in * CONFIG_T::n_out) break; // check out of bounds + out_index += outscale; } - } else { - Result: - for (int ires = 0; ires < CONFIG_T::n_out; ires++) { + + in_index++; + if (in_index >= nin) { + in_index = 0; + //outstep++; // This causes a huge increase in scheduling and RTL generation times, hence the above workaround. + } + } + + // Cast to "res_t" type + Result: + for (int ires = 0; ires < CONFIG_T::n_out; ires++) { + #pragma HLS UNROLL + typename CONFIG_T::out_t act = cast(acc[ires]); + if (act > 0) res[ires] = act; + else res[ires] = 0; + } +} + +template +void dense_relu_resource_rf_gt_nin( + data_T data[CONFIG_T::n_in], + res_T res[CONFIG_T::n_out], + typename CONFIG_T::weight_t weights[CONFIG_T::n_in*CONFIG_T::n_out], + typename CONFIG_T::bias_t biases[CONFIG_T::n_out]) { + + const int rufactor = CONFIG_T::reuse_factor; + const int multfactor = MIN(CONFIG_T::n_in,CONFIG_T::reuse_factor); + const int multiplier_limit = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, multfactor); + const int block_factor = DIV_ROUNDUP(CONFIG_T::n_in*CONFIG_T::n_out, CONFIG_T::reuse_factor); + const int multscale = multiplier_limit/CONFIG_T::n_out; + const int nin = CONFIG_T::n_in; + const int nout = CONFIG_T::n_out; + + assert((multiplier_limit % nout == 0 || rufactor >= nin) && "The current Reuse Factor is not allowed"); + assert((rufactor > nin) && "This function is correct only for RF > N_IN"); + + #pragma HLS function_instantiate variable=weights,biases + //#pragma HLS RESOURCE variable=weights core=RAM_2P_BRAM Commenting out the deisgnation HLS seems to choose correctly + #pragma HLS ARRAY_RESHAPE variable=weights block factor=block_factor + #pragma HLS ARRAY_PARTITION variable=biases complete + + typename CONFIG_T::accum_t acc[CONFIG_T::n_out]; + #pragma HLS ARRAY_PARTITION variable=acc complete + + InitAccum: + for (int iacc = 0; iacc < nout; iacc++) { + #pragma HLS UNROLL + acc[iacc] = (typename CONFIG_T::accum_t) biases[iacc]; + } + + ReuseLoop: + for (int ir = 0; ir < rufactor; ir++) { + #pragma HLS PIPELINE II=1 rewind + typename CONFIG_T::accum_t tmpmult[block_factor]; + #pragma HLS ARRAY_PARTITION variable=tmpmult complete + + MultLoop: + for (int im = 0; im < block_factor; im++) { + #pragma HLS UNROLL + int w_index = ir + rufactor * im; + int in_index = w_index % nin; + if (w_index >= CONFIG_T::n_in*CONFIG_T::n_out) continue; // check out of bounds + tmpmult[im] = CONFIG_T::template product::product(data[in_index], weights[w_index]); + } + + typename CONFIG_T::accum_t mult[multiplier_limit]; + #pragma HLS ARRAY_PARTITION variable=mult complete + + ResetMult: + for (int imult = 0; imult < multiplier_limit; imult++) { #pragma HLS UNROLL - res[ires] = cast(acc[ires]); + mult[imult] = 0; + } + + AccumLoop1: + for (int im = 0; im < block_factor; im++) { + #pragma HLS UNROLL + int w_index = ir + rufactor * im; + int out_index = w_index / multfactor; + if (out_index >= multiplier_limit) continue; // check out of bounds + mult[out_index] += tmpmult[im]; + } + + AccumLoop2: + for (int im = 0; im < multiplier_limit; im++) { + #pragma HLS UNROLL + //int out_index = im/multscale; // This is the general case + //acc[out_index] += mult[im]; + acc[im] += mult[im]; // If RF > N_IN then multiplier_limit == n_out } } + + // Cast to "res_t" type + Result: + for (int ires = 0; ires < CONFIG_T::n_out; ires++) { + #pragma HLS UNROLL + typename CONFIG_T::out_t act = cast(acc[ires]); + if (act > 0) res[ires] = act; + else res[ires] = 0; + } } + template void dense_resource( data_T data[CONFIG_T::n_in], @@ -300,15 +511,25 @@ void dense_resource( #pragma HLS INLINE region - if (CONFIG_T::reuse_factor <= CONFIG_T::n_in) { - dense_resource_rf_leq_nin(data, res, weights, biases); - } else if (CONFIG_T::reuse_factor % CONFIG_T::n_in == 0) { - dense_resource_rf_gt_nin_rem0(data, res, weights, biases); - } else { - dense_resource_rf_gt_nin(data, res, weights, biases); - } + if (CONFIG_T::merged_relu) { + if (CONFIG_T::reuse_factor <= CONFIG_T::n_in) { + dense_relu_resource_rf_leq_nin(data, res, weights, biases); + } else if (CONFIG_T::reuse_factor % CONFIG_T::n_in == 0) { + dense_relu_resource_rf_gt_nin_rem0(data, res, weights, biases); + } else { + dense_relu_resource_rf_gt_nin(data, res, weights, biases); + } + } else { + if (CONFIG_T::reuse_factor <= CONFIG_T::n_in) { + dense_resource_rf_leq_nin(data, res, weights, biases); + } else if (CONFIG_T::reuse_factor % CONFIG_T::n_in == 0) { + dense_resource_rf_gt_nin_rem0(data, res, weights, biases); + } else { + dense_resource_rf_gt_nin(data, res, weights, biases); + } + } } } -#endif +#endif \ No newline at end of file From 1ee57081ae628feb3d60abc4f958794483a66ed3 Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Mon, 24 Jan 2022 23:42:46 -0600 Subject: [PATCH 066/102] add back cppname --- hls4ml/model/hls_layers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index cc4975ea2f..684e6080b5 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -199,6 +199,7 @@ def __init__(self, shape, dim_names, proxy, **kwargs): self.shape = shape self.dim_names = dim_names self.type = proxy.type + self.cppname = proxy.name self.name = proxy.name self.size = proxy.size From 4c7321a6ca3454171d47c475dfd9fcf6bb205ae8 Mon Sep 17 00:00:00 2001 From: Jules Muhizi Date: Tue, 25 Jan 2022 12:17:37 -0500 Subject: [PATCH 067/102] added weight transponse and qkeras quantization support --- hls4ml/converters/__init__.py | 5 +++- hls4ml/model/hls_layers.py | 52 +---------------------------------- 2 files changed, 5 insertions(+), 52 deletions(-) diff --git a/hls4ml/converters/__init__.py b/hls4ml/converters/__init__.py index 1ecf4b37f1..5a81c21c90 100644 --- a/hls4ml/converters/__init__.py +++ b/hls4ml/converters/__init__.py @@ -85,9 +85,12 @@ def parse_yaml_config(config_file): """ def construct_keras_model(loader, node): from tensorflow.keras.models import load_model + from qkeras.utils import _add_supported_quantized_objects + co = {} + _add_supported_quantized_objects(co) model_str = loader.construct_scalar(node) - return load_model(model_str) + return load_model(model_str, custom_objects=co) yaml.add_constructor(u'!keras_model', construct_keras_model, Loader=yaml.SafeLoader) diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index e370af2f84..567556b4d7 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -650,56 +650,6 @@ def config_cpp(self): params['strategy'] = self.get_attr('strategy') return self._config_template.format(**params) -class DenseBatchnorm(Dense): - def _get_folded_weights(self): - """ - Function to get the batchnorm folded weights. - This function converts the weights by folding batchnorm parameters into - the weight of QConv2D. The high-level equation: - W_fold = gamma * W / sqrt(variance + epsilon) - bias_fold = gamma * (bias - moving_mean) / sqrt(variance + epsilon) + beta - """ - kernel = self.model.get_weights_data(self.name, 'kernel') - bias = self.model.get_weights_data(self.name, 'bias') - if bias is None: - bias = 0 - - # get batchnorm weights and moving stats - gamma = self.model.get_weights_data(self.name, 'gamma') - beta = self.model.get_weights_data(self.name, 'beta') - moving_mean = self.model.get_weights_data(self.name, 'moving_mean') - moving_variance = self.model.get_weights_data(self.name, 'moving_variance') - # get the inversion factor so that we replace division by multiplication - inv = np.reciprocal(np.sqrt(moving_variance + self.get_attr('epsilon'))) - if gamma is not None: - inv *= gamma - - # wrap conv kernel and bias with bn parameters - folded_kernel = inv * kernel - folded_bias = inv * (bias - moving_mean) + beta - - return [folded_kernel, folded_bias] - - def initialize(self): - super(DenseBatchnorm, self).initialize() - folded_weights, folded_bias = self._get_folded_weights() - if self.model.config.is_resource_strategy(self) and self.model.config.backend.name == 'Vivado': - self.weights['weight'].data_unquantized = np.transpose(folded_weights, axes=[3, 0, 1, 2]) - self.weights['weight'].data = self.get_attr('weight_quantizer')(self.weights['weight'].data_unquantized) - - else: - self.weights['weight'].data_unquantized = folded_weights - self.weights['weight'].data = self.get_attr('weight_quantizer')(folded_weights) - self.weights['bias'].data_unquantized = folded_bias - bias_q = self.get_attr('bias_quantizer') - if bias_q is not None: - self.weights['bias'].data = bias_q(folded_bias) - - def function_cpp(self): - return super(DenseBatchnorm, self).function_cpp() - - def config_cpp(self): - return super(DenseBatchnorm, self).config_cpp() class Conv1D(Layer): def initialize(self): @@ -1917,7 +1867,6 @@ def _get_transforms_config(self, params): 'BinaryDense' : Dense, 'TernaryDense' : Dense, 'QDense' : Dense, - 'QDenseBatchnorm' : DenseBatchnorm, 'Conv1D' : Conv1D, 'QConv1D' : Conv1D, 'Conv2D' : Conv2D, @@ -1954,3 +1903,4 @@ def _get_transforms_config(self, params): def register_layer(name, clazz): global layer_map layer_map[name] = clazz + \ No newline at end of file From afd82495672ff538df3e0c4a829c94c2327c7998 Mon Sep 17 00:00:00 2001 From: Jules Muhizi Date: Tue, 25 Jan 2022 12:33:47 -0500 Subject: [PATCH 068/102] patch-2 - added weight transponse and qkeras quantization support --- hls4ml/model/hls_layers.py | 53 +++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index 567556b4d7..8c9623a86c 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -651,6 +651,57 @@ def config_cpp(self): return self._config_template.format(**params) +class DenseBatchnorm(Dense): + def _get_folded_weights(self): + """ + Function to get the batchnorm folded weights. + This function converts the weights by folding batchnorm parameters into + the weight of QDense. The high-level equation: + W_fold = gamma * W / sqrt(variance + epsilon) + bias_fold = gamma * (bias - moving_mean) / sqrt(variance + epsilon) + beta + """ + kernel = self.model.get_weights_data(self.name, 'kernel') + bias = self.model.get_weights_data(self.name, 'bias') + if bias is None: + bias = 0 + + # get batchnorm weights and moving stats + gamma = self.model.get_weights_data(self.name, 'gamma') + beta = self.model.get_weights_data(self.name, 'beta') + moving_mean = self.model.get_weights_data(self.name, 'moving_mean') + moving_variance = self.model.get_weights_data(self.name, 'moving_variance') + # get the inversion factor so that we replace division by multiplication + inv = np.reciprocal(np.sqrt(moving_variance + self.get_attr('epsilon'))) + if gamma is not None: + inv *= gamma + + # wrap conv kernel and bias with bn parameters + folded_kernel = inv * kernel + folded_bias = inv * (bias - moving_mean) + beta + + return [folded_kernel, folded_bias] + + def initialize(self): + super(DenseBatchnorm, self).initialize() + folded_weights, folded_bias = self._get_folded_weights() + if self.model.config.is_resource_strategy(self) and self.model.config.backend.name in ['Vivado', 'VivadoAccelerator']: + self.weights['weight'].data_unquantized = np.transpose(folded_weights) + self.weights['weight'].data = self.get_attr('weight_quantizer')(self.weights['weight'].data_unquantized) + + else: + self.weights['weight'].data_unquantized = folded_weights + self.weights['weight'].data = self.get_attr('weight_quantizer')(folded_weights) + self.weights['bias'].data_unquantized = folded_bias + bias_q = self.get_attr('bias_quantizer') + if bias_q is not None: + self.weights['bias'].data = bias_q(folded_bias) + + def function_cpp(self): + return super(DenseBatchnorm, self).function_cpp() + + def config_cpp(self): + return super(DenseBatchnorm, self).config_cpp() + class Conv1D(Layer): def initialize(self): if self.get_attr('data_format') == 'channels_last': @@ -1867,6 +1918,7 @@ def _get_transforms_config(self, params): 'BinaryDense' : Dense, 'TernaryDense' : Dense, 'QDense' : Dense, + 'QDenseBatchnorm' : DenseBatchnorm, 'Conv1D' : Conv1D, 'QConv1D' : Conv1D, 'Conv2D' : Conv2D, @@ -1903,4 +1955,3 @@ def _get_transforms_config(self, params): def register_layer(name, clazz): global layer_map layer_map[name] = clazz - \ No newline at end of file From 023321d9f24b9804b4d12227bf47254609296634 Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Tue, 25 Jan 2022 08:39:56 -0600 Subject: [PATCH 069/102] add c drivers for pynq-z2 --- .../pynq-z2/c_drivers/sdk/Makefile | 33 +++ .../pynq-z2/c_drivers/sdk/common/main.c | 262 ++++++++++++++++++ .../pynq-z2/c_drivers/sdk/setup.tcl | 14 + 3 files changed, 309 insertions(+) create mode 100644 hls4ml/templates/vivado_accelerator/pynq-z2/c_drivers/sdk/Makefile create mode 100644 hls4ml/templates/vivado_accelerator/pynq-z2/c_drivers/sdk/common/main.c create mode 100644 hls4ml/templates/vivado_accelerator/pynq-z2/c_drivers/sdk/setup.tcl diff --git a/hls4ml/templates/vivado_accelerator/pynq-z2/c_drivers/sdk/Makefile b/hls4ml/templates/vivado_accelerator/pynq-z2/c_drivers/sdk/Makefile new file mode 100644 index 0000000000..03ab9b8de7 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/pynq-z2/c_drivers/sdk/Makefile @@ -0,0 +1,33 @@ +DESIGN := design_1 + +help: + @echo "INFO: make to show targets" +.PHONY: help + +--setup: + xsct ./setup.tcl $(DESIGN) +.PHONY: --setup + +sdk: --setup + rm -f $(DESIGN)_standalone/src/helloworld.c + cd $(DESIGN)_standalone/src && ln -s ../../common/main.c main.c + cd $(DESIGN)_standalone/src && ln -s ../../common/data.h data.h +.PHONY: sdk + +gui: + xsdk --workspace . & +.PHONY: gui + +clean: + rm -rf $(DESIGN)_platform + rm -rf $(DESIGN)_standalone + rm -rf $(DESIGN)_standalone_bsp + rm -rf RemoteSystemsTempFiles + rm -rf .Xil + rm -rf .metadata + rm -f *.log +.PHONY: clean + +ultraclean: clean + rm -rf hdf/*.hdf +.PHONY: ultraclean diff --git a/hls4ml/templates/vivado_accelerator/pynq-z2/c_drivers/sdk/common/main.c b/hls4ml/templates/vivado_accelerator/pynq-z2/c_drivers/sdk/common/main.c new file mode 100644 index 0000000000..7dd2be22a8 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/pynq-z2/c_drivers/sdk/common/main.c @@ -0,0 +1,262 @@ +/** + * + * Set Heap Size in ldscript.ld to 0x1000000 (16MB) + * + */ + +#include "xmyproject_axi.h" /* TODO: design-dependent name */ +#include "stdio.h" /* PRINTF */ +#include "unistd.h" /* sleep */ +#include "stdlib.h" +#include "malloc.h" +#include "assert.h" +#include "xil_io.h" /* peripheral read/write wrappers */ +#include "xtime_l.h" /* to measure performance of the system */ +#include "platform.h" /* platform init/cleanup functions */ +#include "xil_cache.h" /* enable/disable caches etc */ +#include "xil_printf.h" /* UART debug print functions */ +#include "xparameters.h" /* peripherals base addresses */ + +#include "data.h" + +//#define __DEBUG__ + +#define MAX_PRINT_ELEMENTS (16) + +#define PRINTF printf + +const unsigned INPUT_N_ELEMENTS = N_SAMPLES * N_X_INPUTS; +const unsigned OUTPUT_N_ELEMENTS = N_SAMPLES * N_Y_OUTPUTS; + +#if 1 +/* Accelerator verification */ +#define REFERENCE_OUTPUTS data_y_hls_outputs +#else +/* Accelerator validation */ +#define REFERENCE_OUTPUTS data_y_outputs +//#define REFERENCE_OUTPUTS data_y_keras_outputs +#endif + +unsigned get_max(float *data, unsigned n_elements) { + float max_value = 0.0; + unsigned max_index = 0; + for (unsigned i = 0; i < n_elements; i++) + if (data[i] >= max_value) { + max_index = i; + max_value = data[i]; + } + return max_index; +} + +float *inputs_mem = NULL; +float *outputs_mem = NULL; +float *reference_mem = NULL; + +/* Accelerator configuration */ +XMyproject_axi accelerator; /* TODO: design-dependent name */ +XMyproject_axi_Config *accelerator_cfg; /* TODO: design-dependent name */ + +/* Accelerator initialization routine */ +void init_accelerators() { + PRINTF("INFO: Initializing accelerator\r\n"); + accelerator_cfg = XMyproject_axi_LookupConfig(XPAR_MYPROJECT_AXI_0_DEVICE_ID); /* TODO: design-dependent name */ + if (accelerator_cfg) { + int status = XMyproject_axi_CfgInitialize(&accelerator, accelerator_cfg); /* TODO: design-dependent name */ + if (status != XST_SUCCESS) { + PRINTF("ERROR: Initializing accelerator\r\n"); + } + } +} + +/* Reference implementation of the accelerator in software */ +int sw_reference_implementation(float *sw_inputs_mem, float *sw_outputs_mem, unsigned n_samples, unsigned n_X_inputs, unsigned n_y_ouputs) { +#ifdef __DEBUG__ + PRINTF("INFO: Reference outputs are pre-compiled. It would be nice to run a software model here.\r\n"); +#endif + /* See data.h for inputs and outputs */ + for (unsigned i = 0; i < n_samples * n_y_ouputs; i++) { + sw_outputs_mem[i] = REFERENCE_OUTPUTS[i]; + } + return 0; +} + +/* Profiling function */ +double get_elapsed_time(XTime start, XTime stop) { + return 1.0 * (stop - start) / (COUNTS_PER_SECOND); +} + +/* Dump data to the console */ +void dump_data(const char* label, float* data, unsigned n_samples, unsigned feature_count) { + PRINTF("INFO: %s[%u][%u]:\r\n", label, n_samples, feature_count); + /* Print at most MAX_PRINT_ELEMENTS */ + for (unsigned i = 0; i < n_samples && i < MAX_PRINT_ELEMENTS; i++) { + PRINTF("INFO: [%u] ", i); + for (unsigned j = 0; j < feature_count; j++) { + unsigned index = i * feature_count + j; + PRINTF("%f ", data[index]); + } + PRINTF("\r\n"); + } +} + +/* The top of the hill :-) */ +int main(int argc, char** argv) { + + XTime start, stop; + double calibration_time; + double sw_elapsed = 0; + double hw_elapsed = 0; + double cache_elapsed = 0; + unsigned hw_errors; + + char __attribute__ ((unused)) dummy; /* dummy input */ + + /* Initialize platform (uart and caches) */ + init_platform(); + + PRINTF("\r\n"); + PRINTF("INFO: ==================================================\r\n"); + PRINTF("INFO: XMyproject_axi (w/ polling)\r\n"); /* TODO: design-dependent name */ + PRINTF("INFO: ==================================================\r\n"); + + init_accelerators(); + + inputs_mem = malloc(INPUT_N_ELEMENTS * sizeof(float)); + outputs_mem = malloc(OUTPUT_N_ELEMENTS * sizeof(float)); + reference_mem = malloc(OUTPUT_N_ELEMENTS * sizeof(float)); + + /* Calibration */ + XTime_GetTime(&start); + sleep(1); + XTime_GetTime(&stop); + calibration_time = get_elapsed_time(start, stop); + PRINTF("INFO: Time calibration for one second (%lf sec)\r\n", calibration_time); + + /* Initialize memory */ + PRINTF("INFO: Initialize memory\r\n"); + PRINTF("INFO: - Samples count: %u\r\n", N_SAMPLES); /* Same as dst_SAMPLE_COUNT */ + PRINTF("INFO: - Inputs count: %u\r\n", N_X_INPUTS); + PRINTF("INFO: - Outputs count: %u\r\n", N_Y_OUTPUTS); + PRINTF("INFO: - Data size: %u B\r\n", sizeof(float)); + PRINTF("INFO: - Total input size: %u B, %.2f KB, %.2f MB\r\n", N_X_INPUTS * N_SAMPLES * sizeof(float), (N_X_INPUTS * N_SAMPLES * sizeof(float)) / (float)1024, (N_X_INPUTS * N_SAMPLES * sizeof(float)) / (float)(1024*1024)); + PRINTF("INFO: - Total output size: %u B, %.2f KB, %.2f MB\r\n", N_Y_OUTPUTS * N_SAMPLES * sizeof(float), (N_Y_OUTPUTS * N_SAMPLES * sizeof(float)) / (float)1024, (N_Y_OUTPUTS * N_SAMPLES * sizeof(float)) / (float)(1024*1024)); + + // Set Heap Size in ldscript.ld to 0x1000000 (16MB) + //malloc_stats(); + + for (int i = 0; i < INPUT_N_ELEMENTS; i++) { + inputs_mem[i] = data_X_inputs[i]; + } + for (int i = 0; i < OUTPUT_N_ELEMENTS; i++) { + outputs_mem[i] = 0x0; + } + + /* ****** SW REFERENCE ****** */ + PRINTF("INFO: ==================================================\r\n"); + PRINTF("INFO: Start SW reference implementation\r\n"); + XTime_GetTime(&start); + sw_reference_implementation(inputs_mem, reference_mem, N_SAMPLES, N_X_INPUTS, N_Y_OUTPUTS); + XTime_GetTime(&stop); + sw_elapsed = get_elapsed_time(start, stop); + PRINTF("INFO: ==================================================\r\n"); + PRINTF("INFO: Press any key to start:\r\n"); + dummy = inbyte(); + //PRINTF("INFO:"); + + /* ****** HW ACCELERATOR ****** */ + PRINTF("INFO: Start HW accelerator\r\n"); + + XTime_GetTime(&start); + Xil_DCacheFlushRange((UINTPTR)inputs_mem, INPUT_N_ELEMENTS * sizeof(float)); + Xil_DCacheFlushRange((UINTPTR)outputs_mem, OUTPUT_N_ELEMENTS * sizeof(float)); + Xil_DCacheFlushRange((UINTPTR)reference_mem, OUTPUT_N_ELEMENTS * sizeof(float)); + XTime_GetTime(&stop); + cache_elapsed = get_elapsed_time(start, stop); + + for (unsigned j = 0; j < N_SAMPLES; j++) { + float *inputs_mem_i = inputs_mem + j * N_X_INPUTS; + float *outputs_mem_i = outputs_mem + j * N_Y_OUTPUTS; + + /* Configure the accelerator */ + XTime_GetTime(&start); + XMyproject_axi_Set_in_r(&accelerator, (unsigned)inputs_mem_i); /* TODO: design-dependent name */ + XMyproject_axi_Set_out_r(&accelerator, (unsigned)outputs_mem_i); /* TODO: design-dependent name */ + + XMyproject_axi_Start(&accelerator); /* TODO: design-dependent name */ + + /* Polling */ + while (!XMyproject_axi_IsDone(&accelerator)); /* TODO: design-dependent name */ + + /* Get error status */ + //hw_flags = XMyproject_axi_Get_return(&accelerator); /* TODO: design-dependent name */ + XTime_GetTime(&stop); + hw_elapsed += get_elapsed_time(start, stop); + } + + XTime_GetTime(&start); + Xil_DCacheFlushRange((UINTPTR)outputs_mem, OUTPUT_N_ELEMENTS * sizeof(float)); + XTime_GetTime(&stop); + cache_elapsed += get_elapsed_time(start, stop); + + PRINTF("INFO: HW accelerator done!\r\n"); + + /* ****** VALIDATION ****** */ + PRINTF("INFO: ================== Verification ==================\r\n"); +#ifdef __DEBUG__ + PRINTF("INFO: Dump data\r\n"); + dump_data("inputs_mem", inputs_mem, N_SAMPLES, N_X_INPUTS); + dump_data("outputs_mem", outputs_mem, N_SAMPLES, N_Y_OUTPUTS); + dump_data("reference_mem", reference_mem, N_SAMPLES, N_Y_OUTPUTS); +#endif + +#ifdef __DEBUG__ + PRINTF("INFO: SW execution time: %f sec\r\n", sw_elapsed); +#endif + PRINTF("INFO: HW-acceleration exec. time (%d inferences):\r\n", N_SAMPLES); + PRINTF("INFO: - total %f sec\r\n", hw_elapsed); + PRINTF("INFO: - per-inference %.12f sec (%f ns)\r\n", hw_elapsed / (N_SAMPLES), (hw_elapsed*1000.0) / (N_SAMPLES)); + PRINTF("INFO: Cache flush time: %f sec\r\n", cache_elapsed); +#ifdef __DEBUG__ + PRINTF("INFO: HW/SW speedup (the software is fake so this does not count...): %.2f X\r\n", (sw_elapsed >= (hw_elapsed+cache_elapsed))?(sw_elapsed/(hw_elapsed+cache_elapsed)):-((hw_elapsed+cache_elapsed)/sw_elapsed)); +#endif + + hw_errors = 0; +#if 1 + /* Accelerator verification */ + for (int i = 0; i < OUTPUT_N_ELEMENTS; i++) { + if (outputs_mem[i] != reference_mem[i]) { + PRINTF("ERROR: [%d]: Accelerator HW %f != SW %f\r\n", i, outputs_mem[i], reference_mem[i]); + hw_errors++; + } + } + PRINTF("INFO: Total errors = %d (out of %d elements)\r\n", hw_errors, OUTPUT_N_ELEMENTS); + if (hw_errors > 0) + PRINTF("INFO: Verification: FAIL\r\n"); + else + PRINTF("INFO: Verification: PASS!\r\n"); +#else + /* Accelerator validation */ + for (unsigned s = 0; s < N_SAMPLES; s++) { + unsigned ref_digit = get_max(reference_mem + s * N_Y_OUTPUTS, N_Y_OUTPUTS); + unsigned hw_digit = get_max(outputs_mem + s * N_Y_OUTPUTS, N_Y_OUTPUTS); + if (hw_digit != ref_digit) { +#ifdef __DEBUG__ + PRINTF("ERROR: [%d]: Accelerator HW %u != SW %u\r\n", s, hw_digit, ref_digit); +#endif + hw_errors++; + } + } + float error_rate = (hw_errors / (float)(N_SAMPLES)) * 100.0; + float accuracy = 100 - ((hw_errors / (float)(N_SAMPLES)) * 100.0); + PRINTF("INFO: Total errors = %d (out of %d digits)\r\n", hw_errors, N_SAMPLES); + PRINTF("INFO: Error rate = %.2f %%\r\n", error_rate); + PRINTF("INFO: Accuracy = %.2f %%\r\n", accuracy); +#endif + PRINTF("INFO: ==================================================\r\n"); + + cleanup_platform(); + + return 0; +} + + diff --git a/hls4ml/templates/vivado_accelerator/pynq-z2/c_drivers/sdk/setup.tcl b/hls4ml/templates/vivado_accelerator/pynq-z2/c_drivers/sdk/setup.tcl new file mode 100644 index 0000000000..5e9e92d501 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/pynq-z2/c_drivers/sdk/setup.tcl @@ -0,0 +1,14 @@ +# See +# https://www.xilinx.com/html_docs/xilinx2019_1/SDK_Doc/xsct/intro/xsct_introduction.html + +setws . +if { $::argc == 1 } { + set myproject [lindex $::argv 0] + createhw -name ${myproject}\_platform -hwspec ../hdf/${myproject}\_wrapper.hdf + createapp -name ${myproject}\_standalone -app {Hello World} -proc ps7_cortexa9_0 -hwproject ${myproject}\_platform -os standalone + configapp -app ${myproject}\_standalone build-config release + configapp -app ${myproject}\_standalone -add linker-misc {-Wl,--defsym=_HEAP_SIZE=0x1000000} + configapp -app ${myproject}\_standalone -add linker-misc {-Wl,--defsym=_STACK_SIZE=0x40000} + projects -build + #configapp -app ${myproject}\_standalone -add define-compiler-symbols {FLAG=VALUE} +} From 2e069aea4da0aec1cafa0e4651e99374b3044fcc Mon Sep 17 00:00:00 2001 From: Jules Muhizi Date: Wed, 26 Jan 2022 22:21:41 +0000 Subject: [PATCH 070/102] remove uncessary _add_supported_quantized_objects call --- hls4ml/converters/__init__.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/hls4ml/converters/__init__.py b/hls4ml/converters/__init__.py index 5a81c21c90..1ecf4b37f1 100644 --- a/hls4ml/converters/__init__.py +++ b/hls4ml/converters/__init__.py @@ -85,12 +85,9 @@ def parse_yaml_config(config_file): """ def construct_keras_model(loader, node): from tensorflow.keras.models import load_model - from qkeras.utils import _add_supported_quantized_objects - co = {} - _add_supported_quantized_objects(co) model_str = loader.construct_scalar(node) - return load_model(model_str, custom_objects=co) + return load_model(model_str) yaml.add_constructor(u'!keras_model', construct_keras_model, Loader=yaml.SafeLoader) From 15eb2878eedde8ec52d2cc91aab3e820db0b34a0 Mon Sep 17 00:00:00 2001 From: Giuseppe Di Guglielmo Date: Tue, 8 Feb 2022 17:51:07 -0800 Subject: [PATCH 071/102] Add scripts and application for ARTY-A7 with VivadoAccelerator backend --- hls4ml/templates/supported_boards.json | 6 + .../arty-a7-100t/c_drivers/sdk/Makefile | 33 +++ .../arty-a7-100t/c_drivers/sdk/common/main.c | 262 ++++++++++++++++++ .../arty-a7-100t/c_drivers/sdk/setup.tcl | 14 + .../tcl_scripts/axi_master_design.tcl | 126 +++++++++ 5 files changed, 441 insertions(+) create mode 100644 hls4ml/templates/vivado_accelerator/arty-a7-100t/c_drivers/sdk/Makefile create mode 100644 hls4ml/templates/vivado_accelerator/arty-a7-100t/c_drivers/sdk/common/main.c create mode 100644 hls4ml/templates/vivado_accelerator/arty-a7-100t/c_drivers/sdk/setup.tcl create mode 100644 hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl diff --git a/hls4ml/templates/supported_boards.json b/hls4ml/templates/supported_boards.json index a6973f7266..8f45dbad27 100644 --- a/hls4ml/templates/supported_boards.json +++ b/hls4ml/templates/supported_boards.json @@ -22,5 +22,11 @@ "tcl_scripts": {"axi_lite": "axi_lite_design.tcl", "axi_stream": "axi_stream_design.tcl", "axi_master": "axi_master_design.tcl"}, "python_drivers": {"axi_stream": "axi_stream_driver.py"}, "c_drivers": { "axi_master": "axi_master_design.c"} + }, + "arty-a7-100t": { + "part": "xc7a100tcsg324-1", + "tcl_scripts": {"axi_master": "axi_master_design.tcl"}, + "python_drivers": {}, + "c_drivers": { "axi_master": "axi_master_design.c"} } } diff --git a/hls4ml/templates/vivado_accelerator/arty-a7-100t/c_drivers/sdk/Makefile b/hls4ml/templates/vivado_accelerator/arty-a7-100t/c_drivers/sdk/Makefile new file mode 100644 index 0000000000..03ab9b8de7 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/arty-a7-100t/c_drivers/sdk/Makefile @@ -0,0 +1,33 @@ +DESIGN := design_1 + +help: + @echo "INFO: make to show targets" +.PHONY: help + +--setup: + xsct ./setup.tcl $(DESIGN) +.PHONY: --setup + +sdk: --setup + rm -f $(DESIGN)_standalone/src/helloworld.c + cd $(DESIGN)_standalone/src && ln -s ../../common/main.c main.c + cd $(DESIGN)_standalone/src && ln -s ../../common/data.h data.h +.PHONY: sdk + +gui: + xsdk --workspace . & +.PHONY: gui + +clean: + rm -rf $(DESIGN)_platform + rm -rf $(DESIGN)_standalone + rm -rf $(DESIGN)_standalone_bsp + rm -rf RemoteSystemsTempFiles + rm -rf .Xil + rm -rf .metadata + rm -f *.log +.PHONY: clean + +ultraclean: clean + rm -rf hdf/*.hdf +.PHONY: ultraclean diff --git a/hls4ml/templates/vivado_accelerator/arty-a7-100t/c_drivers/sdk/common/main.c b/hls4ml/templates/vivado_accelerator/arty-a7-100t/c_drivers/sdk/common/main.c new file mode 100644 index 0000000000..7dd2be22a8 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/arty-a7-100t/c_drivers/sdk/common/main.c @@ -0,0 +1,262 @@ +/** + * + * Set Heap Size in ldscript.ld to 0x1000000 (16MB) + * + */ + +#include "xmyproject_axi.h" /* TODO: design-dependent name */ +#include "stdio.h" /* PRINTF */ +#include "unistd.h" /* sleep */ +#include "stdlib.h" +#include "malloc.h" +#include "assert.h" +#include "xil_io.h" /* peripheral read/write wrappers */ +#include "xtime_l.h" /* to measure performance of the system */ +#include "platform.h" /* platform init/cleanup functions */ +#include "xil_cache.h" /* enable/disable caches etc */ +#include "xil_printf.h" /* UART debug print functions */ +#include "xparameters.h" /* peripherals base addresses */ + +#include "data.h" + +//#define __DEBUG__ + +#define MAX_PRINT_ELEMENTS (16) + +#define PRINTF printf + +const unsigned INPUT_N_ELEMENTS = N_SAMPLES * N_X_INPUTS; +const unsigned OUTPUT_N_ELEMENTS = N_SAMPLES * N_Y_OUTPUTS; + +#if 1 +/* Accelerator verification */ +#define REFERENCE_OUTPUTS data_y_hls_outputs +#else +/* Accelerator validation */ +#define REFERENCE_OUTPUTS data_y_outputs +//#define REFERENCE_OUTPUTS data_y_keras_outputs +#endif + +unsigned get_max(float *data, unsigned n_elements) { + float max_value = 0.0; + unsigned max_index = 0; + for (unsigned i = 0; i < n_elements; i++) + if (data[i] >= max_value) { + max_index = i; + max_value = data[i]; + } + return max_index; +} + +float *inputs_mem = NULL; +float *outputs_mem = NULL; +float *reference_mem = NULL; + +/* Accelerator configuration */ +XMyproject_axi accelerator; /* TODO: design-dependent name */ +XMyproject_axi_Config *accelerator_cfg; /* TODO: design-dependent name */ + +/* Accelerator initialization routine */ +void init_accelerators() { + PRINTF("INFO: Initializing accelerator\r\n"); + accelerator_cfg = XMyproject_axi_LookupConfig(XPAR_MYPROJECT_AXI_0_DEVICE_ID); /* TODO: design-dependent name */ + if (accelerator_cfg) { + int status = XMyproject_axi_CfgInitialize(&accelerator, accelerator_cfg); /* TODO: design-dependent name */ + if (status != XST_SUCCESS) { + PRINTF("ERROR: Initializing accelerator\r\n"); + } + } +} + +/* Reference implementation of the accelerator in software */ +int sw_reference_implementation(float *sw_inputs_mem, float *sw_outputs_mem, unsigned n_samples, unsigned n_X_inputs, unsigned n_y_ouputs) { +#ifdef __DEBUG__ + PRINTF("INFO: Reference outputs are pre-compiled. It would be nice to run a software model here.\r\n"); +#endif + /* See data.h for inputs and outputs */ + for (unsigned i = 0; i < n_samples * n_y_ouputs; i++) { + sw_outputs_mem[i] = REFERENCE_OUTPUTS[i]; + } + return 0; +} + +/* Profiling function */ +double get_elapsed_time(XTime start, XTime stop) { + return 1.0 * (stop - start) / (COUNTS_PER_SECOND); +} + +/* Dump data to the console */ +void dump_data(const char* label, float* data, unsigned n_samples, unsigned feature_count) { + PRINTF("INFO: %s[%u][%u]:\r\n", label, n_samples, feature_count); + /* Print at most MAX_PRINT_ELEMENTS */ + for (unsigned i = 0; i < n_samples && i < MAX_PRINT_ELEMENTS; i++) { + PRINTF("INFO: [%u] ", i); + for (unsigned j = 0; j < feature_count; j++) { + unsigned index = i * feature_count + j; + PRINTF("%f ", data[index]); + } + PRINTF("\r\n"); + } +} + +/* The top of the hill :-) */ +int main(int argc, char** argv) { + + XTime start, stop; + double calibration_time; + double sw_elapsed = 0; + double hw_elapsed = 0; + double cache_elapsed = 0; + unsigned hw_errors; + + char __attribute__ ((unused)) dummy; /* dummy input */ + + /* Initialize platform (uart and caches) */ + init_platform(); + + PRINTF("\r\n"); + PRINTF("INFO: ==================================================\r\n"); + PRINTF("INFO: XMyproject_axi (w/ polling)\r\n"); /* TODO: design-dependent name */ + PRINTF("INFO: ==================================================\r\n"); + + init_accelerators(); + + inputs_mem = malloc(INPUT_N_ELEMENTS * sizeof(float)); + outputs_mem = malloc(OUTPUT_N_ELEMENTS * sizeof(float)); + reference_mem = malloc(OUTPUT_N_ELEMENTS * sizeof(float)); + + /* Calibration */ + XTime_GetTime(&start); + sleep(1); + XTime_GetTime(&stop); + calibration_time = get_elapsed_time(start, stop); + PRINTF("INFO: Time calibration for one second (%lf sec)\r\n", calibration_time); + + /* Initialize memory */ + PRINTF("INFO: Initialize memory\r\n"); + PRINTF("INFO: - Samples count: %u\r\n", N_SAMPLES); /* Same as dst_SAMPLE_COUNT */ + PRINTF("INFO: - Inputs count: %u\r\n", N_X_INPUTS); + PRINTF("INFO: - Outputs count: %u\r\n", N_Y_OUTPUTS); + PRINTF("INFO: - Data size: %u B\r\n", sizeof(float)); + PRINTF("INFO: - Total input size: %u B, %.2f KB, %.2f MB\r\n", N_X_INPUTS * N_SAMPLES * sizeof(float), (N_X_INPUTS * N_SAMPLES * sizeof(float)) / (float)1024, (N_X_INPUTS * N_SAMPLES * sizeof(float)) / (float)(1024*1024)); + PRINTF("INFO: - Total output size: %u B, %.2f KB, %.2f MB\r\n", N_Y_OUTPUTS * N_SAMPLES * sizeof(float), (N_Y_OUTPUTS * N_SAMPLES * sizeof(float)) / (float)1024, (N_Y_OUTPUTS * N_SAMPLES * sizeof(float)) / (float)(1024*1024)); + + // Set Heap Size in ldscript.ld to 0x1000000 (16MB) + //malloc_stats(); + + for (int i = 0; i < INPUT_N_ELEMENTS; i++) { + inputs_mem[i] = data_X_inputs[i]; + } + for (int i = 0; i < OUTPUT_N_ELEMENTS; i++) { + outputs_mem[i] = 0x0; + } + + /* ****** SW REFERENCE ****** */ + PRINTF("INFO: ==================================================\r\n"); + PRINTF("INFO: Start SW reference implementation\r\n"); + XTime_GetTime(&start); + sw_reference_implementation(inputs_mem, reference_mem, N_SAMPLES, N_X_INPUTS, N_Y_OUTPUTS); + XTime_GetTime(&stop); + sw_elapsed = get_elapsed_time(start, stop); + PRINTF("INFO: ==================================================\r\n"); + PRINTF("INFO: Press any key to start:\r\n"); + dummy = inbyte(); + //PRINTF("INFO:"); + + /* ****** HW ACCELERATOR ****** */ + PRINTF("INFO: Start HW accelerator\r\n"); + + XTime_GetTime(&start); + Xil_DCacheFlushRange((UINTPTR)inputs_mem, INPUT_N_ELEMENTS * sizeof(float)); + Xil_DCacheFlushRange((UINTPTR)outputs_mem, OUTPUT_N_ELEMENTS * sizeof(float)); + Xil_DCacheFlushRange((UINTPTR)reference_mem, OUTPUT_N_ELEMENTS * sizeof(float)); + XTime_GetTime(&stop); + cache_elapsed = get_elapsed_time(start, stop); + + for (unsigned j = 0; j < N_SAMPLES; j++) { + float *inputs_mem_i = inputs_mem + j * N_X_INPUTS; + float *outputs_mem_i = outputs_mem + j * N_Y_OUTPUTS; + + /* Configure the accelerator */ + XTime_GetTime(&start); + XMyproject_axi_Set_in_r(&accelerator, (unsigned)inputs_mem_i); /* TODO: design-dependent name */ + XMyproject_axi_Set_out_r(&accelerator, (unsigned)outputs_mem_i); /* TODO: design-dependent name */ + + XMyproject_axi_Start(&accelerator); /* TODO: design-dependent name */ + + /* Polling */ + while (!XMyproject_axi_IsDone(&accelerator)); /* TODO: design-dependent name */ + + /* Get error status */ + //hw_flags = XMyproject_axi_Get_return(&accelerator); /* TODO: design-dependent name */ + XTime_GetTime(&stop); + hw_elapsed += get_elapsed_time(start, stop); + } + + XTime_GetTime(&start); + Xil_DCacheFlushRange((UINTPTR)outputs_mem, OUTPUT_N_ELEMENTS * sizeof(float)); + XTime_GetTime(&stop); + cache_elapsed += get_elapsed_time(start, stop); + + PRINTF("INFO: HW accelerator done!\r\n"); + + /* ****** VALIDATION ****** */ + PRINTF("INFO: ================== Verification ==================\r\n"); +#ifdef __DEBUG__ + PRINTF("INFO: Dump data\r\n"); + dump_data("inputs_mem", inputs_mem, N_SAMPLES, N_X_INPUTS); + dump_data("outputs_mem", outputs_mem, N_SAMPLES, N_Y_OUTPUTS); + dump_data("reference_mem", reference_mem, N_SAMPLES, N_Y_OUTPUTS); +#endif + +#ifdef __DEBUG__ + PRINTF("INFO: SW execution time: %f sec\r\n", sw_elapsed); +#endif + PRINTF("INFO: HW-acceleration exec. time (%d inferences):\r\n", N_SAMPLES); + PRINTF("INFO: - total %f sec\r\n", hw_elapsed); + PRINTF("INFO: - per-inference %.12f sec (%f ns)\r\n", hw_elapsed / (N_SAMPLES), (hw_elapsed*1000.0) / (N_SAMPLES)); + PRINTF("INFO: Cache flush time: %f sec\r\n", cache_elapsed); +#ifdef __DEBUG__ + PRINTF("INFO: HW/SW speedup (the software is fake so this does not count...): %.2f X\r\n", (sw_elapsed >= (hw_elapsed+cache_elapsed))?(sw_elapsed/(hw_elapsed+cache_elapsed)):-((hw_elapsed+cache_elapsed)/sw_elapsed)); +#endif + + hw_errors = 0; +#if 1 + /* Accelerator verification */ + for (int i = 0; i < OUTPUT_N_ELEMENTS; i++) { + if (outputs_mem[i] != reference_mem[i]) { + PRINTF("ERROR: [%d]: Accelerator HW %f != SW %f\r\n", i, outputs_mem[i], reference_mem[i]); + hw_errors++; + } + } + PRINTF("INFO: Total errors = %d (out of %d elements)\r\n", hw_errors, OUTPUT_N_ELEMENTS); + if (hw_errors > 0) + PRINTF("INFO: Verification: FAIL\r\n"); + else + PRINTF("INFO: Verification: PASS!\r\n"); +#else + /* Accelerator validation */ + for (unsigned s = 0; s < N_SAMPLES; s++) { + unsigned ref_digit = get_max(reference_mem + s * N_Y_OUTPUTS, N_Y_OUTPUTS); + unsigned hw_digit = get_max(outputs_mem + s * N_Y_OUTPUTS, N_Y_OUTPUTS); + if (hw_digit != ref_digit) { +#ifdef __DEBUG__ + PRINTF("ERROR: [%d]: Accelerator HW %u != SW %u\r\n", s, hw_digit, ref_digit); +#endif + hw_errors++; + } + } + float error_rate = (hw_errors / (float)(N_SAMPLES)) * 100.0; + float accuracy = 100 - ((hw_errors / (float)(N_SAMPLES)) * 100.0); + PRINTF("INFO: Total errors = %d (out of %d digits)\r\n", hw_errors, N_SAMPLES); + PRINTF("INFO: Error rate = %.2f %%\r\n", error_rate); + PRINTF("INFO: Accuracy = %.2f %%\r\n", accuracy); +#endif + PRINTF("INFO: ==================================================\r\n"); + + cleanup_platform(); + + return 0; +} + + diff --git a/hls4ml/templates/vivado_accelerator/arty-a7-100t/c_drivers/sdk/setup.tcl b/hls4ml/templates/vivado_accelerator/arty-a7-100t/c_drivers/sdk/setup.tcl new file mode 100644 index 0000000000..383bf39cf7 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/arty-a7-100t/c_drivers/sdk/setup.tcl @@ -0,0 +1,14 @@ +# See +# https://www.xilinx.com/html_docs/xilinx2019_1/SDK_Doc/xsct/intro/xsct_introduction.html + +setws . +if { $::argc == 1 } { + set myproject [lindex $::argv 0] + createhw -name ${myproject}\_platform -hwspec ../hdf/${myproject}\_wrapper.hdf + createapp -name ${myproject}\_standalone -app {Hello World} -proc microblaze_mcu -hwproject ${myproject}\_platform -os standalone + configapp -app ${myproject}\_standalone build-config release + #configapp -app ${myproject}\_standalone -add linker-misc {-Wl,--defsym=_HEAP_SIZE=0x1000000} + #configapp -app ${myproject}\_standalone -add linker-misc {-Wl,--defsym=_STACK_SIZE=0x40000} + projects -build + #configapp -app ${myproject}\_standalone -add define-compiler-symbols {FLAG=VALUE} +} diff --git a/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl b/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl new file mode 100644 index 0000000000..9fa0b43d72 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl @@ -0,0 +1,126 @@ +set tcldir [file dirname [info script]] +source [file join $tcldir project.tcl] + +# Project names +set project_name "project_1" +set design_name "design_1" +set hls_solution_name "solution1" +set acc_name "${myproject}_axi" +set part_name "xc7a100tcsg324-1" +set board_name "digilentinc.com:arty-a7-100:part0:1.0" + +# Set board and chip part names +create_project ${project_name} ${myproject}_vivado_accelerator -part ${part_name} -force +set_property board_part ${board_name} [current_project] + +# Create block design +create_bd_design ${design_name} + +# Setup IP repo +#set_property ip_repo_paths ${myproject}_prj [current_project] +set_property ip_repo_paths ${myproject}_prj/${hls_solution_name}/impl/ip [current_project] +update_ip_catalog + +# Create clock wizard +create_bd_cell -type ip -vlnv xilinx.com:ip:clk_wiz:6.0 clk_wiz_0 +apply_board_connection -board_interface "sys_clock" -ip_intf "clk_wiz_0/clock_CLK_IN1" -diagram ${design_name} +set_property name clk_wizard [get_bd_cells clk_wiz_0] +set_property -dict [list CONFIG.CLKOUT2_USED {true} CONFIG.CLKOUT1_REQUESTED_OUT_FREQ {166.667} CONFIG.CLKOUT2_REQUESTED_OUT_FREQ {200.00} CONFIG.MMCM_CLKOUT0_DIVIDE_F {6.000} CONFIG.MMCM_CLKOUT1_DIVIDE {5} CONFIG.NUM_OUT_CLKS {2} CONFIG.CLKOUT1_JITTER {118.758} CONFIG.CLKOUT2_JITTER {114.829} CONFIG.CLKOUT2_PHASE_ERROR {98.575}] [get_bd_cells clk_wizard] +#set_property -dict [list CONFIG.RESET_TYPE {ACTIVE_LOW} CONFIG.RESET_PORT {resetn}] [get_bd_cells clk_wizard] + +# Create MIG +create_bd_cell -type ip -vlnv xilinx.com:ip:mig_7series:4.2 mig_7series_0 +apply_board_connection -board_interface "ddr3_sdram" -ip_intf "mig_7series_0/mig_ddr_interface" -diagram ${design_name} + +# Wire MIG and clock wizard +delete_bd_objs [get_bd_nets clk_ref_i_1] [get_bd_ports clk_ref_i] +delete_bd_objs [get_bd_nets sys_clk_i_1] [get_bd_ports sys_clk_i] +connect_bd_net [get_bd_pins clk_wizard/clk_out2] [get_bd_pins mig_7series_0/clk_ref_i] +connect_bd_net [get_bd_pins clk_wizard/clk_out1] [get_bd_pins mig_7series_0/sys_clk_i] + +# Setup reset +#set_property -dict [list CONFIG.RESET_BOARD_INTERFACE {reset}] [get_bd_cells clk_wizard] +apply_bd_automation -rule xilinx.com:bd_rule:board -config { Board_Interface {reset ( System Reset ) } Manual_Source {New External Port (ACTIVE_LOW)}} [get_bd_pins mig_7series_0/sys_rst] + +# Create instance of MicroBlaze +create_bd_cell -type ip -vlnv xilinx.com:ip:microblaze:11.0 microblaze_mcu +apply_bd_automation -rule xilinx.com:bd_rule:microblaze -config { \ + axi_intc {0} \ + axi_periph {Enabled} \ + cache {16KB} \ + clk {/mig_7series_0/ui_clk (83 MHz)} \ + debug_module {Debug Only} \ + ecc {None} \ + local_mem {128KB} \ + preset {None} } [get_bd_cells microblaze_mcu] + +# Enable full FPU +set_property -dict [list CONFIG.C_USE_FPU {2}] [get_bd_cells microblaze_mcu] + +# Create UART-lite interface +#create_bd_cell -type ip -vlnv xilinx.com:ip:axi_uartlite:2.0 axi_uart +#apply_board_connection -board_interface "usb_uart" -ip_intf "axi_uart/UART" -diagram ${design_name} +#set_property -dict [list CONFIG.C_BAUDRATE {115200}] [get_bd_cells axi_uart] + +# Create UART interface +create_bd_cell -type ip -vlnv xilinx.com:ip:axi_uart16550:2.0 axi_uart +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { Clk_master {/mig_7series_0/ui_clk (83 MHz)} Clk_slave {Auto} Clk_xbar {Auto} Master {/microblaze_mcu (Periph)} Slave {/axi_uart/S_AXI} intc_ip {New AXI Interconnect} master_apm {0}} [get_bd_intf_pins axi_uart/S_AXI] +apply_bd_automation -rule xilinx.com:bd_rule:board -config { Board_Interface {usb_uart ( USB UART ) } Manual_Source {Auto}} [get_bd_intf_pins axi_uart/UART] + +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { \ + Clk_master {/mig_7series_0/ui_clk (83 MHz)} \ + Clk_slave {/mig_7series_0/ui_clk (83 MHz)} \ + Clk_xbar {/mig_7series_0/ui_clk (83 MHz)} \ + Master {/microblaze_mcu (Cached)} \ + Slave {/mig_7series_0/S_AXI} \ + intc_ip {Auto} master_apm {0} } [get_bd_intf_pins mig_7series_0/S_AXI] + +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { \ + Clk_master {/mig_7series_0/ui_clk (83 MHz)} \ + Clk_slave {Auto} \ + Clk_xbar {Auto} \ + Master {/microblaze_mcu (Periph)} \ + Slave {/axi_uart/S_AXI} \ + intc_ip {New AXI Interconnect} \ + master_apm {0} } [get_bd_intf_pins axi_uart/S_AXI] + +# Add accelerator and connect s-axi interface +create_bd_cell -type ip -vlnv xilinx.com:hls:${acc_name}:1.0 ${acc_name} +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { Clk_master {/mig_7series_0/ui_clk (83 MHz)} Clk_slave {Auto} Clk_xbar {/mig_7series_0/ui_clk (83 MHz)} Master {/microblaze_mcu (Periph)} Slave {/${acc_name}/s_axi_CTRL_BUS} intc_ip {/microblaze_mcu_axi_periph} master_apm {0}} [get_bd_intf_pins ${acc_name}/s_axi_CTRL_BUS] + +# Connect m-axi interfaces +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { Clk_master {/mig_7series_0/ui_clk (83 MHz)} Clk_slave {/mig_7series_0/ui_clk (83 MHz)} Clk_xbar {/mig_7series_0/ui_clk (83 MHz)} Master {/${acc_name}/m_axi_IN_BUS} Slave {/mig_7series_0/S_AXI} intc_ip {/axi_smc} master_apm {0}} [get_bd_intf_pins ${acc_name}/m_axi_IN_BUS] +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { Clk_master {/mig_7series_0/ui_clk (83 MHz)} Clk_slave {/mig_7series_0/ui_clk (83 MHz)} Clk_xbar {/mig_7series_0/ui_clk (83 MHz)} Master {/${acc_name}/m_axi_OUT_BUS} Slave {/mig_7series_0/S_AXI} intc_ip {/axi_smc} master_apm {0}} [get_bd_intf_pins ${acc_name}/m_axi_OUT_BUS] + +# Reset +apply_bd_automation -rule xilinx.com:bd_rule:board -config { Board_Interface {reset ( System Reset ) } Manual_Source {Auto}} [get_bd_pins clk_wizard/reset] + +# Add timer +create_bd_cell -type ip -vlnv xilinx.com:ip:axi_timer:2.0 axi_timer_mcu + +# Wire timer +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { Clk_master {/mig_7series_0/ui_clk (83 MHz)} Clk_slave {Auto} Clk_xbar {/mig_7series_0/ui_clk (83 MHz)} Master {/microblaze_mcu (Periph)} Slave {/axi_timer_mcu/S_AXI} intc_ip {/microblaze_mcu_axi_periph} master_apm {0}} [get_bd_intf_pins axi_timer_mcu/S_AXI] + +# Validate the design block we created +validate_bd_design + +# Save design +save_bd_design + +# Top level wrapper +make_wrapper -files [get_files ./${myproject}_vivado_accelerator/${project_name}.srcs/sources_1/bd/${design_name}/${design_name}.bd] -top +add_files -norecurse ./${myproject}_vivado_accelerator/${project_name}.srcs/sources_1/bd/${design_name}/hdl/${design_name}_wrapper.v + +# Run synthesis and implementation +reset_run impl_1 +reset_run synth_1 +launch_runs impl_1 -to_step write_bitstream -jobs 6 +wait_on_run -timeout 360 impl_1 + +# Reporting +open_run impl_1 +report_utilization -file util.rpt -hierarchical -hierarchical_percentages + +# Export HDF file for SDK flow +file mkdir ./hdf +file copy -force ${myproject}_vivado_accelerator/${project_name}.runs/impl_1/${design_name}_wrapper.sysdef ./hdf/${design_name}_wrapper.hdf From cb7fc4422d19d29ea76ea97880f46ce5cd4da860 Mon Sep 17 00:00:00 2001 From: Giuseppe Di Guglielmo Date: Tue, 8 Feb 2022 17:53:44 -0800 Subject: [PATCH 072/102] Cleanup timers code for ARTY-A7 --- .../arty-a7-100t/c_drivers/sdk/common/main.c | 162 +++++++++++------- 1 file changed, 103 insertions(+), 59 deletions(-) diff --git a/hls4ml/templates/vivado_accelerator/arty-a7-100t/c_drivers/sdk/common/main.c b/hls4ml/templates/vivado_accelerator/arty-a7-100t/c_drivers/sdk/common/main.c index 7dd2be22a8..61f8c262ab 100644 --- a/hls4ml/templates/vivado_accelerator/arty-a7-100t/c_drivers/sdk/common/main.c +++ b/hls4ml/templates/vivado_accelerator/arty-a7-100t/c_drivers/sdk/common/main.c @@ -11,11 +11,11 @@ #include "malloc.h" #include "assert.h" #include "xil_io.h" /* peripheral read/write wrappers */ -#include "xtime_l.h" /* to measure performance of the system */ #include "platform.h" /* platform init/cleanup functions */ #include "xil_cache.h" /* enable/disable caches etc */ #include "xil_printf.h" /* UART debug print functions */ #include "xparameters.h" /* peripherals base addresses */ +#include "xtmrctr.h" /* timer, Xilinx IP Timer Counter */ #include "data.h" @@ -38,14 +38,14 @@ const unsigned OUTPUT_N_ELEMENTS = N_SAMPLES * N_Y_OUTPUTS; #endif unsigned get_max(float *data, unsigned n_elements) { - float max_value = 0.0; - unsigned max_index = 0; - for (unsigned i = 0; i < n_elements; i++) - if (data[i] >= max_value) { - max_index = i; - max_value = data[i]; - } - return max_index; + float max_value = 0.0; + unsigned max_index = 0; + for (unsigned i = 0; i < n_elements; i++) + if (data[i] >= max_value) { + max_index = i; + max_value = data[i]; + } + return max_index; } float *inputs_mem = NULL; @@ -59,7 +59,7 @@ XMyproject_axi_Config *accelerator_cfg; /* TODO: design-dependent name */ /* Accelerator initialization routine */ void init_accelerators() { PRINTF("INFO: Initializing accelerator\r\n"); - accelerator_cfg = XMyproject_axi_LookupConfig(XPAR_MYPROJECT_AXI_0_DEVICE_ID); /* TODO: design-dependent name */ + accelerator_cfg = XMyproject_axi_LookupConfig(XPAR_MYPROJECT_AXI_DEVICE_ID); /* TODO: design-dependent name */ if (accelerator_cfg) { int status = XMyproject_axi_CfgInitialize(&accelerator, accelerator_cfg); /* TODO: design-dependent name */ if (status != XST_SUCCESS) { @@ -71,29 +71,60 @@ void init_accelerators() { /* Reference implementation of the accelerator in software */ int sw_reference_implementation(float *sw_inputs_mem, float *sw_outputs_mem, unsigned n_samples, unsigned n_X_inputs, unsigned n_y_ouputs) { #ifdef __DEBUG__ - PRINTF("INFO: Reference outputs are pre-compiled. It would be nice to run a software model here.\r\n"); + PRINTF("INFO: Reference outputs are pre-compiled. It would be nice to run a software model here.\r\n"); #endif /* See data.h for inputs and outputs */ for (unsigned i = 0; i < n_samples * n_y_ouputs; i++) { - sw_outputs_mem[i] = REFERENCE_OUTPUTS[i]; + sw_outputs_mem[i] = REFERENCE_OUTPUTS[i]; } return 0; } -/* Profiling function */ -double get_elapsed_time(XTime start, XTime stop) { - return 1.0 * (stop - start) / (COUNTS_PER_SECOND); +/* Profiling utilities */ +static XTmrCtr TimerCounterInst; +#define TMRCTR_DEVICE_ID XPAR_TMRCTR_0_DEVICE_ID +#define TIMER_CNTR_0 0 +#define TIMER_CNTR_1 1 + +void start_64b_counter() { + XTmrCtr_Start(&TimerCounterInst, TIMER_CNTR_0); + XTmrCtr_Start(&TimerCounterInst, TIMER_CNTR_1); +} + +void stop_64b_counter() { + XTmrCtr_Stop(&TimerCounterInst, TIMER_CNTR_0); + XTmrCtr_Stop(&TimerCounterInst, TIMER_CNTR_1); +} + +u64 get_64b_counter_value() { + //printf("bytes %u\n\r", sizeof(u64)); + u64 lo_counter = XTmrCtr_GetValue(&TimerCounterInst, TIMER_CNTR_0); + u64 hi_counter = XTmrCtr_GetValue(&TimerCounterInst, TIMER_CNTR_1); + u64 counter = (hi_counter << 32) | lo_counter; + //printf("INFO: hi = %lu, lo = %lu, total = %lu\n\r", hi_counter, lo_counter, counter); + return counter; +} + +#if 0 +double get_elapsed_time(u64 clk_start, u64 clk_stop) { + return ((clk_stop-clk_start) * (1.0/XPAR_AXI_TIMER_MCU_CLOCK_FREQ_HZ)); +} +#endif + +float get_elapsed_time_ns(u64 clks) { + return clks * 1000000000.0/XPAR_AXI_TIMER_MCU_CLOCK_FREQ_HZ; } + /* Dump data to the console */ void dump_data(const char* label, float* data, unsigned n_samples, unsigned feature_count) { - PRINTF("INFO: %s[%u][%u]:\r\n", label, n_samples, feature_count); + PRINTF("INFO: %s[%u][%u]:\r\n", label, n_samples, feature_count); /* Print at most MAX_PRINT_ELEMENTS */ for (unsigned i = 0; i < n_samples && i < MAX_PRINT_ELEMENTS; i++) { - PRINTF("INFO: [%u] ", i); + PRINTF("INFO: [%u] ", i); for (unsigned j = 0; j < feature_count; j++) { - unsigned index = i * feature_count + j; - PRINTF("%f ", data[index]); + unsigned index = i * feature_count + j; + PRINTF("%f ", data[index]); } PRINTF("\r\n"); } @@ -102,11 +133,11 @@ void dump_data(const char* label, float* data, unsigned n_samples, unsigned feat /* The top of the hill :-) */ int main(int argc, char** argv) { - XTime start, stop; - double calibration_time; - double sw_elapsed = 0; - double hw_elapsed = 0; - double cache_elapsed = 0; + int status; + u64 calibration_time; + double __attribute__ ((unused)) sw_elapsed = 0; + u64 hw_elapsed = 0; + u64 cache_elapsed = 0; unsigned hw_errors; char __attribute__ ((unused)) dummy; /* dummy input */ @@ -121,16 +152,29 @@ int main(int argc, char** argv) { init_accelerators(); + /* Timer Counter */ + status = XTmrCtr_Initialize(&TimerCounterInst, TMRCTR_DEVICE_ID); + if (status != XST_SUCCESS){ + print("ERROR: Timer counter initialization failed \r\n"); + return status; + } + + XTmrCtr_SetOptions(&TimerCounterInst, TIMER_CNTR_0, + XTC_AUTO_RELOAD_OPTION | + XTC_CASCADE_MODE_OPTION); + + print("INFO: Timer counter initialized\r\n"); + inputs_mem = malloc(INPUT_N_ELEMENTS * sizeof(float)); outputs_mem = malloc(OUTPUT_N_ELEMENTS * sizeof(float)); reference_mem = malloc(OUTPUT_N_ELEMENTS * sizeof(float)); /* Calibration */ - XTime_GetTime(&start); + start_64b_counter(); sleep(1); - XTime_GetTime(&stop); - calibration_time = get_elapsed_time(start, stop); - PRINTF("INFO: Time calibration for one second (%lf sec)\r\n", calibration_time); + stop_64b_counter(); + calibration_time = get_64b_counter_value(); + PRINTF("INFO: Time calibration for one second (%lf sec, %llu clk)\r\n", get_elapsed_time_ns(calibration_time), calibration_time); /* Initialize memory */ PRINTF("INFO: Initialize memory\r\n"); @@ -154,10 +198,10 @@ int main(int argc, char** argv) { /* ****** SW REFERENCE ****** */ PRINTF("INFO: ==================================================\r\n"); PRINTF("INFO: Start SW reference implementation\r\n"); - XTime_GetTime(&start); + start_64b_counter(); sw_reference_implementation(inputs_mem, reference_mem, N_SAMPLES, N_X_INPUTS, N_Y_OUTPUTS); - XTime_GetTime(&stop); - sw_elapsed = get_elapsed_time(start, stop); + stop_64b_counter(); + sw_elapsed = get_64b_counter_value(); PRINTF("INFO: ==================================================\r\n"); PRINTF("INFO: Press any key to start:\r\n"); dummy = inbyte(); @@ -165,38 +209,37 @@ int main(int argc, char** argv) { /* ****** HW ACCELERATOR ****** */ PRINTF("INFO: Start HW accelerator\r\n"); - - XTime_GetTime(&start); + start_64b_counter(); Xil_DCacheFlushRange((UINTPTR)inputs_mem, INPUT_N_ELEMENTS * sizeof(float)); Xil_DCacheFlushRange((UINTPTR)outputs_mem, OUTPUT_N_ELEMENTS * sizeof(float)); Xil_DCacheFlushRange((UINTPTR)reference_mem, OUTPUT_N_ELEMENTS * sizeof(float)); - XTime_GetTime(&stop); - cache_elapsed = get_elapsed_time(start, stop); + stop_64b_counter(); + cache_elapsed = get_64b_counter_value(); for (unsigned j = 0; j < N_SAMPLES; j++) { - float *inputs_mem_i = inputs_mem + j * N_X_INPUTS; - float *outputs_mem_i = outputs_mem + j * N_Y_OUTPUTS; + float *inputs_mem_i = inputs_mem + j * N_X_INPUTS; + float *outputs_mem_i = outputs_mem + j * N_Y_OUTPUTS; - /* Configure the accelerator */ - XTime_GetTime(&start); + /* Configure the accelerator */ + start_64b_counter(); XMyproject_axi_Set_in_r(&accelerator, (unsigned)inputs_mem_i); /* TODO: design-dependent name */ - XMyproject_axi_Set_out_r(&accelerator, (unsigned)outputs_mem_i); /* TODO: design-dependent name */ + XMyproject_axi_Set_out_r(&accelerator, (unsigned)outputs_mem_i); /* TODO: design-dependent name */ - XMyproject_axi_Start(&accelerator); /* TODO: design-dependent name */ + XMyproject_axi_Start(&accelerator); /* TODO: design-dependent name */ - /* Polling */ - while (!XMyproject_axi_IsDone(&accelerator)); /* TODO: design-dependent name */ + /* Polling */ + while (!XMyproject_axi_IsDone(&accelerator)); /* TODO: design-dependent name */ - /* Get error status */ - //hw_flags = XMyproject_axi_Get_return(&accelerator); /* TODO: design-dependent name */ - XTime_GetTime(&stop); - hw_elapsed += get_elapsed_time(start, stop); + /* Get error status */ + //hw_flags = XMyproject_axi_Get_return(&accelerator); /* TODO: design-dependent name */ + stop_64b_counter(); + hw_elapsed += get_64b_counter_value(); } - XTime_GetTime(&start); + start_64b_counter(); Xil_DCacheFlushRange((UINTPTR)outputs_mem, OUTPUT_N_ELEMENTS * sizeof(float)); - XTime_GetTime(&stop); - cache_elapsed += get_elapsed_time(start, stop); + stop_64b_counter(); + cache_elapsed += get_64b_counter_value(); PRINTF("INFO: HW accelerator done!\r\n"); @@ -213,9 +256,9 @@ int main(int argc, char** argv) { PRINTF("INFO: SW execution time: %f sec\r\n", sw_elapsed); #endif PRINTF("INFO: HW-acceleration exec. time (%d inferences):\r\n", N_SAMPLES); - PRINTF("INFO: - total %f sec\r\n", hw_elapsed); - PRINTF("INFO: - per-inference %.12f sec (%f ns)\r\n", hw_elapsed / (N_SAMPLES), (hw_elapsed*1000.0) / (N_SAMPLES)); - PRINTF("INFO: Cache flush time: %f sec\r\n", cache_elapsed); + PRINTF("INFO: - total %f sec\r\n", get_elapsed_time_ns(hw_elapsed)); + PRINTF("INFO: - per-inference %.12f sec (%f ns)\r\n", get_elapsed_time_ns(hw_elapsed) / (N_SAMPLES), (get_elapsed_time_ns(hw_elapsed)*1000.0) / (N_SAMPLES)); + PRINTF("INFO: Cache flush time: %f sec\r\n", get_elapsed_time_ns(cache_elapsed)); #ifdef __DEBUG__ PRINTF("INFO: HW/SW speedup (the software is fake so this does not count...): %.2f X\r\n", (sw_elapsed >= (hw_elapsed+cache_elapsed))?(sw_elapsed/(hw_elapsed+cache_elapsed)):-((hw_elapsed+cache_elapsed)/sw_elapsed)); #endif @@ -237,14 +280,14 @@ int main(int argc, char** argv) { #else /* Accelerator validation */ for (unsigned s = 0; s < N_SAMPLES; s++) { - unsigned ref_digit = get_max(reference_mem + s * N_Y_OUTPUTS, N_Y_OUTPUTS); - unsigned hw_digit = get_max(outputs_mem + s * N_Y_OUTPUTS, N_Y_OUTPUTS); - if (hw_digit != ref_digit) { + unsigned ref_digit = get_max(reference_mem + s * N_Y_OUTPUTS, N_Y_OUTPUTS); + unsigned hw_digit = get_max(outputs_mem + s * N_Y_OUTPUTS, N_Y_OUTPUTS); + if (hw_digit != ref_digit) { #ifdef __DEBUG__ - PRINTF("ERROR: [%d]: Accelerator HW %u != SW %u\r\n", s, hw_digit, ref_digit); + PRINTF("ERROR: [%d]: Accelerator HW %u != SW %u\r\n", s, hw_digit, ref_digit); #endif - hw_errors++; - } + hw_errors++; + } } float error_rate = (hw_errors / (float)(N_SAMPLES)) * 100.0; float accuracy = 100 - ((hw_errors / (float)(N_SAMPLES)) * 100.0); @@ -252,6 +295,7 @@ int main(int argc, char** argv) { PRINTF("INFO: Error rate = %.2f %%\r\n", error_rate); PRINTF("INFO: Accuracy = %.2f %%\r\n", accuracy); #endif + PRINTF("INFO: ==================================================\r\n"); cleanup_platform(); From 361628dd52531b17040cbeba746953ba7296223e Mon Sep 17 00:00:00 2001 From: Giuseppe Di Guglielmo Date: Tue, 15 Feb 2022 19:04:48 -0800 Subject: [PATCH 073/102] Integration of features for EEMBC power analysis. For ARTY-A7 100T only. - disable UART over USB and use UART over Pmod A (pin 2 TX, pin 3 RX -- from the breakboard perspective) - add AXI GPIO controlled pin on Pmod D (pin 3) - enable QSPI IPs Attention: QSPI programming is not scripted, please follow the instructions at: https://digilent.com/reference/learn/programmable-logic/tutorials/htsspisf/start#sdk_steps_to_create_a_bootloader_and_program_the_board --- .../arty-a7-100t/c_drivers/sdk/common/main.c | 45 ++++ .../tcl_scripts/axi_master_design.tcl | 74 ++++++- .../verilog_wrappers/design_1_wrapper.v | 197 ++++++++++++++++++ .../arty-a7-100t/xdc_constraints/pin_pmod.xdc | 4 + .../arty-a7-100t/xdc_constraints/qspi.xdc | 13 ++ .../xdc_constraints/uart_pmod.xdc | 8 + hls4ml/templates/vivado_accelerator_config.py | 12 +- hls4ml/writer/vivado_accelerator_writer.py | 7 + 8 files changed, 348 insertions(+), 12 deletions(-) create mode 100644 hls4ml/templates/vivado_accelerator/arty-a7-100t/verilog_wrappers/design_1_wrapper.v create mode 100644 hls4ml/templates/vivado_accelerator/arty-a7-100t/xdc_constraints/pin_pmod.xdc create mode 100644 hls4ml/templates/vivado_accelerator/arty-a7-100t/xdc_constraints/qspi.xdc create mode 100644 hls4ml/templates/vivado_accelerator/arty-a7-100t/xdc_constraints/uart_pmod.xdc diff --git a/hls4ml/templates/vivado_accelerator/arty-a7-100t/c_drivers/sdk/common/main.c b/hls4ml/templates/vivado_accelerator/arty-a7-100t/c_drivers/sdk/common/main.c index 61f8c262ab..41f5dca282 100644 --- a/hls4ml/templates/vivado_accelerator/arty-a7-100t/c_drivers/sdk/common/main.c +++ b/hls4ml/templates/vivado_accelerator/arty-a7-100t/c_drivers/sdk/common/main.c @@ -19,6 +19,24 @@ #include "data.h" +#define EEMBC_POWER 1 + +#ifdef EEMBC_POWER +#include "xgpio.h" /* AXI GPIO drivers */ + +#define PIN 0x01 +#define GPIO_PMOD_PIN_DEVICE_ID XPAR_GPIO_0_DEVICE_ID + +#define set_pin_high(InstancePtr, Mask) \ + XGpio_DiscreteWrite(InstancePtr, 1, Mask) + +#define set_pin_low(InstancePtr, Mask) \ + XGpio_DiscreteClear(InstancePtr, 1, Mask) + +XGpio Gpio; +#endif + + //#define __DEBUG__ #define MAX_PRINT_ELEMENTS (16) @@ -298,6 +316,33 @@ int main(int argc, char** argv) { PRINTF("INFO: ==================================================\r\n"); + +#ifdef EEMBC_POWER + /* Initialize the GPIO driver */ + status = XGpio_Initialize(&Gpio, GPIO_PMOD_PIN_DEVICE_ID); + if (status != XST_SUCCESS) { + xil_printf("GPIO Initialization Failed\r\n"); + return XST_FAILURE; + } + + set_pin_low(&Gpio, PIN); + + PRINTF("INFO: Connect logic analyzer to the pin 3 of Pmod D\r\n"); + PRINTF("INFO: Press any key to start:\r\n"); + dummy = inbyte(); + + /* Loop forever */ + for (unsigned i; i < 100; i++) { + set_pin_high(&Gpio, PIN); + + sleep(1); + + set_pin_low(&Gpio, PIN); + + sleep(1); + } +#endif + cleanup_platform(); return 0; diff --git a/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl b/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl index 9fa0b43d72..5d167bc1f6 100644 --- a/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl +++ b/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl @@ -1,6 +1,8 @@ set tcldir [file dirname [info script]] source [file join $tcldir project.tcl] +set eembc_power 1 + # Project names set project_name "project_1" set design_name "design_1" @@ -57,15 +59,36 @@ apply_bd_automation -rule xilinx.com:bd_rule:microblaze -config { \ # Enable full FPU set_property -dict [list CONFIG.C_USE_FPU {2}] [get_bd_cells microblaze_mcu] +# Create UART interface +#create_bd_cell -type ip -vlnv xilinx.com:ip:axi_uart16550:2.0 axi_uart +#apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { Clk_master {/mig_7series_0/ui_clk (83 MHz)} Clk_slave {Auto} Clk_xbar {Auto} Master {/microblaze_mcu (Periph)} Slave {/axi_uart/S_AXI} intc_ip {New AXI Interconnect} master_apm {0}} [get_bd_intf_pins axi_uart/S_AXI] +#apply_bd_automation -rule xilinx.com:bd_rule:board -config { Board_Interface {usb_uart ( USB UART ) } Manual_Source {Auto}} [get_bd_intf_pins axi_uart/UART] + # Create UART-lite interface -#create_bd_cell -type ip -vlnv xilinx.com:ip:axi_uartlite:2.0 axi_uart -#apply_board_connection -board_interface "usb_uart" -ip_intf "axi_uart/UART" -diagram ${design_name} -#set_property -dict [list CONFIG.C_BAUDRATE {115200}] [get_bd_cells axi_uart] +create_bd_cell -type ip -vlnv xilinx.com:ip:axi_uartlite:2.0 axi_uart +if { ${eembc_power} } { + set_property -dict [list CONFIG.C_BAUDRATE {9600}] [get_bd_cells axi_uart] +} else { + apply_board_connection -board_interface "usb_uart" -ip_intf "axi_uart/UART" -diagram ${design_name} + set_property -dict [list CONFIG.C_BAUDRATE {115200}] [get_bd_cells axi_uart] +} +apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { \ + Clk_master {/mig_7series_0/ui_clk (83 MHz)} \ + Clk_slave {Auto} \ + Clk_xbar {Auto} \ + Master {/microblaze_mcu (Periph)} \ + Slave {/axi_uart/S_AXI} \ + intc_ip {New AXI Interconnect} \ + master_apm {0}} [get_bd_intf_pins axi_uart/S_AXI] -# Create UART interface -create_bd_cell -type ip -vlnv xilinx.com:ip:axi_uart16550:2.0 axi_uart -apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { Clk_master {/mig_7series_0/ui_clk (83 MHz)} Clk_slave {Auto} Clk_xbar {Auto} Master {/microblaze_mcu (Periph)} Slave {/axi_uart/S_AXI} intc_ip {New AXI Interconnect} master_apm {0}} [get_bd_intf_pins axi_uart/S_AXI] -apply_bd_automation -rule xilinx.com:bd_rule:board -config { Board_Interface {usb_uart ( USB UART ) } Manual_Source {Auto}} [get_bd_intf_pins axi_uart/UART] +# Forward UART interface to PMOD pins +if { ${eembc_power} } { + create_bd_port -dir O pmod_uart_txd + create_bd_port -dir I pmod_uart_rxd + connect_bd_net [get_bd_pins /axi_uart/tx] [get_bd_ports pmod_uart_txd] + connect_bd_net [get_bd_pins /axi_uart/rx] [get_bd_ports pmod_uart_rxd] + add_files -fileset constrs_1 -norecurse uart_pmod.xdc +} apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { \ Clk_master {/mig_7series_0/ui_clk (83 MHz)} \ @@ -101,6 +124,38 @@ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_timer:2.0 axi_timer_mcu # Wire timer apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { Clk_master {/mig_7series_0/ui_clk (83 MHz)} Clk_slave {Auto} Clk_xbar {/mig_7series_0/ui_clk (83 MHz)} Master {/microblaze_mcu (Periph)} Slave {/axi_timer_mcu/S_AXI} intc_ip {/microblaze_mcu_axi_periph} master_apm {0}} [get_bd_intf_pins axi_timer_mcu/S_AXI] +# Add AXI GPIO controlled pin +if { ${eembc_power} } { + # Add AXI GPIO IP + create_bd_cell -type ip -vlnv xilinx.com:ip:axi_gpio:2.0 axi_gpio_0 + # Wire it up to a single output pin (to a PMOD) + set_property -dict [list CONFIG.C_GPIO_WIDTH {1} CONFIG.C_ALL_OUTPUTS {1}] [get_bd_cells axi_gpio_0] + apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { \ + Clk_master {/mig_7series_0/ui_clk (83 MHz)} \ + Clk_slave {Auto} \ + Clk_xbar {/mig_7series_0/ui_clk (83 MHz)} \ + Master {/microblaze_mcu (Periph)} \ + Slave {/axi_gpio_0/S_AXI} \ + intc_ip {/microblaze_mcu_axi_periph} \ + master_apm {0}} [get_bd_intf_pins axi_gpio_0/S_AXI] + create_bd_port -dir O pmod_pin + connect_bd_net [get_bd_ports pmod_pin] [get_bd_pins axi_gpio_0/gpio_io_o] + + add_files -fileset constrs_1 -norecurse pin_pmod.xdc +} + +# Add Quad SPI for cold boot +if { ${eembc_power} } { + create_bd_cell -type ip -vlnv xilinx.com:ip:axi_quad_spi:3.2 axi_quad_spi_0 + set_property -dict [list CONFIG.C_SPI_MEMORY {3} CONFIG.C_SPI_MODE {2} CONFIG.C_SCK_RATIO {2}] [get_bd_cells axi_quad_spi_0] + apply_bd_automation -rule xilinx.com:bd_rule:board -config { Board_Interface {qspi_flash ( Quad SPI Flash ) } Manual_Source {Auto}} [get_bd_intf_pins axi_quad_spi_0/SPI_0] + apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { Clk_master {/mig_7series_0/ui_clk (83 MHz)} Clk_slave {Auto} Clk_xbar {/mig_7series_0/ui_clk (83 MHz)} Master {/microblaze_mcu (Periph)} Slave {/axi_quad_spi_0/AXI_LITE} intc_ip {/microblaze_mcu_axi_periph} master_apm {0}} [get_bd_intf_pins axi_quad_spi_0/AXI_LITE] + set_property -dict [list CONFIG.CLKOUT3_USED {true} CONFIG.CLKOUT3_REQUESTED_OUT_FREQ {50} CONFIG.MMCM_CLKOUT2_DIVIDE {20} CONFIG.NUM_OUT_CLKS {3} CONFIG.CLKOUT3_JITTER {151.636} CONFIG.CLKOUT3_PHASE_ERROR {98.575}] [get_bd_cells clk_wizard] + connect_bd_net [get_bd_pins clk_wizard/clk_out3] [get_bd_pins axi_quad_spi_0/ext_spi_clk] + set_property -dict [list CONFIG.C_SPI_MEMORY {3}] [get_bd_cells axi_quad_spi_0] + add_files -fileset constrs_1 -norecurse qspi.xdc +} + # Validate the design block we created validate_bd_design @@ -108,8 +163,9 @@ validate_bd_design save_bd_design # Top level wrapper -make_wrapper -files [get_files ./${myproject}_vivado_accelerator/${project_name}.srcs/sources_1/bd/${design_name}/${design_name}.bd] -top -add_files -norecurse ./${myproject}_vivado_accelerator/${project_name}.srcs/sources_1/bd/${design_name}/hdl/${design_name}_wrapper.v +#make_wrapper -files [get_files ./${myproject}_vivado_accelerator/${project_name}.srcs/sources_1/bd/${design_name}/${design_name}.bd] -top +#add_files -norecurse ./${myproject}_vivado_accelerator/${project_name}.srcs/sources_1/bd/${design_name}/hdl/${design_name}_wrapper.v +add_files -norecurse $design_name\_wrapper.v # Run synthesis and implementation reset_run impl_1 diff --git a/hls4ml/templates/vivado_accelerator/arty-a7-100t/verilog_wrappers/design_1_wrapper.v b/hls4ml/templates/vivado_accelerator/arty-a7-100t/verilog_wrappers/design_1_wrapper.v new file mode 100644 index 0000000000..1ca1a233b1 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/arty-a7-100t/verilog_wrappers/design_1_wrapper.v @@ -0,0 +1,197 @@ +`timescale 1 ps / 1 ps + +`define EEMBC_POWER 1 + +module design_1_wrapper + (ddr3_sdram_addr, + ddr3_sdram_ba, + ddr3_sdram_cas_n, + ddr3_sdram_ck_n, + ddr3_sdram_ck_p, + ddr3_sdram_cke, + ddr3_sdram_cs_n, + ddr3_sdram_dm, + ddr3_sdram_dq, + ddr3_sdram_dqs_n, + ddr3_sdram_dqs_p, + ddr3_sdram_odt, + ddr3_sdram_ras_n, + ddr3_sdram_reset_n, + ddr3_sdram_we_n +`ifdef EEMBC_POWER + , + qspi_flash_io0_io, + qspi_flash_io1_io, + qspi_flash_io2_io, + qspi_flash_io3_io, + qspi_flash_sck_io, + qspi_flash_ss_io + `endif + , + reset, + sys_clock +`ifdef EEMBC_POWER + , + pmod_uart_rxd, + pmod_uart_txd, + pmod_pin +`endif + ); + output [13:0]ddr3_sdram_addr; + output [2:0]ddr3_sdram_ba; + output ddr3_sdram_cas_n; + output [0:0]ddr3_sdram_ck_n; + output [0:0]ddr3_sdram_ck_p; + output [0:0]ddr3_sdram_cke; + output [0:0]ddr3_sdram_cs_n; + output [1:0]ddr3_sdram_dm; + inout [15:0]ddr3_sdram_dq; + inout [1:0]ddr3_sdram_dqs_n; + inout [1:0]ddr3_sdram_dqs_p; + output [0:0]ddr3_sdram_odt; + output ddr3_sdram_ras_n; + output ddr3_sdram_reset_n; + output ddr3_sdram_we_n; +`ifdef EEMBC_POWER + inout qspi_flash_io0_io; + inout qspi_flash_io1_io; + inout qspi_flash_io2_io; + inout qspi_flash_io3_io; + inout qspi_flash_sck_io; + inout qspi_flash_ss_io; + `endif + input reset; + input sys_clock; +`ifdef EEMBC_POWER + input pmod_uart_rxd; + output pmod_uart_txd; + output pmod_pin; +`endif + + + wire [13:0]ddr3_sdram_addr; + wire [2:0]ddr3_sdram_ba; + wire ddr3_sdram_cas_n; + wire [0:0]ddr3_sdram_ck_n; + wire [0:0]ddr3_sdram_ck_p; + wire [0:0]ddr3_sdram_cke; + wire [0:0]ddr3_sdram_cs_n; + wire [1:0]ddr3_sdram_dm; + wire [15:0]ddr3_sdram_dq; + wire [1:0]ddr3_sdram_dqs_n; + wire [1:0]ddr3_sdram_dqs_p; + wire [0:0]ddr3_sdram_odt; + wire ddr3_sdram_ras_n; + wire ddr3_sdram_reset_n; + wire ddr3_sdram_we_n; +`ifdef EEMBC_POWER + wire qspi_flash_io0_i; + wire qspi_flash_io0_io; + wire qspi_flash_io0_o; + wire qspi_flash_io0_t; + wire qspi_flash_io1_i; + wire qspi_flash_io1_io; + wire qspi_flash_io1_o; + wire qspi_flash_io1_t; + wire qspi_flash_io2_i; + wire qspi_flash_io2_io; + wire qspi_flash_io2_o; + wire qspi_flash_io2_t; + wire qspi_flash_io3_i; + wire qspi_flash_io3_io; + wire qspi_flash_io3_o; + wire qspi_flash_io3_t; + wire qspi_flash_sck_i; + wire qspi_flash_sck_io; + wire qspi_flash_sck_o; + wire qspi_flash_sck_t; + wire qspi_flash_ss_i; + wire qspi_flash_ss_io; + wire qspi_flash_ss_o; + wire qspi_flash_ss_t; +`endif + wire reset; + wire sys_clock; + +`ifdef EEMBC_POWER + IOBUF qspi_flash_io0_iobuf + (.I(qspi_flash_io0_o), + .IO(qspi_flash_io0_io), + .O(qspi_flash_io0_i), + .T(qspi_flash_io0_t)); + IOBUF qspi_flash_io1_iobuf + (.I(qspi_flash_io1_o), + .IO(qspi_flash_io1_io), + .O(qspi_flash_io1_i), + .T(qspi_flash_io1_t)); + IOBUF qspi_flash_io2_iobuf + (.I(qspi_flash_io2_o), + .IO(qspi_flash_io2_io), + .O(qspi_flash_io2_i), + .T(qspi_flash_io2_t)); + IOBUF qspi_flash_io3_iobuf + (.I(qspi_flash_io3_o), + .IO(qspi_flash_io3_io), + .O(qspi_flash_io3_i), + .T(qspi_flash_io3_t)); + IOBUF qspi_flash_sck_iobuf + (.I(qspi_flash_sck_o), + .IO(qspi_flash_sck_io), + .O(qspi_flash_sck_i), + .T(qspi_flash_sck_t)); + IOBUF qspi_flash_ss_iobuf + (.I(qspi_flash_ss_o), + .IO(qspi_flash_ss_io), + .O(qspi_flash_ss_i), + .T(qspi_flash_ss_t)); +`endif + + design_1 design_1_i + (.ddr3_sdram_addr(ddr3_sdram_addr), + .ddr3_sdram_ba(ddr3_sdram_ba), + .ddr3_sdram_cas_n(ddr3_sdram_cas_n), + .ddr3_sdram_ck_n(ddr3_sdram_ck_n), + .ddr3_sdram_ck_p(ddr3_sdram_ck_p), + .ddr3_sdram_cke(ddr3_sdram_cke), + .ddr3_sdram_cs_n(ddr3_sdram_cs_n), + .ddr3_sdram_dm(ddr3_sdram_dm), + .ddr3_sdram_dq(ddr3_sdram_dq), + .ddr3_sdram_dqs_n(ddr3_sdram_dqs_n), + .ddr3_sdram_dqs_p(ddr3_sdram_dqs_p), + .ddr3_sdram_odt(ddr3_sdram_odt), + .ddr3_sdram_ras_n(ddr3_sdram_ras_n), + .ddr3_sdram_reset_n(ddr3_sdram_reset_n), + .ddr3_sdram_we_n(ddr3_sdram_we_n) +`ifdef EEMBC_POWER + , + .qspi_flash_io0_i(qspi_flash_io0_i), + .qspi_flash_io0_o(qspi_flash_io0_o), + .qspi_flash_io0_t(qspi_flash_io0_t), + .qspi_flash_io1_i(qspi_flash_io1_i), + .qspi_flash_io1_o(qspi_flash_io1_o), + .qspi_flash_io1_t(qspi_flash_io1_t), + .qspi_flash_io2_i(qspi_flash_io2_i), + .qspi_flash_io2_o(qspi_flash_io2_o), + .qspi_flash_io2_t(qspi_flash_io2_t), + .qspi_flash_io3_i(qspi_flash_io3_i), + .qspi_flash_io3_o(qspi_flash_io3_o), + .qspi_flash_io3_t(qspi_flash_io3_t), + .qspi_flash_sck_i(qspi_flash_sck_i), + .qspi_flash_sck_o(qspi_flash_sck_o), + .qspi_flash_sck_t(qspi_flash_sck_t), + .qspi_flash_ss_i(qspi_flash_ss_i), + .qspi_flash_ss_o(qspi_flash_ss_o), + .qspi_flash_ss_t(qspi_flash_ss_t) + `endif + , + .reset(reset), + .sys_clock(sys_clock) +`ifdef EEMBC_POWER + , + .pmod_uart_rxd(pmod_uart_rxd), + .pmod_uart_txd(pmod_uart_txd), + .pmod_pin(pmod_pin) +`endif + + ); +endmodule diff --git a/hls4ml/templates/vivado_accelerator/arty-a7-100t/xdc_constraints/pin_pmod.xdc b/hls4ml/templates/vivado_accelerator/arty-a7-100t/xdc_constraints/pin_pmod.xdc new file mode 100644 index 0000000000..321279b709 --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/arty-a7-100t/xdc_constraints/pin_pmod.xdc @@ -0,0 +1,4 @@ +# AXI GPIO controlled pin on Pmod Header JD + +# Output pin, PMOD D pin 3 (JD4), IO_L13N_T2_MRCC_35, F4, Blue cable +set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { pmod_pin }]; diff --git a/hls4ml/templates/vivado_accelerator/arty-a7-100t/xdc_constraints/qspi.xdc b/hls4ml/templates/vivado_accelerator/arty-a7-100t/xdc_constraints/qspi.xdc new file mode 100644 index 0000000000..6019da47bd --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/arty-a7-100t/xdc_constraints/qspi.xdc @@ -0,0 +1,13 @@ +# +# See also +# https://github.com/Digilent/digilent-xdc/blob/master/Arty-A7-100-Master.xdc +# + +set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design] + +# Quad SPI Flash +set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { qspi_flash_ss_io }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_cs +set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { qspi_flash_io0_io }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] +set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { qspi_flash_io1_io }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] +set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { qspi_flash_io2_io }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] +set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { qspi_flash_io3_io }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] diff --git a/hls4ml/templates/vivado_accelerator/arty-a7-100t/xdc_constraints/uart_pmod.xdc b/hls4ml/templates/vivado_accelerator/arty-a7-100t/xdc_constraints/uart_pmod.xdc new file mode 100644 index 0000000000..2cf181a20a --- /dev/null +++ b/hls4ml/templates/vivado_accelerator/arty-a7-100t/xdc_constraints/uart_pmod.xdc @@ -0,0 +1,8 @@ +# Expose UART Interface on Pmod Header JA +# You may need https://www.sparkfun.com/products/9873 + +# RX uart, PMOD A pin 2 (JA2), IO_L4P_T0_15, B11, BROWN cable +set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { pmod_uart_rxd }]; + +# TX uart, PMOD A pin 3 (JA3), IO_L4N_T0_15, A11, RED cable +set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { pmod_uart_txd }]; diff --git a/hls4ml/templates/vivado_accelerator_config.py b/hls4ml/templates/vivado_accelerator_config.py index b7c90f0973..e099f6ecb0 100644 --- a/hls4ml/templates/vivado_accelerator_config.py +++ b/hls4ml/templates/vivado_accelerator_config.py @@ -14,7 +14,7 @@ def __init__(self, config, model_inputs, model_outputs): self.part = board_info['part'] else: raise Exception('The board does not appear in supported_boards.json file') - + if self.config.get('XilinxPart') is not None: if self.config.get('XilinxPart') != self.part: print('WARNING: You set a XilinxPart that does not correspond to the Board you specified. The correct ' @@ -29,7 +29,7 @@ def __init__(self, config, model_inputs, model_outputs): if prec.get('Input') is None or prec.get('Output') is None: raise Exception('Input and Output fields must be provided in the AcceleratorConfig->Precision') else: - accel_config = {'Precision': + accel_config = {'Precision': { 'Input': 'float', 'Output': 'float' @@ -122,11 +122,17 @@ def get_driver_path(self): return '../templates/vivado_accelerator/' + self.board + '/' + self.driver + '_drivers/' + \ self.get_driver_files() + def get_vivado_ip_wrapper_path(self): + return '../templates/vivado_accelerator/' + self.board + '/verilog_wrappers' + + def get_vivado_constratins_path(self): + return '../templates/vivado_accelerator/' + self.board + '/xdc_constraints' + def get_driver_files(self): if self.driver == 'c': driver_dir = 'sdk' return driver_dir - elif self.driver == 'python': + elif self.driver == 'python': driver_ext = '.py' return self.interface + '_driver' + driver_ext diff --git a/hls4ml/writer/vivado_accelerator_writer.py b/hls4ml/writer/vivado_accelerator_writer.py index f9f257b437..9732b2ad06 100644 --- a/hls4ml/writer/vivado_accelerator_writer.py +++ b/hls4ml/writer/vivado_accelerator_writer.py @@ -333,6 +333,13 @@ def write_board_script(self, model): filedir = os.path.dirname(os.path.abspath(__file__)) copyfile(os.path.join(filedir, self.vivado_accelerator_config.get_tcl_file_path()), '{}/design.tcl'.format(model.config.get_output_dir())) + if self.vivado_accelerator_config.get_interface() == 'axi_master': + copytree(os.path.join(filedir, self.vivado_accelerator_config.get_vivado_ip_wrapper_path()), + '{}/'.format(model.config.get_output_dir()), + dirs_exist_ok=True) + copytree(os.path.join(filedir, self.vivado_accelerator_config.get_vivado_constratins_path()), + '{}/'.format(model.config.get_output_dir()), + dirs_exist_ok=True) f = open('{}/project.tcl'.format(model.config.get_output_dir()), 'w') f.write('variable myproject\n') f.write('set myproject "{}"\n'.format(model.config.get_project_name())) From a497085d2045fbb7e3f2df74bd6d1805b97ccf01 Mon Sep 17 00:00:00 2001 From: Olivia Weng Date: Mon, 21 Feb 2022 10:17:24 -0800 Subject: [PATCH 074/102] try out jules's fix to relu_merge optimizer pass to work with dense-relu layers --- hls4ml/model/optimizer/passes/relu_merge.py | 51 +++++++++++++++------ 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/hls4ml/model/optimizer/passes/relu_merge.py b/hls4ml/model/optimizer/passes/relu_merge.py index 2157ff6db3..3d1c1d72f7 100644 --- a/hls4ml/model/optimizer/passes/relu_merge.py +++ b/hls4ml/model/optimizer/passes/relu_merge.py @@ -2,7 +2,7 @@ class MergeRelu(OptimizerPass): def match(self, node): - supported_layers = ['Conv2D', 'Conv2DBatchnorm', 'Dense'] + supported_layers = ['Conv2D', 'Conv2DBatchnorm', 'Dense', 'DenseBatchnorm'] is_match = node.get_input_node().__class__.__name__ in supported_layers #hls4ml names ReLU activations 'Activation' @@ -13,17 +13,38 @@ def transform(self, model, node): #Merge ReLU and Convolution layer if needed previous_node = node.get_input_node() previous_node.index = node.index - if previous_node.get_attr('data_format') == 'channels_last': - shape = [previous_node.attributes['out_height'], previous_node.attributes['out_width'], previous_node.attributes['n_filt']] - dims = ['OUT_HEIGHT_{}'.format(previous_node.index), 'OUT_WIDTH_{}'.format(previous_node.index), 'N_FILT_{}'.format(previous_node.index)] - else: - shape = [previous_node.attributes['n_filt'], previous_node.attributes['out_height'], previous_node.attributes['out_width']] - dims = ['N_FILT_{}'.format(previous_node.index), 'OUT_HEIGHT_{}'.format(previous_node.index), 'OUT_WIDTH_{}'.format(previous_node.index)] - activation_precision, _ = model.config.get_precision(node, var='result') - previous_node.add_output_variable(shape, dims, precision=activation_precision) - if not node.get_output_nodes(): - print("WARNING: {} is the output layer! No rewiring performed.".format(node.name)) - model.remove_node(node, rewire=False) - else: - model.remove_node(node, rewire=True) - return True \ No newline at end of file + print('current node_data_format: {}'.format(node.get_attr('data_format'))) + print('current node attributes: {}'.format(node.attributes)) + + if 'Conv2D' in previous_node.__class__.__name__: + if previous_node.get_attr('data_format') == 'channels_last': + shape = [previous_node.attributes['out_height'], previous_node.attributes['out_width'], previous_node.attributes['n_filt']] + dims = ['OUT_HEIGHT_{}'.format(previous_node.index), 'OUT_WIDTH_{}'.format(previous_node.index), 'N_FILT_{}'.format(previous_node.index)] + else: + shape = [previous_node.attributes['n_filt'], previous_node.attributes['out_height'], previous_node.attributes['out_width']] + dims = ['N_FILT_{}'.format(previous_node.index), 'OUT_HEIGHT_{}'.format(previous_node.index), 'OUT_WIDTH_{}'.format(previous_node.index)] + activation_precision, _ = model.config.get_precision(node, var='result') + previous_node.add_output_variable(shape, dims, precision=activation_precision) + if not node.get_output_nodes(): + print("WARNING: {} is the output layer! No rewiring performed.".format(node.name)) + model.remove_node(node, rewire=False) + else: + model.remove_node(node, rewire=True) + return True + elif 'Dense' in previous_node.__class__.__name__: + shape = previous_node.get_input_variable().shape[:] + shape[-1] = previous_node.attributes['n_out'] + if len(shape) > 1: + dims = ['N_LAYER_{}_{}'.format(i, previous_node.index) for i in range(1, len(shape) + 1)] + else: + dims = ['N_LAYER_{}'.format(previous_node.index)] + print('shape: {}'.format(shape)) + print('dims: {}'.format(dims)) + activation_precision, _ = model.config.get_precision(node, var='result') + previous_node.add_output_variable(shape, dims, precision=activation_precision) + if not node.get_output_nodes(): + print("WARNING: {} is the output layer! No rewiring performed.".format(node.name)) + model.remove_node(node, rewire=False) + else: + model.remove_node(node, rewire=True) + return True \ No newline at end of file From c9daa066cb0b4e2c356264946fea95b0368636cc Mon Sep 17 00:00:00 2001 From: Olivia Weng Date: Mon, 21 Feb 2022 13:17:43 -0800 Subject: [PATCH 075/102] have dense layer check merged_relu flag to see whether or not to set merged_relu flag in HLS firmware code --- hls4ml/model/hls_layers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index 684e6080b5..40a5c71522 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -650,7 +650,8 @@ def config_cpp(self): params['nonzeros'] = self.get_weights('weight').nonzeros params['product_type'] = self.model.config.backend.product_type(self.get_input_variable().type.precision, self.get_weights('weight').type.precision) params['strategy'] = self.get_attr('strategy') - params['merged_relu'] = "false" + params['merged_relu'] = str(bool(self.model.config.get_merged_relu())).lower() + # params['merged_relu'] = "false" params['out_t'] = self.get_output_variable().type.name return self._config_template.format(**params) From 949bafdd08089f6b0fadb0de2759af80e752295f Mon Sep 17 00:00:00 2001 From: Olivia Weng Date: Mon, 21 Feb 2022 14:00:29 -0800 Subject: [PATCH 076/102] fix how merged_relu flag is set for Dense and Conv2D in hls_layers.py --- hls4ml/model/hls_layers.py | 8 ++++++-- hls4ml/model/optimizer/passes/relu_merge.py | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index 40a5c71522..226effdf25 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -634,6 +634,8 @@ def initialize(self): self.set_attr('index_t', index_t) self.add_bias(quantizer=self.get_attr('bias_quantizer')) + self.merged_relu = bool(self.model.config.get_merged_relu()) \ + and (self.get_output_variable().__class__.__name__ == 'Activation') def function_cpp(self): params = self._default_function_params() @@ -650,7 +652,7 @@ def config_cpp(self): params['nonzeros'] = self.get_weights('weight').nonzeros params['product_type'] = self.model.config.backend.product_type(self.get_input_variable().type.precision, self.get_weights('weight').type.precision) params['strategy'] = self.get_attr('strategy') - params['merged_relu'] = str(bool(self.model.config.get_merged_relu())).lower() + params['merged_relu'] = "true" if self.merged_relu else "false" # params['merged_relu'] = "false" params['out_t'] = self.get_output_variable().type.name return self._config_template.format(**params) @@ -880,6 +882,8 @@ def initialize(self): self.weights['weight'].data = np.transpose(self.weights['weight'].data, axes=[3, 0, 1, 2]) #(H,W,C,F) => (F,H,W,C) else: self.set_attr('strategy', 'latency') + self.merged_relu = bool(self.model.config.get_merged_relu()) \ + and (self.get_output_variable().__class__.__name__ == 'Activation') def function_cpp(self): params = self._default_function_params() @@ -931,7 +935,7 @@ def config_cpp(self): mult_params['n_in'] = self.get_attr('n_chan') * self.get_attr('filt_height') * self.get_attr('filt_width') mult_params['n_out'] = self.get_attr('n_filt') mult_params['product_type'] = self.model.config.backend.product_type(self.get_input_variable().type.precision, self.get_weights('weight').type.precision) - mult_params['merged_relu'] = str(bool(self.model.config.get_merged_relu())).lower() + mult_params['merged_relu'] = "true" if self.merged_relu else "false" mult_params['out_t'] = self.intermediate_op.type.name mult_config = self._config_template[1].format(**mult_params) diff --git a/hls4ml/model/optimizer/passes/relu_merge.py b/hls4ml/model/optimizer/passes/relu_merge.py index 3d1c1d72f7..b8b8d2d8d6 100644 --- a/hls4ml/model/optimizer/passes/relu_merge.py +++ b/hls4ml/model/optimizer/passes/relu_merge.py @@ -5,12 +5,12 @@ def match(self, node): supported_layers = ['Conv2D', 'Conv2DBatchnorm', 'Dense', 'DenseBatchnorm'] is_match = node.get_input_node().__class__.__name__ in supported_layers - #hls4ml names ReLU activations 'Activation' + # hls4ml names ReLU activations 'Activation' is_match = is_match and (node.__class__.__name__ == 'Activation') return is_match def transform(self, model, node): - #Merge ReLU and Convolution layer if needed + # Merge ReLU and Convolution/Dense layer if needed previous_node = node.get_input_node() previous_node.index = node.index print('current node_data_format: {}'.format(node.get_attr('data_format'))) From 8e3df9e252e82690ccf992139385cc1c5ca773c2 Mon Sep 17 00:00:00 2001 From: Olivia Weng Date: Mon, 21 Feb 2022 14:07:27 -0800 Subject: [PATCH 077/102] debug print --- hls4ml/model/hls_layers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index 226effdf25..ca3c9b7d1a 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -636,6 +636,7 @@ def initialize(self): self.add_bias(quantizer=self.get_attr('bias_quantizer')) self.merged_relu = bool(self.model.config.get_merged_relu()) \ and (self.get_output_variable().__class__.__name__ == 'Activation') + print(f"output variable class name: {self.get_output_variable().__class__.__name__}") def function_cpp(self): params = self._default_function_params() From f2985176f66e016c80f9c8c6192a05da73f2ff49 Mon Sep 17 00:00:00 2001 From: Olivia Weng Date: Mon, 21 Feb 2022 14:24:18 -0800 Subject: [PATCH 078/102] add merged_relu attribute to Layer class --- hls4ml/model/hls_layers.py | 16 +++++++++------- hls4ml/model/optimizer/passes/relu_merge.py | 3 ++- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index ca3c9b7d1a..aaf17f54d6 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -366,6 +366,7 @@ def __init__(self, model, name, attributes, inputs, outputs=None): self.set_attr('accum_t', accum_t.precision) self.reuse_factor = self.model.config.get_reuse_factor(self) self.target_cycles = self.model.config.get_target_cycles(self) + self.merged_relu = False layer_config = self.model.config.get_layer_config(self) for config_key, config_value in layer_config.items(): @@ -546,6 +547,12 @@ def _default_config_params(self): def get_layer_precision(self): return self.precision + def get_merged_relu(self): + return self.merged_relu + + def set_merged_relu(self, merged_relu): + self.merged_relu = merged_relu # Bool flag to set merged_relu + # myproject.cpp/h def function_cpp(self): raise NotImplementedError @@ -634,9 +641,6 @@ def initialize(self): self.set_attr('index_t', index_t) self.add_bias(quantizer=self.get_attr('bias_quantizer')) - self.merged_relu = bool(self.model.config.get_merged_relu()) \ - and (self.get_output_variable().__class__.__name__ == 'Activation') - print(f"output variable class name: {self.get_output_variable().__class__.__name__}") def function_cpp(self): params = self._default_function_params() @@ -653,7 +657,7 @@ def config_cpp(self): params['nonzeros'] = self.get_weights('weight').nonzeros params['product_type'] = self.model.config.backend.product_type(self.get_input_variable().type.precision, self.get_weights('weight').type.precision) params['strategy'] = self.get_attr('strategy') - params['merged_relu'] = "true" if self.merged_relu else "false" + params['merged_relu'] = "true" if self.get_merged_relu() else "false" # params['merged_relu'] = "false" params['out_t'] = self.get_output_variable().type.name return self._config_template.format(**params) @@ -883,8 +887,6 @@ def initialize(self): self.weights['weight'].data = np.transpose(self.weights['weight'].data, axes=[3, 0, 1, 2]) #(H,W,C,F) => (F,H,W,C) else: self.set_attr('strategy', 'latency') - self.merged_relu = bool(self.model.config.get_merged_relu()) \ - and (self.get_output_variable().__class__.__name__ == 'Activation') def function_cpp(self): params = self._default_function_params() @@ -936,7 +938,7 @@ def config_cpp(self): mult_params['n_in'] = self.get_attr('n_chan') * self.get_attr('filt_height') * self.get_attr('filt_width') mult_params['n_out'] = self.get_attr('n_filt') mult_params['product_type'] = self.model.config.backend.product_type(self.get_input_variable().type.precision, self.get_weights('weight').type.precision) - mult_params['merged_relu'] = "true" if self.merged_relu else "false" + mult_params['merged_relu'] = "true" if self.get_merged_relu() else "false" mult_params['out_t'] = self.intermediate_op.type.name mult_config = self._config_template[1].format(**mult_params) diff --git a/hls4ml/model/optimizer/passes/relu_merge.py b/hls4ml/model/optimizer/passes/relu_merge.py index b8b8d2d8d6..1981ebe261 100644 --- a/hls4ml/model/optimizer/passes/relu_merge.py +++ b/hls4ml/model/optimizer/passes/relu_merge.py @@ -10,9 +10,10 @@ def match(self, node): return is_match def transform(self, model, node): - # Merge ReLU and Convolution/Dense layer if needed + # Merge ReLU and Convolution/Dense layer previous_node = node.get_input_node() previous_node.index = node.index + previous_node.set_merged_relu(True) # Turn on merged_relu flag for this Conv/Dense layer print('current node_data_format: {}'.format(node.get_attr('data_format'))) print('current node attributes: {}'.format(node.attributes)) From f6bf06ac585ce8d5ed68d133b61207de5efbadaf Mon Sep 17 00:00:00 2001 From: Olivia Weng Date: Mon, 21 Feb 2022 15:28:37 -0800 Subject: [PATCH 079/102] remove debug prints and comments and DenseBatchnorm from relu_merge supported layers list since it's not supported yet --- hls4ml/model/hls_layers.py | 3 -- hls4ml/model/optimizer/passes/relu_merge.py | 5 +--- .../model/optimizer/passes/relu_merge_old.py | 29 +++++++++++++++++++ 3 files changed, 30 insertions(+), 7 deletions(-) create mode 100644 hls4ml/model/optimizer/passes/relu_merge_old.py diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index aaf17f54d6..41a6de1bde 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -658,7 +658,6 @@ def config_cpp(self): params['product_type'] = self.model.config.backend.product_type(self.get_input_variable().type.precision, self.get_weights('weight').type.precision) params['strategy'] = self.get_attr('strategy') params['merged_relu'] = "true" if self.get_merged_relu() else "false" - # params['merged_relu'] = "false" params['out_t'] = self.get_output_variable().type.name return self._config_template.format(**params) @@ -867,8 +866,6 @@ def initialize(self): else: shape = [self.attributes['n_filt'], self.attributes['out_height'], self.attributes['out_width']] dims = ['N_FILT_{}'.format(self.index), 'OUT_HEIGHT_{}'.format(self.index), 'OUT_WIDTH_{}'.format(self.index)] - # self.index = self.index + 2 - # if(not bool(self.model.config.get_merged_relu())): self.attributes['intermediate_index'] = self.index self.add_output_variable(shape, dims) self.intermediate_op = self.get_output_variable() diff --git a/hls4ml/model/optimizer/passes/relu_merge.py b/hls4ml/model/optimizer/passes/relu_merge.py index 1981ebe261..9c98eaa714 100644 --- a/hls4ml/model/optimizer/passes/relu_merge.py +++ b/hls4ml/model/optimizer/passes/relu_merge.py @@ -2,7 +2,7 @@ class MergeRelu(OptimizerPass): def match(self, node): - supported_layers = ['Conv2D', 'Conv2DBatchnorm', 'Dense', 'DenseBatchnorm'] + supported_layers = ['Conv2D', 'Conv2DBatchnorm', 'Dense'] is_match = node.get_input_node().__class__.__name__ in supported_layers # hls4ml names ReLU activations 'Activation' @@ -14,9 +14,6 @@ def transform(self, model, node): previous_node = node.get_input_node() previous_node.index = node.index previous_node.set_merged_relu(True) # Turn on merged_relu flag for this Conv/Dense layer - print('current node_data_format: {}'.format(node.get_attr('data_format'))) - print('current node attributes: {}'.format(node.attributes)) - if 'Conv2D' in previous_node.__class__.__name__: if previous_node.get_attr('data_format') == 'channels_last': shape = [previous_node.attributes['out_height'], previous_node.attributes['out_width'], previous_node.attributes['n_filt']] diff --git a/hls4ml/model/optimizer/passes/relu_merge_old.py b/hls4ml/model/optimizer/passes/relu_merge_old.py new file mode 100644 index 0000000000..2157ff6db3 --- /dev/null +++ b/hls4ml/model/optimizer/passes/relu_merge_old.py @@ -0,0 +1,29 @@ +from hls4ml.model.optimizer import OptimizerPass + +class MergeRelu(OptimizerPass): + def match(self, node): + supported_layers = ['Conv2D', 'Conv2DBatchnorm', 'Dense'] + is_match = node.get_input_node().__class__.__name__ in supported_layers + + #hls4ml names ReLU activations 'Activation' + is_match = is_match and (node.__class__.__name__ == 'Activation') + return is_match + + def transform(self, model, node): + #Merge ReLU and Convolution layer if needed + previous_node = node.get_input_node() + previous_node.index = node.index + if previous_node.get_attr('data_format') == 'channels_last': + shape = [previous_node.attributes['out_height'], previous_node.attributes['out_width'], previous_node.attributes['n_filt']] + dims = ['OUT_HEIGHT_{}'.format(previous_node.index), 'OUT_WIDTH_{}'.format(previous_node.index), 'N_FILT_{}'.format(previous_node.index)] + else: + shape = [previous_node.attributes['n_filt'], previous_node.attributes['out_height'], previous_node.attributes['out_width']] + dims = ['N_FILT_{}'.format(previous_node.index), 'OUT_HEIGHT_{}'.format(previous_node.index), 'OUT_WIDTH_{}'.format(previous_node.index)] + activation_precision, _ = model.config.get_precision(node, var='result') + previous_node.add_output_variable(shape, dims, precision=activation_precision) + if not node.get_output_nodes(): + print("WARNING: {} is the output layer! No rewiring performed.".format(node.name)) + model.remove_node(node, rewire=False) + else: + model.remove_node(node, rewire=True) + return True \ No newline at end of file From 9c08a24571199ddd16ec6e677a8b67f31f588d0b Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Mon, 21 Feb 2022 18:44:34 -0800 Subject: [PATCH 080/102] Delete relu_merge_old.py --- .../model/optimizer/passes/relu_merge_old.py | 29 ------------------- 1 file changed, 29 deletions(-) delete mode 100644 hls4ml/model/optimizer/passes/relu_merge_old.py diff --git a/hls4ml/model/optimizer/passes/relu_merge_old.py b/hls4ml/model/optimizer/passes/relu_merge_old.py deleted file mode 100644 index 2157ff6db3..0000000000 --- a/hls4ml/model/optimizer/passes/relu_merge_old.py +++ /dev/null @@ -1,29 +0,0 @@ -from hls4ml.model.optimizer import OptimizerPass - -class MergeRelu(OptimizerPass): - def match(self, node): - supported_layers = ['Conv2D', 'Conv2DBatchnorm', 'Dense'] - is_match = node.get_input_node().__class__.__name__ in supported_layers - - #hls4ml names ReLU activations 'Activation' - is_match = is_match and (node.__class__.__name__ == 'Activation') - return is_match - - def transform(self, model, node): - #Merge ReLU and Convolution layer if needed - previous_node = node.get_input_node() - previous_node.index = node.index - if previous_node.get_attr('data_format') == 'channels_last': - shape = [previous_node.attributes['out_height'], previous_node.attributes['out_width'], previous_node.attributes['n_filt']] - dims = ['OUT_HEIGHT_{}'.format(previous_node.index), 'OUT_WIDTH_{}'.format(previous_node.index), 'N_FILT_{}'.format(previous_node.index)] - else: - shape = [previous_node.attributes['n_filt'], previous_node.attributes['out_height'], previous_node.attributes['out_width']] - dims = ['N_FILT_{}'.format(previous_node.index), 'OUT_HEIGHT_{}'.format(previous_node.index), 'OUT_WIDTH_{}'.format(previous_node.index)] - activation_precision, _ = model.config.get_precision(node, var='result') - previous_node.add_output_variable(shape, dims, precision=activation_precision) - if not node.get_output_nodes(): - print("WARNING: {} is the output layer! No rewiring performed.".format(node.name)) - model.remove_node(node, rewire=False) - else: - model.remove_node(node, rewire=True) - return True \ No newline at end of file From 77a2db1167536aabf1d33968cc8e7842bd32b3b0 Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Mon, 21 Feb 2022 18:45:42 -0800 Subject: [PATCH 081/102] Update core.py --- hls4ml/converters/keras/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hls4ml/converters/keras/core.py b/hls4ml/converters/keras/core.py index 77ec2a0b92..2bc887ca03 100644 --- a/hls4ml/converters/keras/core.py +++ b/hls4ml/converters/keras/core.py @@ -104,7 +104,7 @@ def parse_activation_layer(keras_layer, input_names, input_shapes, data_reader, @keras_handler('BatchNormalization') def parse_batchnorm_layer(keras_layer, input_names, input_shapes, data_reader, config): - print(keras_layer['class_name']) + assert('BatchNormalization' in keras_layer['class_name'] or 'QConv2DBatchnorm' in keras_layer['class_name'] or 'QDenseBatchnorm' in keras_layer['class_name']) layer = parse_default_keras_layer(keras_layer, input_names) From 8b494a2280cda2c1a27a6d68df0b996c0fa65ce0 Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Mon, 21 Feb 2022 18:46:19 -0800 Subject: [PATCH 082/102] Update core.py --- hls4ml/converters/keras/core.py | 1 - 1 file changed, 1 deletion(-) diff --git a/hls4ml/converters/keras/core.py b/hls4ml/converters/keras/core.py index 2bc887ca03..c284ddd3f9 100644 --- a/hls4ml/converters/keras/core.py +++ b/hls4ml/converters/keras/core.py @@ -104,7 +104,6 @@ def parse_activation_layer(keras_layer, input_names, input_shapes, data_reader, @keras_handler('BatchNormalization') def parse_batchnorm_layer(keras_layer, input_names, input_shapes, data_reader, config): - assert('BatchNormalization' in keras_layer['class_name'] or 'QConv2DBatchnorm' in keras_layer['class_name'] or 'QDenseBatchnorm' in keras_layer['class_name']) layer = parse_default_keras_layer(keras_layer, input_names) From a18a2044d1e5b0724f9c88e81e4c113982ea3402 Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Mon, 21 Feb 2022 21:31:37 -0600 Subject: [PATCH 083/102] apply patches --- hls4ml/writer/vivado_accelerator_writer.py | 123 +++++++++++++++++++++ 1 file changed, 123 insertions(+) diff --git a/hls4ml/writer/vivado_accelerator_writer.py b/hls4ml/writer/vivado_accelerator_writer.py index f9f257b437..dca2b90752 100644 --- a/hls4ml/writer/vivado_accelerator_writer.py +++ b/hls4ml/writer/vivado_accelerator_writer.py @@ -414,6 +414,127 @@ def write_driver(self, model): def write_new_tar(self, model): os.remove(model.config.get_output_dir() + '.tar.gz') super(VivadoAcceleratorWriter, self).write_tar(model) + + def apply_patches(self, model): + ''' + Apply patches. + ''' + filedir = os.path.dirname(os.path.abspath(__file__)) + + indent = ' ' + + ################### + # patch myproject_axi.h + ################### + oldfile = '{}/firmware/{}_axi.h'.format(model.config.get_output_dir(), model.config.get_project_name()) + newfile = '{}/firmware/{}_axi_patch.h'.format(model.config.get_output_dir(), model.config.get_project_name()) + + f = open(oldfile,'r') + fout = open(newfile, 'w') + + for line in f.readlines(): + if 'typedef' in line and 'input_axi_t;' in line: + # hardcoded ap_uint<8> input + newline = 'typedef ap_uint<8> input_axi_t;\n' + else: + newline = line + fout.write(newline) + + f.close() + fout.close() + os.rename(newfile, oldfile) + + ################### + # patch myproject_axi.cpp + ################### + oldfile = '{}/firmware/{}_axi.cpp'.format(model.config.get_output_dir(), model.config.get_project_name()) + newfile = '{}/firmware/{}_axi_patch.cpp'.format(model.config.get_output_dir(), model.config.get_project_name()) + + f = open(oldfile,'r') + fout = open(newfile, 'w') + + for line in f.readlines(): + if 'ctype[j] = typename input_t::value_type' in line: + # these lines are hardcoded to do the bitshift by 256 + newline = indent + indent + indent + 'ap_ufixed<16,8> tmp = in[i * input_t::size + j]; // store 8 bit input in a larger temp variable\n' + newline += indent + indent + indent + 'ctype[j] = typename input_t::value_type(tmp >> 8); // shift right by 8 (div by 256) and select only the decimal of the larger temp variable\n' + else: + newline = line + fout.write(newline) + + f.close() + fout.close() + os.rename(newfile, oldfile) + + ################### + # patch myproject_test.cpp + ################### + oldfile = '{}/{}_test.cpp'.format(model.config.get_output_dir(), model.config.get_project_name()) + newfile = '{}/{}_test_patch.cpp'.format(model.config.get_output_dir(), model.config.get_project_name()) + + f = open(oldfile,'r') + fout = open(newfile, 'w') + + inp = model.get_input_variables()[0] + out = model.get_output_variables()[0] + + for line in f.readlines(): + if '{}.h'.format(model.config.get_project_name()) in line: + newline = line.replace('{}.h'.format(model.config.get_project_name()), '{}_axi.h'.format(model.config.get_project_name())) + elif self.variable_definition_cpp(model, inp) in line: + newline = line.replace(self.variable_definition_cpp(model, inp), 'input_axi_t inputs[N_IN]') + elif self.variable_definition_cpp(model, out) in line: + newline = line.replace(self.variable_definition_cpp(model, out), 'output_axi_t outputs[N_OUT]') + elif 'unsigned short' in line: + newline = '' + elif '{}('.format(model.config.get_project_name()) in line: + indent_amount = line.split(model.config.get_project_name())[0] + newline = indent_amount + '{}_axi(inputs,outputs);\n'.format(model.config.get_project_name()) + elif inp.size_cpp() in line or inp.cppname in line or inp.type.name in line: + newline = line.replace(inp.size_cpp(), 'N_IN').replace(inp.cppname, 'inputs').replace(inp.type.name, 'input_axi_t') + elif out.size_cpp() in line or out.cppname in line or out.type.name in line: + newline = line.replace(out.size_cpp(), 'N_OUT').replace(out.cppname, 'outputs').replace(out.type.name, 'output_axi_t') + else: + newline = line + fout.write(newline) + + f.close() + fout.close() + os.rename(newfile, oldfile) + + ################### + # patch myproject_bridge.cpp + ################### + oldfile = '{}/{}_bridge.cpp'.format(model.config.get_output_dir(), model.config.get_project_name()) + newfile = '{}/{}_bridge_patch.cpp'.format(model.config.get_output_dir(), model.config.get_project_name()) + + f = open(oldfile,'r') + fout = open(newfile, 'w') + + inp = model.get_input_variables()[0] + out = model.get_output_variables()[0] + + for line in f.readlines(): + if '{}.h'.format(model.config.get_project_name()) in line: + newline = line.replace('{}.h'.format(model.config.get_project_name()), '{}_axi.h'.format(model.config.get_project_name())) + elif self.variable_definition_cpp(model, inp, name_suffix='_ap') in line: + newline = line.replace(self.variable_definition_cpp(model, inp, name_suffix='_ap'), 'input_axi_t {}_ap[N_IN]'.format(inp.cppname)) + elif self.variable_definition_cpp(model, out, name_suffix='_ap') in line: + newline = line.replace(self.variable_definition_cpp(model, out, name_suffix='_ap'), 'output_axi_t {}_ap[N_OUT]'.format(out.cppname)) + elif '{}('.format(model.config.get_project_name()) in line: + indent_amount = line.split(model.config.get_project_name())[0] + newline = indent_amount + '{}_axi({}_ap,{}_ap);\n'.format(model.config.get_project_name(), inp.cppname,out.cppname) + elif inp.size_cpp() in line or inp.cppname in line or inp.type.name in line: + newline = line.replace(inp.size_cpp(),'N_IN').replace(inp.type.name, 'input_axi_t') + elif out.size_cpp() in line or out.cppname in line or out.type.name in line: + newline = line.replace(out.size_cpp(),'N_OUT').replace(out.type.name, 'output_axi_t') + else: + newline = line + fout.write(newline) + + f.close() + fout.close() + os.rename(newfile, oldfile) def write_hls(self, model): """ @@ -427,5 +548,7 @@ def write_hls(self, model): self.write_wrapper_test(model) self.write_axi_wrapper(model) self.modify_build_script(model) + if model.config.get_config_value('ApplyPatches'): + self.apply_patches(model) self.write_new_tar(model) From 3590aa4f1cbff121a86314dd59989f29a093e79e Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Mon, 21 Feb 2022 22:38:45 -0600 Subject: [PATCH 084/102] remove unnecessary patches --- hls4ml/writer/vivado_accelerator_writer.py | 70 ---------------------- 1 file changed, 70 deletions(-) diff --git a/hls4ml/writer/vivado_accelerator_writer.py b/hls4ml/writer/vivado_accelerator_writer.py index dca2b90752..2ba09104d7 100644 --- a/hls4ml/writer/vivado_accelerator_writer.py +++ b/hls4ml/writer/vivado_accelerator_writer.py @@ -466,76 +466,6 @@ def apply_patches(self, model): fout.close() os.rename(newfile, oldfile) - ################### - # patch myproject_test.cpp - ################### - oldfile = '{}/{}_test.cpp'.format(model.config.get_output_dir(), model.config.get_project_name()) - newfile = '{}/{}_test_patch.cpp'.format(model.config.get_output_dir(), model.config.get_project_name()) - - f = open(oldfile,'r') - fout = open(newfile, 'w') - - inp = model.get_input_variables()[0] - out = model.get_output_variables()[0] - - for line in f.readlines(): - if '{}.h'.format(model.config.get_project_name()) in line: - newline = line.replace('{}.h'.format(model.config.get_project_name()), '{}_axi.h'.format(model.config.get_project_name())) - elif self.variable_definition_cpp(model, inp) in line: - newline = line.replace(self.variable_definition_cpp(model, inp), 'input_axi_t inputs[N_IN]') - elif self.variable_definition_cpp(model, out) in line: - newline = line.replace(self.variable_definition_cpp(model, out), 'output_axi_t outputs[N_OUT]') - elif 'unsigned short' in line: - newline = '' - elif '{}('.format(model.config.get_project_name()) in line: - indent_amount = line.split(model.config.get_project_name())[0] - newline = indent_amount + '{}_axi(inputs,outputs);\n'.format(model.config.get_project_name()) - elif inp.size_cpp() in line or inp.cppname in line or inp.type.name in line: - newline = line.replace(inp.size_cpp(), 'N_IN').replace(inp.cppname, 'inputs').replace(inp.type.name, 'input_axi_t') - elif out.size_cpp() in line or out.cppname in line or out.type.name in line: - newline = line.replace(out.size_cpp(), 'N_OUT').replace(out.cppname, 'outputs').replace(out.type.name, 'output_axi_t') - else: - newline = line - fout.write(newline) - - f.close() - fout.close() - os.rename(newfile, oldfile) - - ################### - # patch myproject_bridge.cpp - ################### - oldfile = '{}/{}_bridge.cpp'.format(model.config.get_output_dir(), model.config.get_project_name()) - newfile = '{}/{}_bridge_patch.cpp'.format(model.config.get_output_dir(), model.config.get_project_name()) - - f = open(oldfile,'r') - fout = open(newfile, 'w') - - inp = model.get_input_variables()[0] - out = model.get_output_variables()[0] - - for line in f.readlines(): - if '{}.h'.format(model.config.get_project_name()) in line: - newline = line.replace('{}.h'.format(model.config.get_project_name()), '{}_axi.h'.format(model.config.get_project_name())) - elif self.variable_definition_cpp(model, inp, name_suffix='_ap') in line: - newline = line.replace(self.variable_definition_cpp(model, inp, name_suffix='_ap'), 'input_axi_t {}_ap[N_IN]'.format(inp.cppname)) - elif self.variable_definition_cpp(model, out, name_suffix='_ap') in line: - newline = line.replace(self.variable_definition_cpp(model, out, name_suffix='_ap'), 'output_axi_t {}_ap[N_OUT]'.format(out.cppname)) - elif '{}('.format(model.config.get_project_name()) in line: - indent_amount = line.split(model.config.get_project_name())[0] - newline = indent_amount + '{}_axi({}_ap,{}_ap);\n'.format(model.config.get_project_name(), inp.cppname,out.cppname) - elif inp.size_cpp() in line or inp.cppname in line or inp.type.name in line: - newline = line.replace(inp.size_cpp(),'N_IN').replace(inp.type.name, 'input_axi_t') - elif out.size_cpp() in line or out.cppname in line or out.type.name in line: - newline = line.replace(out.size_cpp(),'N_OUT').replace(out.type.name, 'output_axi_t') - else: - newline = line - fout.write(newline) - - f.close() - fout.close() - os.rename(newfile, oldfile) - def write_hls(self, model): """ Write the HLS project. Calls the VivadoBackend writer, and extra steps for VivadoAccelerator/AXI interface From 532aff879103455125a739298e8a8d4979e9747c Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Tue, 22 Feb 2022 11:32:10 -0600 Subject: [PATCH 085/102] small fixes --- hls4ml/templates/vivado_accelerator_config.py | 2 +- hls4ml/writer/vivado_accelerator_writer.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hls4ml/templates/vivado_accelerator_config.py b/hls4ml/templates/vivado_accelerator_config.py index e099f6ecb0..69955a7ac5 100644 --- a/hls4ml/templates/vivado_accelerator_config.py +++ b/hls4ml/templates/vivado_accelerator_config.py @@ -125,7 +125,7 @@ def get_driver_path(self): def get_vivado_ip_wrapper_path(self): return '../templates/vivado_accelerator/' + self.board + '/verilog_wrappers' - def get_vivado_constratins_path(self): + def get_vivado_constraints_path(self): return '../templates/vivado_accelerator/' + self.board + '/xdc_constraints' def get_driver_files(self): diff --git a/hls4ml/writer/vivado_accelerator_writer.py b/hls4ml/writer/vivado_accelerator_writer.py index 9732b2ad06..e5f9c36cd0 100644 --- a/hls4ml/writer/vivado_accelerator_writer.py +++ b/hls4ml/writer/vivado_accelerator_writer.py @@ -333,11 +333,11 @@ def write_board_script(self, model): filedir = os.path.dirname(os.path.abspath(__file__)) copyfile(os.path.join(filedir, self.vivado_accelerator_config.get_tcl_file_path()), '{}/design.tcl'.format(model.config.get_output_dir())) - if self.vivado_accelerator_config.get_interface() == 'axi_master': + if self.vivado_accelerator_config.get_interface() == 'axi_master' and self.vivado_accelerator_config.board == "arty-a7-100t": copytree(os.path.join(filedir, self.vivado_accelerator_config.get_vivado_ip_wrapper_path()), '{}/'.format(model.config.get_output_dir()), dirs_exist_ok=True) - copytree(os.path.join(filedir, self.vivado_accelerator_config.get_vivado_constratins_path()), + copytree(os.path.join(filedir, self.vivado_accelerator_config.get_vivado_constraints_path()), '{}/'.format(model.config.get_output_dir()), dirs_exist_ok=True) f = open('{}/project.tcl'.format(model.config.get_output_dir()), 'w') From e48ae63e6e8d28982e78a93419a53c7a09c80ff8 Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Tue, 22 Feb 2022 14:12:29 -0600 Subject: [PATCH 086/102] just pass hls_model --- hls4ml/model/profiling.py | 32 +++++++++----------------------- 1 file changed, 9 insertions(+), 23 deletions(-) diff --git a/hls4ml/model/profiling.py b/hls4ml/model/profiling.py index 97299ad3b4..5efa332051 100644 --- a/hls4ml/model/profiling.py +++ b/hls4ml/model/profiling.py @@ -29,11 +29,12 @@ __torch_profiling_enabled__ = False -def optimize_fifos_depth(model, output_dir='my-hls-test', project_name='myproject', input_data_tb=None, - output_data_tb=None, backend='VivadoBackend', board=None, part=None, clock_period=5, - io_type='io_stream', hls_config={}, init_large_fifo=True, reset=True, csim=True, synth=True, +def optimize_fifos_depth(model, hls_model, init_large_fifo=True, reset=True, csim=True, synth=True, cosim=True, validation=True, export=True, vsynth=True, **kwargs,): + cfg = hls_model.config.config.copy() + hls_config = cfg['HLSConfig'] + values = [] def populate_values(name, data, depth): @@ -47,12 +48,6 @@ def populate_values(name, data, depth): raise Exception('To use this optimization you have to set `FIFO_opt` field to True in the HLS config') - hls_model = hls4ml.converters.convert_from_keras_model(model, output_dir=output_dir, project_name=project_name, - input_data_tb=input_data_tb, output_data_tb=output_data_tb, - backend=backend, board=board, part=part, - clock_period=clock_period, io_type=io_type, - hls_config=hls_config, **kwargs) - # initialize all the fifos to 10000 so that they will be automatically implemented in BRAMs and so they will be # profiled @@ -68,13 +63,7 @@ def populate_values(name, data, depth): hls_config['LayerName']['in_local'] = {'StreamDepth' : 10000} hls_config['LayerName']['out_local'] = {'StreamDepth': 10000} - hls_model = hls4ml.converters.convert_from_keras_model(model, output_dir=output_dir, project_name=project_name, - input_data_tb=input_data_tb, - output_data_tb=output_data_tb, - backend=backend, board=board, part=part, - clock_period=clock_period, io_type=io_type, - hls_config=hls_config, **kwargs) - + hls_model = hls4ml.converters.keras_to_hls(cfg) # run the build with FIFO_opt param set to 1 in order to generate the vcd file @@ -105,7 +94,7 @@ def populate_values(name, data, depth): with open(hls_model.config.get_output_dir() + '/max_depth.json', 'w') as f: json.dump(maxs, f, indent=4) - new_config = hls_model.config.config.copy()['HLSConfig'] + new_config = cfg.copy()['HLSConfig'] new_config['Model']['FIFO_opt'] = 0 for k, v in hls_model.output_vars.items(): filtered_max = [x['max'] for x in maxs if v.cppname in x['name']] @@ -123,12 +112,9 @@ def populate_values(name, data, depth): elif 'out_local' in x['name']: new_config['LayerName']['out_local'] = {'StreamDepth': x['max'] + 1} out_dir = hls_model.config.get_output_dir() + '_FIFO_OPT' - hls_model = hls4ml.converters.convert_from_keras_model(hls_model.config.config['KerasModel'], output_dir=out_dir, - io_type=io_type, board=board, part=part, - clock_period=clock_period, hls_config=new_config, - backend=backend, - input_data_tb=input_data_tb, - output_data_tb=output_data_tb, **kwargs) + cfg['OutputDir'] = out_dir + cfg['HLSConfig'] = new_config + hls_model = hls4ml.converters.keras_to_hls(cfg) hls_model.write() hls_model.build(reset=reset, csim=csim, synth=synth, cosim=cosim, validation=validation, export=export, vsynth=vsynth) print('[hls4ml] - FIFO optimization completed') From c18064c05be9f685493a8c14f2c1f92989d7b44b Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Tue, 22 Feb 2022 14:19:34 -0600 Subject: [PATCH 087/102] no need to pass keras model --- hls4ml/model/profiling.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hls4ml/model/profiling.py b/hls4ml/model/profiling.py index 5efa332051..0b25075561 100644 --- a/hls4ml/model/profiling.py +++ b/hls4ml/model/profiling.py @@ -29,7 +29,7 @@ __torch_profiling_enabled__ = False -def optimize_fifos_depth(model, hls_model, init_large_fifo=True, reset=True, csim=True, synth=True, +def optimize_fifos_depth(hls_model, init_large_fifo=True, reset=True, csim=True, synth=True, cosim=True, validation=True, export=True, vsynth=True, **kwargs,): cfg = hls_model.config.config.copy() From d8b435dc0a2586feefbf31b0c1fdf9062d43ff7d Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Thu, 24 Feb 2022 15:29:39 -0600 Subject: [PATCH 088/102] correct scope for arty --- hls4ml/writer/vivado_accelerator_writer.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hls4ml/writer/vivado_accelerator_writer.py b/hls4ml/writer/vivado_accelerator_writer.py index ff248eb6bd..474d51816f 100644 --- a/hls4ml/writer/vivado_accelerator_writer.py +++ b/hls4ml/writer/vivado_accelerator_writer.py @@ -218,6 +218,9 @@ def modify_build_script(self, model): model.config.get_project_name()) elif 'myproject_cosim' in line: newline = line.replace('myproject_cosim', 'myproject_axi_cosim') + elif self.vivado_accelerator_config.board == "arty-a7-100t" and 'myproject_U0' in line: + # eventually, generalize this with regex + newline = line.replace('myproject_U0', 'grp_myproject_fu_4358') else: newline = line fout.write(newline) From 8c5155899814d429f7ecf34d470f487415ce7a3d Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Mon, 28 Feb 2022 08:08:24 -0600 Subject: [PATCH 089/102] weird hack for now --- hls4ml/writer/vivado_accelerator_writer.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/hls4ml/writer/vivado_accelerator_writer.py b/hls4ml/writer/vivado_accelerator_writer.py index 474d51816f..f51d3fe22c 100644 --- a/hls4ml/writer/vivado_accelerator_writer.py +++ b/hls4ml/writer/vivado_accelerator_writer.py @@ -220,7 +220,14 @@ def modify_build_script(self, model): newline = line.replace('myproject_cosim', 'myproject_axi_cosim') elif self.vivado_accelerator_config.board == "arty-a7-100t" and 'myproject_U0' in line: # eventually, generalize this with regex - newline = line.replace('myproject_U0', 'grp_myproject_fu_4358') + print("model.config.model_rf") + print(model.config.model_rf) + if int(model.config.model_rf) in [4096, 8192]: + print("grp_myproject_fu_4360") + newline = line.replace('myproject_U0', 'grp_myproject_fu_4360') + else: + print("grp_myproject_fu_4358") + newline = line.replace('myproject_U0', 'grp_myproject_fu_4358') else: newline = line fout.write(newline) From 5f3b46835cb6f23a30fc2614bb896078a6a7d00b Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Tue, 1 Mar 2022 09:09:21 -0800 Subject: [PATCH 090/102] remove prints --- hls4ml/writer/vivado_accelerator_writer.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/hls4ml/writer/vivado_accelerator_writer.py b/hls4ml/writer/vivado_accelerator_writer.py index f51d3fe22c..a82a7bbd8e 100644 --- a/hls4ml/writer/vivado_accelerator_writer.py +++ b/hls4ml/writer/vivado_accelerator_writer.py @@ -220,13 +220,9 @@ def modify_build_script(self, model): newline = line.replace('myproject_cosim', 'myproject_axi_cosim') elif self.vivado_accelerator_config.board == "arty-a7-100t" and 'myproject_U0' in line: # eventually, generalize this with regex - print("model.config.model_rf") - print(model.config.model_rf) if int(model.config.model_rf) in [4096, 8192]: - print("grp_myproject_fu_4360") newline = line.replace('myproject_U0', 'grp_myproject_fu_4360') else: - print("grp_myproject_fu_4358") newline = line.replace('myproject_U0', 'grp_myproject_fu_4358') else: newline = line From e808a05a91d9faa1eef7f72cbd2bcd030280ce8e Mon Sep 17 00:00:00 2001 From: Vladimir Loncar Date: Tue, 10 Aug 2021 16:19:40 +0200 Subject: [PATCH 091/102] Support overriding stream depth in config --- hls4ml/model/hls_layers.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hls4ml/model/hls_layers.py b/hls4ml/model/hls_layers.py index a61039f3d2..1ec8cc7050 100644 --- a/hls4ml/model/hls_layers.py +++ b/hls4ml/model/hls_layers.py @@ -456,6 +456,8 @@ def make_array_variable(self, shape, dim_names, var_name='layer{index}_out', typ def make_stream_variable(self, shape, dim_names, var_name='layer{index}_out', type_name='layer{index}_t', precision=None, depth=0): pack_factor = self.model.config.get_layer_config_value(self, 'PackFactor', default=1) + if depth == 0: + depth = self.model.config.get_layer_config_value(self, 'StreamDepth', default=0) return StreamVariable(shape, dim_names, var_name=var_name, type_name=type_name, precision=precision, n_pack=pack_factor, depth=depth, index=self.index) From e58a986913cf33c318dd4f3b3fa37deaa4708143 Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Tue, 1 Mar 2022 22:37:51 -0600 Subject: [PATCH 092/102] bug fixes --- hls4ml/model/profiling.py | 7 +++++-- hls4ml/templates/vivado_accelerator_config.py | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/hls4ml/model/profiling.py b/hls4ml/model/profiling.py index 0b25075561..961153ab3e 100644 --- a/hls4ml/model/profiling.py +++ b/hls4ml/model/profiling.py @@ -34,6 +34,7 @@ def optimize_fifos_depth(hls_model, init_large_fifo=True, reset=True, csim=True, cfg = hls_model.config.config.copy() hls_config = cfg['HLSConfig'] + out_dir = hls_model.config.get_output_dir() values = [] @@ -63,6 +64,8 @@ def populate_values(name, data, depth): hls_config['LayerName']['in_local'] = {'StreamDepth' : 10000} hls_config['LayerName']['out_local'] = {'StreamDepth': 10000} + cfg['OutputDir'] = out_dir + "_LARGE_FIFO" + cfg['HLSConfig'] = hls_config hls_model = hls4ml.converters.keras_to_hls(cfg) @@ -111,8 +114,8 @@ def populate_values(name, data, depth): new_config['LayerName']['in_local'] = {'StreamDepth': x['max'] + 1} elif 'out_local' in x['name']: new_config['LayerName']['out_local'] = {'StreamDepth': x['max'] + 1} - out_dir = hls_model.config.get_output_dir() + '_FIFO_OPT' - cfg['OutputDir'] = out_dir + + cfg['OutputDir'] = out_dir + '_FIFO_OPT' cfg['HLSConfig'] = new_config hls_model = hls4ml.converters.keras_to_hls(cfg) hls_model.write() diff --git a/hls4ml/templates/vivado_accelerator_config.py b/hls4ml/templates/vivado_accelerator_config.py index 69955a7ac5..9b524120f6 100644 --- a/hls4ml/templates/vivado_accelerator_config.py +++ b/hls4ml/templates/vivado_accelerator_config.py @@ -61,9 +61,9 @@ def __init__(self, config, model_inputs, model_outputs): if out_axi_t not in ['float', 'double']: self.output_type = self._next_factor8_type(config.backend.convert_precision_string(out_axi_t)) - if self.input_type == 'float': + if inp_axi_t == 'float': self.input_bitwidth = 32 - elif self.input_type == 'double': + elif out_axi_t == 'double': self.input_bitwidth = 64 else: self.input_bitwidth = config.backend.convert_precision_string(inp_axi_t).width From 6bbf88cb9f5a4711057b5c76792d6429b31d651e Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Tue, 1 Mar 2022 22:38:12 -0600 Subject: [PATCH 093/102] get correct type for data header --- hls4ml/writer/vivado_accelerator_writer.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/hls4ml/writer/vivado_accelerator_writer.py b/hls4ml/writer/vivado_accelerator_writer.py index a82a7bbd8e..59c9b69b38 100644 --- a/hls4ml/writer/vivado_accelerator_writer.py +++ b/hls4ml/writer/vivado_accelerator_writer.py @@ -359,8 +359,10 @@ def write_board_script(self, model): f.write('set fifo_opt 0') f.close() - # TODO: Extract parameters from the model - def write_header_file(X, y, y_keras, y_hls, n_samples, filename='data.h'): + def write_header_file(model, X, y, y_keras, y_hls, n_samples, filename='data.h'): + vivado_accelerator_config = VivadoAcceleratorConfig(model.config, model.get_input_variables(), + model.get_output_variables()) + inp_axi_t, out_axi_t, inp, out = vivado_accelerator_config.get_corrected_types() header_file = open(filename, 'w') (n_X_samples, n_X_inputs) = X.shape (n_y_samples, n_y_outputs) = y.shape @@ -369,11 +371,11 @@ def write_header_file(X, y, y_keras, y_hls, n_samples, filename='data.h'): header_file.write('#ifndef __DATA_H__\n') header_file.write('#define __DATA_H__\n') - header_file.write('/* ouf of {} */\n'.format(n_X_samples)) + header_file.write('/* out of {} */\n'.format(n_X_samples)) header_file.write('#define N_SAMPLES {}\n'.format(n_samples)) header_file.write('\n') header_file.write('#define N_X_INPUTS {}\n'.format(n_X_inputs)) - header_file.write('const float data_X_inputs[N_SAMPLES*N_X_INPUTS] = {\n') + header_file.write('const {} data_X_inputs[N_SAMPLES*N_X_INPUTS] = {{\n'.format(inp_axi_t)) for s in range(n_samples): header_file.write(' ') for i in range(n_X_inputs): @@ -405,7 +407,7 @@ def write_header_file(X, y, y_keras, y_hls, n_samples, filename='data.h'): header_file.write('/* csim outputs - for verification */\n') header_file.write('#define N_Y_HLS_OUTPUTS {}\n'.format(n_y_hls_outputs)) header_file.write('') - header_file.write('const float data_y_hls_outputs[N_SAMPLES*N_Y_HLS_OUTPUTS] = {\n') + header_file.write('const {} data_y_hls_outputs[N_SAMPLES*N_Y_HLS_OUTPUTS] = {{\n'.format(out_axi_t)) for s in range(n_samples): header_file.write(' ') for o in range(n_y_hls_outputs): From 7f209e21beaf606c9712cec79da2e463b6090fe1 Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Tue, 1 Mar 2022 22:58:56 -0600 Subject: [PATCH 094/102] smaller MCU --- .../arty-a7-100t/tcl_scripts/axi_master_design.tcl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl b/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl index 5d167bc1f6..4c45861075 100644 --- a/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl +++ b/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl @@ -53,9 +53,12 @@ apply_bd_automation -rule xilinx.com:bd_rule:microblaze -config { \ clk {/mig_7series_0/ui_clk (83 MHz)} \ debug_module {Debug Only} \ ecc {None} \ - local_mem {128KB} \ + local_mem {32KB} \ preset {None} } [get_bd_cells microblaze_mcu] +# Resize data and instruction caches +set_property -dict [list CONFIG.C_ADDR_TAG_BITS {18} CONFIG.C_CACHE_BYTE_SIZE {1024} CONFIG.C_DCACHE_ADDR_TAG {18} CONFIG.C_DCACHE_BYTE_SIZE {1024}] [get_bd_cells microblaze_mcu] + # Enable full FPU set_property -dict [list CONFIG.C_USE_FPU {2}] [get_bd_cells microblaze_mcu] From c424ac1177781df6b284938311f2cfa9f866ec55 Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Wed, 2 Mar 2022 11:47:21 -0600 Subject: [PATCH 095/102] hardcode name which works for current models :shrug: --- hls4ml/templates/vivado/build_prj.tcl | 2 +- hls4ml/writer/vivado_accelerator_writer.py | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/hls4ml/templates/vivado/build_prj.tcl b/hls4ml/templates/vivado/build_prj.tcl index aa278e7060..d77144de83 100644 --- a/hls4ml/templates/vivado/build_prj.tcl +++ b/hls4ml/templates/vivado/build_prj.tcl @@ -55,7 +55,7 @@ proc add_vcd_instructions_tcl {} { # line-by-line, read the original file while {[gets $in line] != -1} { if {[string equal "$line" "log_wave -r /"]} { - set line {current_scope /apatb_myproject_axi_top/AESL_inst_myproject_axi/myproject_U0 + set line {current_scope /apatb_myproject_axi_top/AESL_inst_myproject_axi/grp_myproject_fu_4358 set scopes [get_scopes -regexp {layer(\d*)_.*data_0_V_U.*}] current_scope /apatb_myproject_axi_top/AESL_inst_myproject_axi append scopes { } diff --git a/hls4ml/writer/vivado_accelerator_writer.py b/hls4ml/writer/vivado_accelerator_writer.py index 59c9b69b38..68f6a545b7 100644 --- a/hls4ml/writer/vivado_accelerator_writer.py +++ b/hls4ml/writer/vivado_accelerator_writer.py @@ -218,12 +218,6 @@ def modify_build_script(self, model): model.config.get_project_name()) elif 'myproject_cosim' in line: newline = line.replace('myproject_cosim', 'myproject_axi_cosim') - elif self.vivado_accelerator_config.board == "arty-a7-100t" and 'myproject_U0' in line: - # eventually, generalize this with regex - if int(model.config.model_rf) in [4096, 8192]: - newline = line.replace('myproject_U0', 'grp_myproject_fu_4360') - else: - newline = line.replace('myproject_U0', 'grp_myproject_fu_4358') else: newline = line fout.write(newline) From 6e6730db77e38cd2070ff36af6b37774ed443360 Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Wed, 2 Mar 2022 16:31:46 -0600 Subject: [PATCH 096/102] generalize with regex --- hls4ml/templates/vivado/build_prj.tcl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hls4ml/templates/vivado/build_prj.tcl b/hls4ml/templates/vivado/build_prj.tcl index d77144de83..e0a47ab25b 100644 --- a/hls4ml/templates/vivado/build_prj.tcl +++ b/hls4ml/templates/vivado/build_prj.tcl @@ -55,7 +55,7 @@ proc add_vcd_instructions_tcl {} { # line-by-line, read the original file while {[gets $in line] != -1} { if {[string equal "$line" "log_wave -r /"]} { - set line {current_scope /apatb_myproject_axi_top/AESL_inst_myproject_axi/grp_myproject_fu_4358 + set line {current_scope [get_scopes -regex /apatb_myproject_axi_top/AESL_inst_myproject_axi/grp_myproject_fu_.*] set scopes [get_scopes -regexp {layer(\d*)_.*data_0_V_U.*}] current_scope /apatb_myproject_axi_top/AESL_inst_myproject_axi append scopes { } From fb3def1d8d93db2d85058285bb7628b3080c4530 Mon Sep 17 00:00:00 2001 From: Javier Duarte Date: Thu, 3 Mar 2022 15:43:32 -0600 Subject: [PATCH 097/102] make eembc_power configurable --- .../arty-a7-100t/tcl_scripts/axi_master_design.tcl | 2 -- hls4ml/writer/vivado_accelerator_writer.py | 8 ++++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl b/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl index 4c45861075..d036abd62d 100644 --- a/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl +++ b/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl @@ -1,8 +1,6 @@ set tcldir [file dirname [info script]] source [file join $tcldir project.tcl] -set eembc_power 1 - # Project names set project_name "project_1" set design_name "design_1" diff --git a/hls4ml/writer/vivado_accelerator_writer.py b/hls4ml/writer/vivado_accelerator_writer.py index 68f6a545b7..d1f84a5db6 100644 --- a/hls4ml/writer/vivado_accelerator_writer.py +++ b/hls4ml/writer/vivado_accelerator_writer.py @@ -348,9 +348,13 @@ def write_board_script(self, model): f.write('set bit_width_hls_output {}\n'.format(in_bit)) f.write('set bit_width_hls_input {}\n'.format(out_bit)) if model.config.config['HLSConfig']['Model'].get('FIFO_opt'): - f.write('set fifo_opt 1') + f.write('set fifo_opt 1\n') else: - f.write('set fifo_opt 0') + f.write('set fifo_opt 0\n') + if model.config.config['HLSConfig']['Model'].get('EEMBC_power'): + f.write('set eembc_power 1\n') + else: + f.write('set eembc_power 0\n') f.close() def write_header_file(model, X, y, y_keras, y_hls, n_samples, filename='data.h'): From ed3ffc7eeab6a627d29f2bbfd022a48acf01f16f Mon Sep 17 00:00:00 2001 From: Giuseppe Di Guglielmo Date: Thu, 3 Mar 2022 17:12:42 -0800 Subject: [PATCH 098/102] Use SystemVerilog define to control EEMBC setup --- .../arty-a7-100t/tcl_scripts/axi_master_design.tcl | 5 +++++ .../arty-a7-100t/verilog_wrappers/design_1_wrapper.v | 2 -- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl b/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl index d036abd62d..33bdff5eca 100644 --- a/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl +++ b/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl @@ -168,6 +168,11 @@ save_bd_design #add_files -norecurse ./${myproject}_vivado_accelerator/${project_name}.srcs/sources_1/bd/${design_name}/hdl/${design_name}_wrapper.v add_files -norecurse $design_name\_wrapper.v +# In the Verilog wrapper, enable configuration for the EEMBC power setup +if { ${eembc_power} } { + set_property verilog_define EEMBC_POWER=1 [current_fileset] +} + # Run synthesis and implementation reset_run impl_1 reset_run synth_1 diff --git a/hls4ml/templates/vivado_accelerator/arty-a7-100t/verilog_wrappers/design_1_wrapper.v b/hls4ml/templates/vivado_accelerator/arty-a7-100t/verilog_wrappers/design_1_wrapper.v index 1ca1a233b1..00bdf195b8 100644 --- a/hls4ml/templates/vivado_accelerator/arty-a7-100t/verilog_wrappers/design_1_wrapper.v +++ b/hls4ml/templates/vivado_accelerator/arty-a7-100t/verilog_wrappers/design_1_wrapper.v @@ -1,7 +1,5 @@ `timescale 1 ps / 1 ps -`define EEMBC_POWER 1 - module design_1_wrapper (ddr3_sdram_addr, ddr3_sdram_ba, From 7452d5a26b7fef93f18f5e98719e8957c3391c51 Mon Sep 17 00:00:00 2001 From: GDG <3743785+GiuseppeDiGuglielmo@users.noreply.github.com> Date: Fri, 4 Mar 2022 10:00:42 -0800 Subject: [PATCH 099/102] Update axi_master_design.tcl Enable 2nd counter in timer. --- .../arty-a7-100t/tcl_scripts/axi_master_design.tcl | 1 + 1 file changed, 1 insertion(+) diff --git a/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl b/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl index 33bdff5eca..5e6a54fc09 100644 --- a/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl +++ b/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl @@ -121,6 +121,7 @@ apply_bd_automation -rule xilinx.com:bd_rule:board -config { Board_Interface {re # Add timer create_bd_cell -type ip -vlnv xilinx.com:ip:axi_timer:2.0 axi_timer_mcu +set_property -dict [list CONFIG.enable_timer2 {1}] [get_bd_cells axi_timer_mcu] # Wire timer apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { Clk_master {/mig_7series_0/ui_clk (83 MHz)} Clk_slave {Auto} Clk_xbar {/mig_7series_0/ui_clk (83 MHz)} Master {/microblaze_mcu (Periph)} Slave {/axi_timer_mcu/S_AXI} intc_ip {/microblaze_mcu_axi_periph} master_apm {0}} [get_bd_intf_pins axi_timer_mcu/S_AXI] From f4613f0936317484545c04f76b68b2b618b3f4c8 Mon Sep 17 00:00:00 2001 From: GDG <3743785+GiuseppeDiGuglielmo@users.noreply.github.com> Date: Fri, 4 Mar 2022 10:56:41 -0800 Subject: [PATCH 100/102] Update design_1_wrapper.v --- .../verilog_wrappers/design_1_wrapper.v | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/hls4ml/templates/vivado_accelerator/arty-a7-100t/verilog_wrappers/design_1_wrapper.v b/hls4ml/templates/vivado_accelerator/arty-a7-100t/verilog_wrappers/design_1_wrapper.v index 00bdf195b8..3bbaf5f9be 100644 --- a/hls4ml/templates/vivado_accelerator/arty-a7-100t/verilog_wrappers/design_1_wrapper.v +++ b/hls4ml/templates/vivado_accelerator/arty-a7-100t/verilog_wrappers/design_1_wrapper.v @@ -33,6 +33,10 @@ module design_1_wrapper pmod_uart_rxd, pmod_uart_txd, pmod_pin +`else + , + usb_uart_rxd, + usb_uart_txd `endif ); output [13:0]ddr3_sdram_addr; @@ -64,6 +68,9 @@ module design_1_wrapper input pmod_uart_rxd; output pmod_uart_txd; output pmod_pin; +`else + input usb_uart_rxd; + output usb_uart_txd; `endif @@ -107,6 +114,9 @@ module design_1_wrapper wire qspi_flash_ss_io; wire qspi_flash_ss_o; wire qspi_flash_ss_t; +`else + wire usb_uart_rxd; + wire usb_uart_txd; `endif wire reset; wire sys_clock; @@ -189,6 +199,10 @@ module design_1_wrapper .pmod_uart_rxd(pmod_uart_rxd), .pmod_uart_txd(pmod_uart_txd), .pmod_pin(pmod_pin) +`else + , + .usb_uart_rxd(usb_uart_rxd), + .usb_uart_txd(usb_uart_txd) `endif ); From 9a411f062cd8d44bcad5a3dadc65e993433613b0 Mon Sep 17 00:00:00 2001 From: Giuseppe Di Guglielmo Date: Tue, 8 Mar 2022 22:56:58 -0800 Subject: [PATCH 101/102] Fix but w/ clock connection that stopped the QSPI boot --- .../arty-a7-100t/tcl_scripts/axi_master_design.tcl | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl b/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl index 5e6a54fc09..f06b3b8936 100644 --- a/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl +++ b/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl @@ -149,12 +149,16 @@ if { ${eembc_power} } { # Add Quad SPI for cold boot if { ${eembc_power} } { create_bd_cell -type ip -vlnv xilinx.com:ip:axi_quad_spi:3.2 axi_quad_spi_0 - set_property -dict [list CONFIG.C_SPI_MEMORY {3} CONFIG.C_SPI_MODE {2} CONFIG.C_SCK_RATIO {2}] [get_bd_cells axi_quad_spi_0] + set_property -dict [list CONFIG.C_SPI_MEMORY {3}] [get_bd_cells axi_quad_spi_0] apply_bd_automation -rule xilinx.com:bd_rule:board -config { Board_Interface {qspi_flash ( Quad SPI Flash ) } Manual_Source {Auto}} [get_bd_intf_pins axi_quad_spi_0/SPI_0] apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config { Clk_master {/mig_7series_0/ui_clk (83 MHz)} Clk_slave {Auto} Clk_xbar {/mig_7series_0/ui_clk (83 MHz)} Master {/microblaze_mcu (Periph)} Slave {/axi_quad_spi_0/AXI_LITE} intc_ip {/microblaze_mcu_axi_periph} master_apm {0}} [get_bd_intf_pins axi_quad_spi_0/AXI_LITE] set_property -dict [list CONFIG.CLKOUT3_USED {true} CONFIG.CLKOUT3_REQUESTED_OUT_FREQ {50} CONFIG.MMCM_CLKOUT2_DIVIDE {20} CONFIG.NUM_OUT_CLKS {3} CONFIG.CLKOUT3_JITTER {151.636} CONFIG.CLKOUT3_PHASE_ERROR {98.575}] [get_bd_cells clk_wizard] connect_bd_net [get_bd_pins clk_wizard/clk_out3] [get_bd_pins axi_quad_spi_0/ext_spi_clk] - set_property -dict [list CONFIG.C_SPI_MEMORY {3}] [get_bd_cells axi_quad_spi_0] + + # BUG FIX + disconnect_bd_net /clk_wizard_clk_out1 [get_bd_pins axi_quad_spi_0/ext_spi_clk] + connect_bd_net [get_bd_pins axi_quad_spi_0/ext_spi_clk] [get_bd_pins mig_7series_0/ui_clk] + add_files -fileset constrs_1 -norecurse qspi.xdc } From 5c0ad77f9d4d61a16c4eb768275fea51e8b4a503 Mon Sep 17 00:00:00 2001 From: Giuseppe Di Guglielmo Date: Wed, 9 Mar 2022 10:27:39 -0800 Subject: [PATCH 102/102] Fix bug w/ clock connection that stopped the QSPI boot --- .../arty-a7-100t/tcl_scripts/axi_master_design.tcl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl b/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl index f06b3b8936..67d667b063 100644 --- a/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl +++ b/hls4ml/templates/vivado_accelerator/arty-a7-100t/tcl_scripts/axi_master_design.tcl @@ -156,7 +156,7 @@ if { ${eembc_power} } { connect_bd_net [get_bd_pins clk_wizard/clk_out3] [get_bd_pins axi_quad_spi_0/ext_spi_clk] # BUG FIX - disconnect_bd_net /clk_wizard_clk_out1 [get_bd_pins axi_quad_spi_0/ext_spi_clk] + delete_bd_objs [get_bd_nets clk_wizard_clk_out3] connect_bd_net [get_bd_pins axi_quad_spi_0/ext_spi_clk] [get_bd_pins mig_7series_0/ui_clk] add_files -fileset constrs_1 -norecurse qspi.xdc