Exemple #1
0
    def add_overlay(self, origin, name):
        """
        Creates an overlay (meaning e.g. a subset or other kind of modified version) of an existing corpus

        :param str origin: name/corpus_key of the original common rasr parameters with associated alignments, features, etc
        :param str name: name/corpus_key of the new overlay over the original
        :return:
        """
        self.crp[name] = rasr.CommonRasrParameters(base=self.crp[origin])

        self.alignments[name] = {}
        self.ctm_files[name] = {}
        self.feature_caches[name] = copy.deepcopy(self.feature_caches[origin])
        self.feature_bundles[name] = copy.deepcopy(
            self.feature_bundles[origin])
        self.feature_flows[name] = copy.deepcopy(self.feature_flows[origin])
        self.feature_scorers[name] = copy.deepcopy(
            self.feature_scorers[origin])
        self.lattice_caches[name] = {}
        self.lattice_bundles[name] = {}
        self.mixtures[name] = {}
        self.nn_configs[name] = {}
        self.nn_models[name] = {}

        self.normalization_matrices[name] = {}

        self.jobs[name] = {}
Exemple #2
0
    def set_corpus(self, name, corpus, concurrent, segment_path=None):
        """
        Initialize collections and crp for a new corpus

        :param str name: will be the corpus_key
        :param CorpusObject corpus:
        :param int concurrent:
        :param util.MultiOutputPath segment_path:
        :return:
        """
        self.crp[name] = rasr.CommonRasrParameters(base=self.crp["base"])
        rasr.crp_set_corpus(self.crp[name], corpus)
        self.crp[name].concurrent = concurrent
        self.crp[name].segment_path = segment_path

        self.alignments[name] = {}
        self.ctm_files[name] = {}
        self.feature_caches[name] = {}
        self.feature_bundles[name] = {}
        self.feature_flows[name] = {}
        self.feature_scorers[name] = {}
        self.lattice_caches[name] = {}
        self.lattice_bundles[name] = {}
        self.mixtures[name] = {}
        self.nn_configs[name] = {}
        self.nn_models[name] = {}

        self.normalization_matrices[name] = {}

        self.jobs[name] = {}
Exemple #3
0
    def __init__(self):
        self.crp = {"base": rasr.CommonRasrParameters()}
        rasr.crp_add_default_output(self.crp["base"])

        self.default_mixture_scorer = rasr.DiagonalMaximumScorer

        # collections which are a nested dict of corpus_key -> name -> some object / some container
        # container can be list, tuple or dict
        self.alignments = {}  # type: Dict[str,Dict[str,Union[List[Any], Any]]]
        # corpus_key -> alignment_name -> element or list of e.g. FlowAttributes with cache_mode containing caches and bundle
        self.ctm_files = {}
        self.feature_caches = {}
        self.feature_bundles = {}
        self.feature_flows = {}
        self.feature_scorers = {}
        self.lattice_caches = {}
        self.lattice_bundles = {}
        self.mixtures = {}
        self.nn_configs = {}
        self.nn_models = {}

        self.allophone_files = {}
        self.cart_questions = {}
        self.normalization_matrices = {}
        self.stm_files = {}
        self.glm_files = {}

        self.scorers = {}
        self.scorer_args = {}
        self.scorer_hyp_arg = {}

        self.jobs = {"base": {}}  # type: Dict[str,Dict[str,Job]]
Exemple #4
0
    def build_crp(
        self,
        am_args,
        corpus_object,
        concurrent,
        segment_path,
        lexicon_args,
        cart_tree_path=None,
        allophone_file=None,
        lm_args=None,
    ):
        """
        constructs and returns a CommonRasrParameters from the given settings and files
        """
        crp = rasr.CommonRasrParameters()
        rasr.crp_add_default_output(crp)
        crp.acoustic_model_config = am.acoustic_model_config(**am_args)
        rasr.crp_set_corpus(crp, corpus_object)
        crp.concurrent = concurrent
        crp.segment_path = segment_path

        crp.lexicon_config = rasr.RasrConfig()
        crp.lexicon_config.file = lexicon_args["filename"]
        crp.lexicon_config.normalize_pronunciation = lexicon_args[
            "normalize_pronunciation"]

        if "add_from_lexicon" in lexicon_args:
            crp.acoustic_model_config.allophones.add_from_lexicon = lexicon_args[
                "add_from_lexicon"]
        if "add_all" in lexicon_args:
            crp.acoustic_model_config.allophones.add_all = lexicon_args[
                "add_all"]

        if cart_tree_path is not None:
            crp.acoustic_model_config.state_tying.type = "cart"
            crp.acoustic_model_config.state_tying.file = cart_tree_path

        if lm_args is not None:
            crp.language_model_config = rasr.RasrConfig()
            crp.language_model_config.type = lm_args["type"]
            crp.language_model_config.file = lm_args["filename"]
            crp.language_model_config.scale = lm_args["scale"]

        if allophone_file is not None:
            crp.acoustic_model_config.allophones.add_from_file = allophone_file

        self.crp = crp
