Esempio n. 1
0
def get_default_topology(phones):
    phones = sorted(phones)

    topo_string = """<Topology>
    <TopologyEntry>
    <ForPhones>
    """
    for i in phones:
        topo_string += str(i) + " "

    topo_string += """</ForPhones>
    <State> 0 <PdfClass> 0
    <Transition> 0 0.5
    <Transition> 1 0.5
    </State>
    <State> 1 <PdfClass> 1
    <Transition> 1 0.5
    <Transition> 2 0.5
    </State>
    <State> 2 <PdfClass> 2
    <Transition> 2 0.5
    <Transition> 3 0.5
    </State>
    <State> 3 </State>
    </TopologyEntry>
    </Topology>
    """

    topo_string = ostringstream.from_str(topo_string)

    topo = HmmTopology()
    iss = istringstream.from_str(topo_string.to_str())
    topo.read(iss, False)
    return topo
Esempio n. 2
0
    def test_nnet_decodable(self):
        gen_config = NnetGenerationOptions()
        configs = generate_config_sequence(gen_config)
        nnet = Nnet()
        for j, config in enumerate(configs):
            print("Input config[{}]:".format(j))
            print(config)
            istrm = istringstream.from_str(config)
            nnet.read_config(istrm)

        num_frames = 5 + random.randint(1, 100)
        input_dim = nnet.input_dim("input")
        output_dim = nnet.output_dim("output")
        ivector_dim = max(0, nnet.input_dim("ivector"))
        input = Matrix(num_frames, input_dim)

        set_batchnorm_test_mode(True, nnet)
        set_dropout_test_mode(True, nnet)

        input.set_randn_()
        ivector = Vector(ivector_dim)
        ivector.set_randn_()

        priors = Vector(output_dim if random.choice([True, False]) else 0)
        if len(priors) != 0:
            priors.set_randn_()
            priors.apply_exp_()

        output1 = Matrix(num_frames, output_dim)
        output2 = Matrix(num_frames, output_dim)

        opts = NnetSimpleComputationOptions()
        opts.frames_per_chunk = random.randint(5, 25)
        compiler = CachingOptimizingCompiler(nnet)
        decodable = DecodableNnetSimple(opts, nnet, priors, input, compiler,
                                        ivector if ivector_dim else None)
        for t in range(num_frames):
            decodable.get_output_for_frame(t, output1[t])

        opts = NnetSimpleLoopedComputationOptions()
        info = DecodableNnetSimpleLoopedInfo.new_from_priors(
            opts, priors, nnet)
        decodable = DecodableNnetSimpleLooped(info, input,
                                              ivector if ivector_dim else None)
        for t in range(num_frames):
            decodable.get_output_for_frame(t, output2[t])

        if (not nnet_is_recurrent(nnet)
                and nnet.info().find("statistics-extraction") == -1
                and nnet.info().find("TimeHeightConvolutionComponent") == -1):
            for t in range(num_frames):
                self.assertTrue(approx_equal(output1[t], output2[t]))
