class_docstr: Conjugate Gradient algorithm.
  
  Parameters
  ----------
  update_function : ``fletcher_reeves``, ``polak_ribiere``,    ``hentenes_stiefel``, ``dai_yuan``, ``liu_storey``
      Update function. Defaults to ``fletcher_reeves``.
  
  epsilon : float
      Ensures computational stability during the division in
      ``update_function`` when denominator is very small number.
      Defaults to ``1e-7``.
  
  {WolfeLineSearchForStep.Parameters}
  
  {BaseOptimizer.network}
  
  {BaseOptimizer.loss}
  
  {BaseOptimizer.show_epoch}
  
  {BaseOptimizer.shuffle_data}
  
  {BaseOptimizer.signals}
  
  {BaseOptimizer.verbose}
  
  {BaseOptimizer.regularizer}
  
  Attributes
  ----------
  {BaseOptimizer.Attributes}
  
  Methods
  -------
  {BaseOptimizer.Methods}
  
  Examples
  --------
  >>> from sklearn import datasets, preprocessing
  >>> from sklearn.model_selection import train_test_split
  >>> from neupy import algorithms, layers
  >>>
  >>> dataset = datasets.load_boston()
  >>> data, target = dataset.data, dataset.target
  >>>
  >>> data_scaler = preprocessing.MinMaxScaler()
  >>> target_scaler = preprocessing.MinMaxScaler()
  >>>
  >>> x_train, x_test, y_train, y_test = train_test_split(
  ...     data_scaler.fit_transform(data),
  ...     target_scaler.fit_transform(target),
  ...     test_size=0.15
  ... )
  >>>
  >>> cgnet = algorithms.ConjugateGradient(
  ...     network=[
  ...         layers.Input(13),
  ...         layers.Sigmoid(50),
  ...         layers.Sigmoid(1),
  ...     ],
  ...     update_function='fletcher_reeves',
  ...     verbose=False
  ... )
  >>>
  >>> cgnet.train(x_train, y_train, epochs=100)
  >>> y_predict = cgnet.predict(x_test).round(1)
  >>>
  >>> real = target_scaler.inverse_transform(y_test)
  >>> predicted = target_scaler.inverse_transform(y_predict)
  
  References
  ----------
  [1] Jorge Nocedal, Stephen J. Wright, Numerical Optimization.
      Chapter 5, Conjugate Gradient Methods, p. 101-133
code: def init_functions(self):
      n_parameters = self.network.n_parameters
      self.variables.update(
          prev_delta=tf.Variable(
              tf.zeros([n_parameters]),
              name="conj-grad/prev-delta",
              dtype=tf.float32,
          ),
          prev_gradient=tf.Variable(
              tf.zeros([n_parameters]),
              name="conj-grad/prev-gradient",
              dtype=tf.float32,
          ),
          iteration=tf.Variable(
              asfloat(self.last_epoch),
              name="conj-grad/current-iteration",
              dtype=tf.float32,
          ),
      )
      super(ConjugateGradient, self).init_functions()
  
file_path: neupy/neupy/algorithms/gd/conjgrad.py
imports: import tensorflow
  from neupy.utils import dot, function_name_scope, asfloat, make_single_vector
  from neupy.core.properties import ChoiceProperty, NumberProperty, WithdrawProperty
  from neupy.utils.tf_utils import setup_parameter_updates
  from .base import BaseOptimizer
  from .quasi_newton import safe_division, WolfeLineSearchForStep
label_desc: Use image node_id 1 for calling the ConjugateGradient obj's underlying member method code with example usage: obj.init_functions() without return types