Exemple #5
0
    def copy_from_system(self, origin_system, origin_name, target_name=None):
        """
        Import the dictionaries from another System
        :param System origin_system:
        :param str origin_name: Name of the dataset in another system
        :param str target_name: Name of the dataset in current system (optional) (default=origin_name)
        :return:
        """
        if not target_name:
            target_name = origin_name

        self.crp[target_name] = rasr.CommonRasrParameters(
            base=origin_system.crp[origin_name])

        self.alignments[target_name] = copy.deepcopy(
            origin_system.alignments[origin_name])
        self.ctm_files[target_name] = copy.deepcopy(
            origin_system.ctm_files[origin_name])
        self.feature_caches[target_name] = copy.deepcopy(
            origin_system.feature_caches[origin_name])
        self.feature_bundles[target_name] = copy.deepcopy(
            origin_system.feature_bundles[origin_name])
        self.feature_flows[target_name] = copy.deepcopy(
            origin_system.feature_flows[origin_name])
        self.feature_scorers[target_name] = copy.deepcopy(
            origin_system.feature_scorers[origin_name])
        self.lattice_caches[target_name] = copy.deepcopy(
            origin_system.lattice_caches[origin_name])
        self.lattice_bundles[target_name] = copy.deepcopy(
            origin_system.lattice_bundles[origin_name])
        self.mixtures[target_name] = copy.deepcopy(
            origin_system.mixtures[origin_name])
        self.nn_configs[target_name] = copy.deepcopy(
            origin_system.nn_configs[origin_name])
        self.nn_models[target_name] = copy.deepcopy(
            origin_system.nn_models[origin_name])
        # self.stm_files      [target_name] = copy.deepcopy(origin_system.stm_files[origin_name])

        self.normalization_matrices[target_name] = copy.deepcopy(
            origin_system.normalization_matrices[origin_name])

        self.jobs[target_name] = {}
    def __init__(
        self,
        original_crp,
        initial_flow,
        context_flow,
        alignment,
        questions,
        num_dim,
        num_iter,
        cart_sum_args=None,
        cart_estimate_args=None,
        lda_scatter_args=None,
        lda_estimate_args=None,
        eigenvalue_args=None,
        generalized_eigenvalue_args=None,
    ):
        cart_sum_args = {} if cart_sum_args is None else cart_sum_args
        cart_estimate_args = {} if cart_estimate_args is None else cart_estimate_args
        lda_scatter_args = {} if lda_scatter_args is None else lda_scatter_args
        lda_estimate_args = {} if lda_estimate_args is None else lda_estimate_args
        eigenvalue_args = {} if eigenvalue_args is None else eigenvalue_args
        generalized_eigenvalue_args = ({}
                                       if generalized_eigenvalue_args is None
                                       else generalized_eigenvalue_args)

        self.cart_sum_jobs = []
        self.cart_estimate_jobs = []
        self.lda_scatter_jobs = []
        self.lda_estimate_jobs = []

        self.last_lda_matrix = None
        self.last_cart_tree = None
        self.last_num_cart_labels = None

        crp = rasr.CommonRasrParameters(base=original_crp)
        crp.acoustic_model_config = original_crp.acoustic_model_config._copy()

        for iteration in range(num_iter):
            crp.acoustic_model_config.state_tying.type = "monophone"
            del crp.acoustic_model_config.state_tying.file

            temp_alignment_flow = mm.cached_alignment_flow(
                initial_flow, alignment)

            args = {"crp": crp, "alignment_flow": temp_alignment_flow}
            args.update(select_args(cart_sum_args, iteration))
            cart_sum = cart.AccumulateCartStatisticsJob(**args)

            args = {
                "crp": crp,
                "questions": questions,
                "cart_examples": cart_sum.out_cart_sum,
            }
            args.update(select_args(cart_estimate_args, iteration))
            cart_estimate = cart.EstimateCartJob(**args)

            crp.acoustic_model_config.state_tying.type = "cart"
            crp.acoustic_model_config.state_tying.file = cart_estimate.out_cart_tree

            temp_alignment_flow = mm.cached_alignment_flow(
                context_flow, alignment)

            args = {"crp": crp, "alignment_flow": temp_alignment_flow}
            args.update(select_args(lda_scatter_args, iteration))
            lda_scatter = lda.EstimateScatterMatricesJob(**args)

            args = self.default_eigenvalue_params.copy()
            args.update(select_args(eigenvalue_args, iteration))
            eigenvalue_problem_config = lda.build_eigenvalue_problem_config(
                **args)

            args = self.default_generalized_eigenvalue_params.copy()
            args.update(select_args(generalized_eigenvalue_args, iteration))
            generalized_eigenvalue_problem_config = (
                lda.build_generalized_eigenvalue_problem_config(**args))

            args = {
                "crp":
                crp,
                "between_class_scatter_matrix":
                lda_scatter.between_class_scatter_matrix,
                "within_class_scatter_matrix":
                lda_scatter.within_class_scatter_matrix,
                "reduced_dimension":
                num_dim,
                "eigenvalue_problem_config":
                eigenvalue_problem_config,
                "generalized_eigenvalue_problem_config":
                generalized_eigenvalue_problem_config,
            }
            args.update(select_args(lda_estimate_args, iteration))
            lda_estimate = lda.EstimateLDAMatrixJob(**args)

            initial_flow = features.add_linear_transform(
                context_flow, lda_estimate.lda_matrix)

            self.cart_sum_jobs.append(cart_sum)
            self.cart_estimate_jobs.append(cart_estimate)
            self.lda_scatter_jobs.append(lda_scatter)
            self.lda_estimate_jobs.append(lda_estimate)

            self.last_cart_tree = cart_estimate.out_cart_tree
            self.last_lda_matrix = lda_estimate.lda_matrix
            self.last_num_cart_labels = cart_estimate.out_num_labels
