code: def __init__(self, in_size, hidden_size):
      """
      This class implements a GRU.
      """
      # TODO: go back to 0.01 initialization
      # TODO: use glorot initialization?
      # input weights
      self.hidden_size = hidden_size
      self.in_size = in_size
  
      # input to candidate
      self.Wxc = np.zeros((hidden_size, in_size))
      # input to reset
      self.Wxr = np.zeros((hidden_size, in_size))
      # input to interpolate
      self.Wxz = np.zeros((hidden_size, in_size))
  
      # Recurrent weights
      # hidden to candidate
      self.Rhc = np.zeros((hidden_size, hidden_size))
      # hidden to reset
      self.Rhr = np.zeros((hidden_size, hidden_size))
      # hidden to interpolate
      self.Rhz = np.zeros((hidden_size, hidden_size))
  
      # biases
      self.bc = np.zeros((hidden_size, 1))  # bias for candidate
      self.br = np.zeros((hidden_size, 1))  # bias for reset
      self.bz = np.zeros((hidden_size, 1))  # bias for interpolate
  
      self.weights = [
          self.Wxc,
          self.Wxr,
          self.Wxz,
          self.Rhc,
          self.Rhr,
          self.Rhz,
          self.bc,
          self.br,
          self.bz,
      ]
  
      # I used this for grad checking, but I should clean up
      self.names = [
          "Wxc",
          "Wxr",
          "Wxz",
          "Rhc",
          "Rhr",
          "Rhz",
          "bc",
          "br",
          "bz",
      ]
  
      self.weights_ind_Wxc = 0
      self.weights_ind_Wxr = 1
      self.weights_ind_Wxz = 2
      self.weights_ind_Rhc = 3
      self.weights_ind_Rhr = 4
      self.weights_ind_Rhz = 5
      self.weights_ind_bc = 6
      self.weights_ind_br = 7
      self.weights_ind_bz = 8
  
imports: import numpy
label_desc: Use image node_id 1 to create a new GRU object from inherited base classes: object with example: obj = GRU(in_size, hidden_size)