code: def eval_network(self, X):
      for i, (W, b) in enumerate(zip(self.Ws, self.bs)):
          X = tf.matmul(X, W) + b
          if i < len(self.bs) - 1:
              X = self.activation(X)
  
      pis, mus, sigmas = tf.split(X, 3, axis=1)
      pis = tf.nn.softmax(pis)  # make sure they normalize to 1
      sigmas = tf.exp(sigmas)  # make sure std. dev. are positive
  
      return pis, mus, sigmas
  
file_path: GPflow/notebooks/tailor/mixture_density_network.pct.py
imports: import matplotlib.pyplot
  import numpy
  from typing import Callable, Optional, Tuple
  import tensorflow
  from gpflow.base import Parameter
  from gpflow.models import BayesianModel, ExternalDataTrainingLossMixin
  from gpflow.utilities import print_summary
  from gpflow.ci_utils import reduce_in_tests
  from gpflow.optimizers import Scipy
  from sklearn.datasets import make_moons
label_desc: Use image node_id 3 for calling the MDN obj's underlying member method code with example usage: obj.eval_network(X) and returns: pis,  mus,  sigmas