Exemple #7
0
    def train_nn(
        self,
        name,
        corpus_key,
        feature_flow,
        returnn_config,
        num_classes,
        use_hdf=False,
        add_speaker_map=False,
        **kwargs,
    ):
        assert isinstance(
            returnn_config, ReturnnConfig
        ), "Passing returnn_config as dict to train_nn is no longer supported, please construct a ReturnnConfig object instead"

        corpus_key = self.train_corpora[0]
        train_corpus_key = corpus_key + "_train"
        cv_corpus_key = corpus_key + "_cv"
        cv_size = 0.005
        all_segments = SegmentCorpusJob(self.corpora[corpus_key].corpus_file,
                                        1).out_single_segment_files[1]
        new_segments = ShuffleAndSplitSegmentsJob(segment_file=all_segments,
                                                  split={
                                                      "train": 1.0 - cv_size,
                                                      "cv": cv_size
                                                  })
        train_segments = new_segments.out_segments["train"]
        cv_segments = new_segments.out_segments["cv"]

        self.add_overlay(corpus_key, train_corpus_key)
        self.crp[train_corpus_key].corpus_config = copy.deepcopy(
            self.crp[train_corpus_key].corpus_config)
        self.crp[train_corpus_key].corpus_config.segments.file = train_segments
        self.crp[train_corpus_key].corpus_config.segment_order_shuffle = True
        self.crp[
            train_corpus_key].corpus_config.segment_order_sort_by_time_length = True
        self.crp[
            train_corpus_key].corpus_config.segment_order_sort_by_time_length_chunk_size = 384
        self.add_overlay(corpus_key, cv_corpus_key)
        self.crp[cv_corpus_key].corpus_config = copy.deepcopy(
            self.crp[train_corpus_key].corpus_config)
        self.crp[cv_corpus_key].corpus_config.segments.file = cv_segments

        self.crp["loss"] = rasr.CommonRasrParameters(base=self.crp[corpus_key])
        config, post_config = self.create_full_sum_loss_config(num_classes)

        custom_config = None
        if use_hdf:
            from i6_core.returnn.hdf import ReturnnRasrDumpHDFJob
            from i6_core.rasr.config import WriteRasrConfigJob
            train_hdf_job = ReturnnRasrDumpHDFJob(
                crp=self.crp[train_corpus_key],
                feature_flow=self.feature_flows[corpus_key][feature_flow],
                alignment=None,
                num_classes=self.functor_value(num_classes))
            cv_hdf_job = ReturnnRasrDumpHDFJob(
                crp=self.crp[cv_corpus_key],
                feature_flow=self.feature_flows[corpus_key][feature_flow],
                alignment=None,
                num_classes=self.functor_value(num_classes))
            custom_config = WriteRasrConfigJob(config, post_config).out_config
            returnn_config.config["train"] = {
                "class":
                "HDFDataset",
                "files": [train_hdf_job.out_hdf],
                "seq_ordering":
                "laplace.1000",
                "partition_epoch":
                kwargs.pop("partition_epochs", {'train': 1})["train"],
                "use_cache_manager":
                True,
                "cache_byte_size":
                0,
            }
            returnn_config.config["dev"] = {
                "class": "HDFDataset",
                "files": [cv_hdf_job.out_hdf],
                "seq_ordering": "sorted_reverse",
                "use_cache_manager": True,
                "cache_byte_size": 0,
            }

        def add_rasr_loss(network, custom_config=None):
            network["rasr_loss"] = {
                "class": "copy",
                "from": "output",
                "loss_opts": {
                    'tdp_scale':
                    0.0,
                    "sprint_opts":
                    self.create_rasr_loss_opts(custom_config=custom_config)
                },
                "loss": "fast_bw",
                "target": None,
            }

        if returnn_config.staged_network_dict:
            for net in returnn_config.staged_network_dict.values():
                add_rasr_loss(net, custom_config=custom_config)
        else:
            if returnn_config.config['network']['output'].get(
                    "loss", None) != "fast_bw":
                add_rasr_loss(returnn_config.config["network"],
                              custom_config=custom_config)

        if add_speaker_map:
            from i6_core.corpus.convert import CorpusToSpeakerMap
            speaker_map = CorpusToSpeakerMap(
                self.corpora[corpus_key].corpus_file).out_speaker_target_map
            if "dev" not in returnn_config.config:
                returnn_config.config["dev"] = {}
            if "train" not in returnn_config.config:
                returnn_config.config["train"] = {}
            returnn_config.config["train"]["target_maps"] = {
                'speaker_name': speaker_map
            }
            returnn_config.config["dev"]["target_maps"] = {
                'speaker_name': speaker_map
            }

        if use_hdf:
            kwargs.pop("alignment")
            kwargs.pop("use_python_control")
            j = ReturnnTrainingJob(
                returnn_config=returnn_config,
                **kwargs,
            )
        else:
            j = ReturnnRasrTrainingJob(
                train_crp=self.crp[train_corpus_key],
                dev_crp=self.crp[cv_corpus_key],
                feature_flow=self.feature_flows[corpus_key][feature_flow],
                returnn_config=returnn_config,
                num_classes=self.functor_value(num_classes),
                additional_rasr_config_files={"rasr.loss": config},
                additional_rasr_post_config_files={"rasr.loss": post_config},
                **kwargs,
            )

        j.add_alias("train_nn_%s_%s" % (corpus_key, name))
        self.jobs[corpus_key]["train_nn_%s" % name] = j
        self.tf_checkpoints[name] = j.out_checkpoints
        #self.nn_models[corpus_key][name] = j.out_models
        self.nn_configs[corpus_key][name] = j.out_returnn_config_file

        state_tying_job = DumpStateTyingJob(self.crp[corpus_key])
        tk.register_output(
            "{}_{}_state_tying".format(corpus_key, name),
            state_tying_job.out_state_tying,
        )
        self.state_tying = state_tying_job.out_state_tying