def _build_network(self):
        self.X = Parameter(is_placeholder=True, name="X")
        self.Y = Parameter(is_placeholder=True, name="Y")

        prev_inp = self.X
        prev_shape = self.inp_shape
        for idx, num_units in enumerate(self.hidden_layers):
            W = Parameter(np.random.random((prev_shape, num_units)),
                          requires_grad=True,
                          name="W" + str(idx + 1))
            B = Parameter(np.zeros((num_units, )),
                          requires_grad=True,
                          name="B" + str(idx + 1))
            if idx == len(self.hidden_layers) - 1:
                out = Node.Add(Node.Mul(prev_inp, W), B)
                out = Node.SoftmaxCrossEnt(out, self.Y)
            else:
                out = Node.ReLU(Node.Add(Node.Mul(prev_inp, W), B))
            prev_inp = out
            prev_shape = num_units
        self.loss = out