class GRU: def __init__(self, input_size, hidden_size, output_size, init_method='xavier'): self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size self.weight_initializer = WeightInitializer(method=init_method) # Initialize weights self.wz = self.weight_initializer.initialize((hidden_size, hidden_size + input_size)) self.wr = self.weight_initializer.initialize((hidden_size, hidden_size + input_size)) self.wh = self.weight_initializer.initialize((hidden_size, hidden_size + input_size)) # Initialize biases self.bz = np.zeros((hidden_size, 1)) self.br = np.zeros((hidden_size, 1)) self.bh = np.zeros((hidden_size, 1)) # Initialize output layer weights and biases self.why = self.weight_initializer.initialize((output_size, hidden_size)) self.by = np.zeros((output_size, 1))