def make_optimize_action(self, model, session=None, var_list=None, **kwargs):
        """
        Build Optimization action task with Tensorflow optimizer.

            :param model: GPflow model.
            :param session: Tensorflow session.
            :param var_list: List of Tensorflow variables to train.
            :param feed_dict: Tensorflow feed_dict dictionary.
            :param kwargs: Extra parameters passed to `make_optimize_tensor`.
            :return: Optimization action.
        """
        if model is None or not isinstance(model, Model):
            raise ValueError('Unknown type passed for optimization.')
        session = model.enquire_session(session)
        feed_dict = kwargs.pop('feed_dict', None)
        feed_dict_update = self._gen_feed_dict(model, feed_dict)
        run_kwargs = {} if feed_dict_update is None else {'feed_dict': feed_dict_update}
        optimizer_tensor = self.make_optimize_tensor(model, session, var_list=var_list, **kwargs)
        opt = Optimization()
        opt.with_optimizer(self)
        opt.with_model(model)
        opt.with_optimizer_tensor(optimizer_tensor)
        opt.with_run_kwargs(**run_kwargs)
        return opt