def METHOD_NAME(self):
    K.clear_session()
    input_dim = 20
    output_dim = 10
    context = 7
    units = 1024
    dropouts = (0.1, 0.1, 0)
    # Define input tensor [batch, time, features]
    input_tensor = layers.Input([None, input_dim], name='X')
    # Add 4th dimension [batch, time, frequency, channel]
    x = layers.Lambda(keras.backend.expand_dims,
                      arguments=dict(axis=-1))(input_tensor)
    # Fill zeros around time dimension
    x = layers.ZeroPadding2D(padding=(context, 0))(x)
    # Convolve signal in time dim
    receptive_field = (2 * context + 1, input_dim)
    x = layers.Conv2D(filters=units, kernel_size=receptive_field)(x)
    # Squeeze into 3rd dim array
    x = layers.Lambda(keras.backend.squeeze, arguments=dict(axis=2))(x)
    # Add non-linearity
    x = layers.ReLU(max_value=20)(x)
    # Use dropout as regularization
    x = layers.Dropout(rate=dropouts[0])(x)
    # 2nd and 3rd FC layers do a feature extraction base on a narrow
    # context of convolutional layer
    x = layers.TimeDistributed(layers.Dense(units))(x)
    x = layers.ReLU(max_value=20)(x)
    x = layers.Dropout(rate=dropouts[1])(x)
    x = layers.TimeDistributed(layers.Dense(units))(x)
    x = layers.ReLU(max_value=20)(x)
    x = layers.Dropout(rate=dropouts[2])(x)
    # Use recurrent layer to have a broader context
    x = layers.Bidirectional(layers.LSTM(units, return_sequences=True),
                             merge_mode='sum')(x)
    # Return at each time step logits along characters. Then CTC
    # computation is more stable, in contrast to the softmax.
    output_tensor = layers.TimeDistributed(layers.Dense(output_dim))(x)
    model = keras.Model(input_tensor, output_tensor, name='DeepSpeech')
    data = np.random.rand(2, 3, input_dim).astype(np.float32)
    expected = model.predict(data)
    onnx_model = mock_keras2onnx.convert_keras(model, model.name)
    self.assertTrue(
        run_keras_and_ort(onnx_model.graph.name, onnx_model, model, data, expected, self.model_files))