'Builds an inference pipeline.
This always uses the whole pipeline.
Args:
handle: Handle tensor for the ComputeSession.
use_moving_average: Whether or not to read from the moving
average variables instead of the true parameters. Note: it is not
possible to make gradient updates when this is True.
Returns:
handle: Handle after annotation.'

def build_inference(self, handle, use_moving_average=False):

    self.read_from_avg = use_moving_average
    network_states = {}
    for comp in self.components:
        network_states[comp.name] = component.NetworkState()
        handle = dragnn_ops.init_component_data(handle, beam_size=comp.inference_beam_size, component=comp.name)
        master_state = component.MasterState(handle, dragnn_ops.batch_size(handle, component=comp.name))
        with tf.control_dependencies([handle]):
            handle = comp.build_greedy_inference(master_state, network_states)
        handle = dragnn_ops.write_annotations(handle, component=comp.name)
    self.read_from_avg = False
    return handle
