50148027806383fa41b626be2c81fbaf82659b6e
[processor-sdk/kaldi.git] / egs / wsj / s5 / steps / nnet3 / multilingual / combine_egs.sh
1 #!/bin/bash
2 #
3 # This script generates examples for multilingual training of neural network
4 # using separate input egs dir per language as input.
5 # This scripts produces 3 sets of files --
6 # egs.*.scp, egs.output.*.ark, egs.weight.*.ark
7 #
8 # egs.*.scp are the SCP files of the training examples.
9 # egs.weight.*.ark map from the key of the example to the language-specific
10 # weight of that example.
11 # egs.output.*.ark map from the key of the example to the name of
12 # the output-node in the neural net for that specific language, e.g.
13 # 'output-2'.
14 #
15 # Begin configuration section.
16 cmd=run.pl
17 minibatch_size=512      # it is the number of consecutive egs that we take from 
18                         # each source, and it only affects the locality of disk 
19                         # access. This does not have to be the actual minibatch size;
20 num_jobs=10             # helps for better randomness across languages
21                         # per archive.
22 samples_per_iter=400000 # this is the target number of egs in each archive of egs
23                         # (prior to merging egs).  We probably should have called
24                         # it egs_per_iter. This is just a guideline; it will pick
25                         # a number that divides the number of samples in the
26                         # entire data.
27 lang2weight=            # array of weights one per input languge to scale example's output
28                         # w.r.t its input language during training.
29 stage=0
31 echo "$0 $@"  # Print the command line for logging
33 if [ -f path.sh ]; then . ./path.sh; fi
34 . parse_options.sh || exit 1;
36 num_langs=$1
38 shift 1
39 args=("$@")
40 megs_dir=${args[-1]} # multilingual directory
41 mkdir -p $megs_dir
42 mkdir -p $megs_dir/info
43 if [ ${#args[@]} != $[$num_langs+1] ]; then
44   echo "$0: num of input example dirs provided is not compatible with num_langs $num_langs."
45   echo "Usage:$0 [opts] <num-input-langs,N> <lang1-egs-dir> ...<langN-egs-dir> <multilingual-egs-dir>"
46   echo "Usage:$0 [opts] 2 exp/lang1/egs exp/lang2/egs exp/multi/egs"
47   exit 1;
48 fi
50 required="egs.scp combine.scp train_diagnostic.scp valid_diagnostic.scp"
51 train_scp_list=
52 train_diagnostic_scp_list=
53 valid_diagnostic_scp_list=
54 combine_scp_list=
56 # read paramter from $egs_dir[0]/info and cmvn_opts
57 # to write in multilingual egs_dir.
58 check_params="info/feat_dim info/ivector_dim info/left_context info/right_context info/frames_per_eg info/final.ie.id cmvn_opts"
59 for param in $check_params; do
60   cat ${args[0]}/$param > $megs_dir/$param || exit 1;
61 done
62 cat ${args[0]}/cmvn_opts > $megs_dir/cmvn_opts || exit 1; # caution: the top-level nnet training
63                                                           # script should copy this to its
64                                                           # own dir.
65 for lang in $(seq 0 $[$num_langs-1]);do
66   multi_egs_dir[$lang]=${args[$lang]}
67   for f in $required; do
68     if [ ! -f ${multi_egs_dir[$lang]}/$f ]; then
69       echo "$0: no such file ${multi_egs_dir[$lang]}/$f." && exit 1;
70     fi
71   done
72   train_scp_list="$train_scp_list ${args[$lang]}/egs.scp"
73   train_diagnostic_scp_list="$train_diagnostic_scp_list ${args[$lang]}/train_diagnostic.scp"
74   valid_diagnostic_scp_list="$valid_diagnostic_scp_list ${args[$lang]}/valid_diagnostic.scp"
75   combine_scp_list="$combine_scp_list ${args[$lang]}/combine.scp"
77   # check parameter dimension to be the same in all egs dirs
78   for f in $check_params; do
79     if [ -f $megs_dir/$f ] && [ -f ${multi_egs_dir[$lang]}/$f ]; then
80       f1=$(cat $megs_dir/$f)
81       f2=$(cat ${multi_egs_dir[$lang]}/$f)
82       if [ "$f1" != "$f2" ]  ; then
83         echo "$0: mismatch for $f in $megs_dir vs. ${multi_egs_dir[$lang]}($f1 vs. $f2)."
84         exit 1;
85       fi
86     else
87       echo "$0: file $f does not exits in $megs_dir or ${multi_egs_dir[$lang]}/$f ."
88     fi
89   done
90 done
92 if [ $stage -le 0 ]; then
93   echo "$0: allocating multilingual examples for training."
94   if [ ! -z "$lang2weight" ]; then
95     egs_opt="--lang2weight '$lang2weight'"
96   fi
97   # Generate egs.*.scp for multilingual setup.
98   $cmd $megs_dir/log/allocate_multilingual_examples_train.log \
99   steps/nnet3/multilingual/allocate_multilingual_examples.py $egs_opt \
100       --minibatch-size $minibatch_size \
101       --samples-per-iter $samples_per_iter \
102       $train_scp_list $megs_dir || exit 1;
103 fi
105 if [ $stage -le 1 ]; then
106   echo "$0: combine combine.scp examples from all langs in $megs_dir/combine.scp."
107   # Generate combine.scp for multilingual setup.
108   $cmd $megs_dir/log/allocate_multilingual_examples_combine.log \
109   steps/nnet3/multilingual/allocate_multilingual_examples.py \
110       --random-lang false \
111       --max-archives 1 --num-jobs 1 \
112       --minibatch-size $minibatch_size \
113       --egs-prefix "combine." \
114       $combine_scp_list $megs_dir || exit 1;
116   echo "$0: combine train_diagnostic.scp examples from all langs in $megs_dir/train_diagnostic.scp."
117   # Generate train_diagnostic.scp for multilingual setup.
118   $cmd $megs_dir/log/allocate_multilingual_examples_train_diagnostic.log \
119   steps/nnet3/multilingual/allocate_multilingual_examples.py \
120       --random-lang false \
121       --max-archives 1 --num-jobs 1 \
122       --minibatch-size $minibatch_size \
123       --egs-prefix "train_diagnostic." \
124       $train_diagnostic_scp_list $megs_dir || exit 1;
127   echo "$0: combine valid_diagnostic.scp examples from all langs in $megs_dir/valid_diagnostic.scp."
128   # Generate valid_diagnostic.scp for multilingual setup.
129   $cmd $megs_dir/log/allocate_multilingual_examples_valid_diagnostic.log \
130   steps/nnet3/multilingual/allocate_multilingual_examples.py \
131       --random-lang false --max-archives 1 --num-jobs 1\
132       --minibatch-size $minibatch_size \
133       --egs-prefix "valid_diagnostic." \
134       $valid_diagnostic_scp_list $megs_dir || exit 1;
136 fi
137 for egs_type in combine train_diagnostic valid_diagnostic; do
138   mv $megs_dir/${egs_type}.output.1.ark $megs_dir/${egs_type}.output.ark || exit 1;
139   mv $megs_dir/${egs_type}.weight.1.ark $megs_dir/${egs_type}.weight.ark || exit 1;
140   mv $megs_dir/${egs_type}.1.scp $megs_dir/${egs_type}.scp || exit 1;
141 done
142 mv $megs_dir/info/egs.num_archives $megs_dir/info/num_archives || exit 1;
143 mv $megs_dir/info/egs.num_tasks $megs_dir/info/num_tasks || exit 1;
144 echo "$0: Finished preparing multilingual training example."