code: def train(self, training_set, iterations=500):
          if len(training_set) > 2:
              self.__X = np.matrix([example[0] for example in training_set])
              if self.__num_labels == 1:
                  self.__y = np.matrix([example[1] for example in training_set]).reshape((-1, 1))
              else:
                  eye = np.eye(self.__num_labels)
                  self.__y = np.matrix([eye[example[1]] for example in training_set])
          else:
              self.__X = np.matrix(training_set[0])
              if self.__num_labels == 1:
                  self.__y = np.matrix(training_set[1]).reshape((-1, 1))
              else:
                  eye = np.eye(self.__num_labels)
                  self.__y = np.matrix([eye[index] for sublist in training_set[1] for index in sublist])
          self.__m = self.__X.shape[0]
          self.__input_layer_size = self.__X.shape[1]
          self.__sizes = [self.__input_layer_size]
          self.__sizes.extend(self.__hidden_layers)
          self.__sizes.append(self.__num_labels)
          initial_theta = []
          for count in range(len(self.__sizes) - 1):
              epsilon = np.sqrt(6) / np.sqrt(self.__sizes[count]+self.__sizes[count+1])
              initial_theta.append(np.random.rand(self.__sizes[count+1],self.__sizes[count]+1)*2*epsilon-epsilon)
          initial_theta = self.__unroll(initial_theta)
          self.__thetas = self.__roll(fmin_bfgs(self.__cost_function, initial_theta, fprime=self.__cost_grad_function, maxiter=iterations))