code: def conv_gru(x,
               kernel_size,
               filters,
               padding="SAME",
               dilation_rate=(1, 1),
               name=None,
               reuse=None):
    
  
    # Let's make a shorthand for conv call first.
    def do_conv(args, name, bias_start, padding):
      return conv(
          args,
          filters,
          kernel_size,
          padding=padding,
          dilation_rate=dilation_rate,
          bias_initializer=tf.constant_initializer(bias_start),
          name=name)
  
    # Here comes the GRU gate.
    with tf.variable_scope(
        name, default_name="conv_gru", values=[x], reuse=reuse):
      reset = saturating_sigmoid(do_conv(x, "reset", 1.0, padding))
      gate = saturating_sigmoid(do_conv(x, "gate", 1.0, padding))
      candidate = tf.tanh(do_conv(reset * x, "candidate", 0.0, padding))
      return gate * x + (1 - gate) * candidate
docs: Convolutional GRU in 1 dimension.