def _f_preactivations(self, X):
preactivations_list = list()<EOL>net = X<EOL>preactivations_list.append(X)<EOL>for W, b, i in zip(self.W_list, self.b_list, np.arange(len(self.W_list))):<EOL><INDENT>net = np.dot(net, W)<EOL>net = net + b<EOL>if i < len(self.W_list) - <NUM_LIT:1>:<EOL><INDENT>preactivations_list.append(net)<EOL>net = self.act(net)<EOL><DEDENT><DEDENT>return preactivations_list<EOL>
Computes the network preactivations, i.e. the results of all intermediate linear layers before applying the
        activation function on them
        :param X: input data
        :return: list of preactivations [X, XW+b, f(XW+b)W+b, ...]