Different output size

When converting the TensorFlow model below to a float-type TFLite model using:

converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS]
converter.inference_input_type = tf.float32
converter.inference_output_type = tf.float32
tflite_model = converter.convert()

everything works fine. However, when converting this TFLite model to a Hailo-8 model using:

chosen_hw_arch = "hailo8"
model_name = "hailo8_model"

# Parsing the model to Hailo format
runner = ClientRunner(hw_arch=chosen_hw_arch)
hn, npz = runner.translate_tf_model(tflite_model_path, model_name)

the output size changes.

Specifically, with an input of size [1, 1, 258, 91], the original model produces an output of [1, 1, 258, 91], but after converting to a Hailo-8 model, the output becomes [1, 1, 162, 91].

Here is the TensorFlow model code:

input_dim = 91 
seq_len = 258 
basic_frames = 2048
decoder_const = 6
output_units = 1024
dropout_p = 0.5

def NETtf(seq_len, input_dim, basic_frames, output_units, decoder_const, dropout_p):
    
    input_layer = layers.Input(shape=(1, seq_len, input_dim))
     
    x = layers.Conv2D(filters=basic_frames, kernel_size=(1, 7), strides=(1, 1), padding='valid', use_bias=True)(input_layer)
    x = layers.ReLU()(x)
    x = layers.MaxPooling2D(pool_size=(1, 3), strides=(1, 3), padding='valid')(x)
    
    x = layers.Conv2D(filters=basic_frames, kernel_size=(1, 7), strides=(1, 1), padding='valid', use_bias=True)(x)
    x = layers.ReLU()(x)
    x = layers.MaxPooling2D(pool_size=(1, 3), strides=(1, 3), padding='valid')(x)

    x = layers.Conv2D(filters=basic_frames, kernel_size=(1, 3), strides=(1, 1), padding='valid', use_bias=True)(x)
    x = layers.ReLU()(x)

    x = layers.Conv2D(filters=basic_frames, kernel_size=(1, 3), strides=(1, 1), padding='valid', use_bias=True)(x)
    x = layers.ReLU()(x)

    x = layers.Conv2D(filters=basic_frames, kernel_size=(1, 3), strides=(1, 1), padding='valid', use_bias=True)(x)
    x = layers.ReLU()(x)

    x = layers.Conv2D(filters=basic_frames, kernel_size=(1, 3), strides=(1, 1), padding='valid', use_bias=True)(x)
    x = layers.ReLU()(x)
    x = layers.MaxPooling2D(pool_size=(1, 3), strides=(1, 3), padding='valid')(x)

    x = layers.Flatten()(x)

    x = layers.Dense(output_units, use_bias=True)(x)
    x = layers.ReLU()(x)
    x = layers.Dropout(dropout_p)(x)
    
    x = layers.Dense(output_units, use_bias=True)(x)
    x = layers.ReLU()(x)
    x = layers.Dropout(dropout_p)(x)    
    
    x = layers.Dense(output_units, use_bias=True)(x)
    x = layers.ReLU()(x)
    x = layers.Dropout(dropout_p)(x)
    
    x = layers.Dense(decoder_const * basic_frames, use_bias=True)(x)
    x = layers.ReLU()(x)
    x = layers.Dropout(dropout_p)(x)
    
    x = layers.Reshape((1, decoder_const, basic_frames))(x)

    x = layers.Conv2DTranspose(filters=basic_frames, kernel_size=(1, 5), strides=(1, 3), padding='valid', use_bias=True)(x)
    x = layers.ReLU()(x)
    
    x = layers.Conv2DTranspose(filters=basic_frames, kernel_size=(1, 3), strides=(1, 1), padding='valid', use_bias=True)(x)
    x = layers.ReLU()(x)
    
    x = layers.Conv2DTranspose(filters=basic_frames, kernel_size=(1, 3), strides=(1, 1), padding='valid', use_bias=True)(x)
    x = layers.ReLU()(x)
    
    x = layers.Conv2DTranspose(filters=basic_frames, kernel_size=(1, 3), strides=(1, 1), padding='valid', use_bias=True)(x)
    x = layers.ReLU()(x)
    
    x = layers.Conv2DTranspose(filters=basic_frames, kernel_size=(1, 9), strides=(1, 3), padding='valid', use_bias=True)(x)
    x = layers.ReLU()(x)
    
    x = layers.Conv2DTranspose(filters=input_dim, kernel_size=(1, 9), strides=(1, 3), padding='valid', use_bias=True)(x)
    
    model = Model(inputs=input_layer, outputs=x)
    
    return model

What could be causing this issue, and how can I resolve it?

Hey @user128,

Welcome to the Hailo Community!

The shape difference you’re experiencing is likely due to how Hailo handles padding or optimizes certain layers. To resolve this:

  • Check your logs to identify whether pooling or transposed convolution layers are being affected
  • Try setting explicit padding (SAME) and ensure your layer order is consistent
  • Use the start_node_names and end_node_names arguments in translate_tf_model to help debug how DFC is interpreting your model structure

Thanks for your reply.

I resolve it by using ‘same’ padding.

1 Like

Happy to hear it worked for you! If you have any other questions don’t hesitate to reach out. We’re always here to help.