Esempio n. 3
0
    def test_nnet_compute(self):
        gen_config = NnetGenerationOptions()
        test_collapse_model = random.choice([True, False])

        configs = generate_config_sequence(gen_config)
        nnet = Nnet()
        for j, config in enumerate(configs):
            print("Input config[{}]:".format(j))
            print(config)
            istrm = istringstream.from_str(config)
            nnet.read_config(istrm)

        request = ComputationRequest()
        inputs = compute_example_computation_request_simple(nnet, request)
        if test_collapse_model:
            set_batchnorm_test_mode(True, nnet)
            set_dropout_test_mode(True, nnet)

        compiler = Compiler(request, nnet)
        opts = CompilerOptions()
        computation = compiler.create_computation(opts)

        nnet_collapsed = Nnet.new_from_other(nnet)
        if test_collapse_model:
            collapse_config = CollapseModelConfig()
            collapse_model(collapse_config, nnet_collapsed)
            compiler_collapsed = Compiler(request, nnet_collapsed)
            computation_collapsed = compiler_collapsed.create_computation(opts)
            computation_collapsed.compute_cuda_indexes()

        ostrm = ostringstream()
        computation.print_computation(ostrm, nnet)
        print("Generated computation:")
        print(ostrm.to_str())

        check_config = CheckComputationOptions()
        check_config.check_rewrite = True
        checker = ComputationChecker(check_config, nnet, computation)
        checker.check()

        if random.choice([True, False]):
            opt_config = NnetOptimizeOptions()
            optimize(opt_config, nnet, max_output_time_in_request(request),
                     computation)
            ostrm = ostringstream()
            computation.print_computation(ostrm, nnet)
            print("Optimized computation:")
            print(ostrm.to_str())

        compute_opts = NnetComputeOptions()
        compute_opts.debug = random.choice([True, False])
        computation.compute_cuda_indexes()
        computer = NnetComputer(compute_opts, computation, nnet, nnet)

        for i, ispec in enumerate(request.inputs):
            temp = CuMatrix.new_from_matrix(inputs[i])
            print("Input sum:", temp.sum())
            computer.accept_input(ispec.name, temp)
        computer.run()

        output = computer.get_output_destructive("output")
        print("Output sum:", output.sum())

        if test_collapse_model:
            computer_collapsed = NnetComputer(compute_opts,
                                              computation_collapsed,
                                              nnet_collapsed, nnet_collapsed)
            for i, ispec in enumerate(request.inputs):
                temp = CuMatrix.new_from_matrix(inputs[i])
                print("Input sum:", temp.sum())
                computer_collapsed.accept_input(ispec.name, temp)
            computer_collapsed.run()
            output_collapsed = computer_collapsed.get_output_destructive("output")
            print("Output sum [collapsed]:", output_collapsed.sum())
            self.assertTrue(approx_equal_cu_matrix(output, output_collapsed),
                            "Regular and collapsed computation outputs differ.")

        output_deriv = CuMatrix.new_from_size(output.num_rows(),
                                              output.num_cols())
        output_deriv.set_randn()
        if request.outputs[0].has_deriv:
            computer.accept_input("output", output_deriv)
            computer.run()
            for i, ispec in enumerate(request.inputs):
                if ispec.has_deriv:
                    in_deriv = computer.get_output_destructive(ispec.name)
                    print("Input-deriv sum for input {} is:".format(ispec.name),
                          in_deriv.sum())
Esempio n. 4
0
    def testHmmTopology(self):

        input_str = """<Topology>
        <TopologyEntry>
        <ForPhones> 1 2 3 4 5 6 7 8 9 </ForPhones>
        <State> 0 <PdfClass> 0
        <Transition> 0 0.5
        <Transition> 1 0.5
        </State>
        <State> 1 <PdfClass> 1
        <Transition> 1 0.5
        <Transition> 2 0.5
        </State>
        <State> 2 <PdfClass> 2
        <Transition> 2 0.5
        <Transition> 3 0.5
        </State>
        <State> 3 </State>
        </TopologyEntry>
        <TopologyEntry>
        <ForPhones> 10 11 13 </ForPhones>
        <State> 0 <PdfClass> 0
        <Transition> 0 0.5
        <Transition> 1 0.5
        </State>
        <State> 1 <PdfClass> 1
        <Transition> 1 0.5
        <Transition> 2 0.5
        </State>
        <State> 2 </State>
        </TopologyEntry>
        </Topology>"""

        chain_input_str = """<Topology>
        <TopologyEntry>
        <ForPhones> 1 2 3 4 5 6 7 8 9 </ForPhones>
        <State> 0 <ForwardPdfClass> 0 <SelfLoopPdfClass> 1
        <Transition> 0 0.5
        <Transition> 1 0.5
        </State>
        <State> 1 </State>
        </TopologyEntry>
        </Topology>
        """

        for i in range(10):
            binary = random.choice([True, False])

            topo = HmmTopology()

            iss = istringstream.from_str(input_str)
            topo.read(iss, False)
            self.assertEqual(3, topo.min_length(3))
            self.assertEqual(2, topo.min_length(11))

            oss = ostringstream()
            topo.write(oss, binary)

            topo2 = HmmTopology()
            iss2 = istringstream.from_str(oss.to_bytes())
            topo2.read(iss2, binary)

            # Test equality
            oss1 = ostringstream()
            oss2 = ostringstream()
            topo.write(oss1, False)
            topo2.write(oss2, False)
            self.assertEqual(oss1.to_str(), oss2.to_str())

            # Test chain topology
            chain_topo = HmmTopology()
            chain_iss = istringstream.from_str(chain_input_str)
            chain_topo.read(chain_iss, False)
            self.assertEqual(1, chain_topo.min_length(3))

            # make sure get_default_topology doesnt crash
            phones = [1, 2]
            get_default_topology(phones)