def __init__(self,
              model_id_node,
              model_cam_dir_node,
              iterator_input_nodes,
              blank_id):
     super(IdAndCameraDirConvLoss, self).__init__(
         _conv11_to_vector(model_id_node),
         _conv11_to_vector(model_cam_dir_node),
         iterator_input_nodes,
         blank_id)
    def make_validation_epoch_callbacks(epoch_logger):
        loss_monitor = MeanOverEpoch(
            loss_node,
            callbacks=[print_validation_loss,
                       SavesH5AtMinimum(model,
                                        training_state,
                                        basepath + '_best.h5'),
                       SavesAtMinimum(things_to_save, basepath + '_best.pkl')])
        epoch_logger.subscribe_to('validation mean loss', loss_monitor)

        id_loss_monitor = MeanOverEpoch(loss_node.id_loss, callbacks=[])
        epoch_logger.subscribe_to('validation cross-entropy',
                                  id_loss_monitor)

        pose_error_monitor = MeanOverEpoch(loss_node.cam_dir_loss,
                                           callbacks=[])
        epoch_logger.subscribe_to('validation orientation error',
                                  pose_error_monitor)

        # TODO: support NamedTuples for Node.inputs
        target_id_node = input_nodes[1]
        assert_equal(target_id_node.output_format.shape, (-1, ))
        assert_equal(str(target_id_node.output_symbol.dtype), 'int32')
        misclassification = Misclassification(
            _conv11_to_vector(model.id_layers[-1]),
            target_id_node)
        misclassification_monitor = MeanOverEpoch(misclassification,
                                                  callbacks=[])
        epoch_logger.subscribe_to('validation misclassification',
                                  misclassification_monitor)

        return [id_loss_monitor,
                pose_error_monitor,
                misclassification_monitor,
                loss_monitor]