code: def convert_lstm(
      builder, layer, input_names, output_names, keras_layer
  ):
      """Convert an LSTM layer from keras to coreml.
  
      Parameters
      ----------
      keras_layer: layer
          A keras layer object.
  
      builder: NeuralNetworkBuilder
          A neural network builder object.
      """
  
      hidden_size = keras_layer.output_dim
      input_size = keras_layer.input_shape[-1]
      if keras_layer.consume_less not in ["cpu", "gpu"]:
          raise ValueError(
              "Cannot convert Keras layer with consume_less = %s"
              % keras_layer.consume_less
          )
  
      output_all = keras_layer.return_sequences
      reverse_input = keras_layer.go_backwards
  
      # Keras: I C F O; W_x, W_h, b
      # CoreML: I F O G; W_h and W_x are separated
      W_h, W_x, b = ([], [], [])
      if keras_layer.consume_less == "cpu":
          W_h.append(keras_layer.get_weights()[1].T)
          W_h.append(keras_layer.get_weights()[7].T)
          W_h.append(keras_layer.get_weights()[10].T)
          W_h.append(keras_layer.get_weights()[4].T)
  
          W_x.append(keras_layer.get_weights()[0].T)
          W_x.append(keras_layer.get_weights()[6].T)
          W_x.append(keras_layer.get_weights()[9].T)
          W_x.append(keras_layer.get_weights()[3].T)
  
          b.append(keras_layer.get_weights()[2])
          b.append(keras_layer.get_weights()[8])
          b.append(keras_layer.get_weights()[11])
          b.append(keras_layer.get_weights()[5])
      else:
          keras_W_h = keras_layer.get_weights()[1].T
          W_h.append(keras_W_h[0 * hidden_size :][:hidden_size])
          W_h.append(keras_W_h[1 * hidden_size :][:hidden_size])
          W_h.append(keras_W_h[3 * hidden_size :][:hidden_size])
          W_h.append(keras_W_h[2 * hidden_size :][:hidden_size])
  
          keras_W_x = keras_layer.get_weights()[0].T
          W_x.append(keras_W_x[0 * hidden_size :][:hidden_size])
          W_x.append(keras_W_x[1 * hidden_size :][:hidden_size])
          W_x.append(keras_W_x[3 * hidden_size :][:hidden_size])
          W_x.append(keras_W_x[2 * hidden_size :][:hidden_size])
  
          keras_b = keras_layer.get_weights()[2]
          b.append(keras_b[0 * hidden_size :][:hidden_size])
          b.append(keras_b[1 * hidden_size :][:hidden_size])
          b.append(keras_b[3 * hidden_size :][:hidden_size])
          b.append(keras_b[2 * hidden_size :][:hidden_size])
  
      # Set activation type
      inner_activation_str = _get_recurrent_activation_name_from_keras(
          keras_layer.inner_activation
      )
      activation_str = _get_recurrent_activation_name_from_keras(
          keras_layer.activation
      )
  
      # Add to the network
      builder.add_unilstm(
          name=layer,
          W_h=W_h,
          W_x=W_x,
          b=b,
          hidden_size=hidden_size,
          input_size=input_size,
          input_names=input_names,
          output_names=output_names,
          inner_activation=inner_activation_str,
          cell_state_update_activation=activation_str,
          output_activation=activation_str,
          output_all=output_all,
          reverse_input=reverse_input,
      )
  
imports: from .None import _utils
  import keras
  import numpy
label_desc: Use image node_id 15 for calling a global function with example usage: convert_lstm(builder, layer, input_names, output_names, keras_layer) without return types