[scripts,egs] fixed issues in multilingual training with --use-ivector option (#1828)
[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 cmvn_opts"
59 ivec_dim=`cat ${args[0]}/info/ivector_dim`
60 if [ $ivec_dim -ne 0 ];then check_params="$check_params info/final.ie.id"; fi
62 for param in $check_params; do
63     cat ${args[0]}/$param > $megs_dir/$param || exit 1;
64 done
66 for lang in $(seq 0 $[$num_langs-1]);do
67   multi_egs_dir[$lang]=${args[$lang]}
68   for f in $required; do
69     if [ ! -f ${multi_egs_dir[$lang]}/$f ]; then
70       echo "$0: no such file ${multi_egs_dir[$lang]}/$f." && exit 1;
71     fi
72   done
73   train_scp_list="$train_scp_list ${args[$lang]}/egs.scp"
74   train_diagnostic_scp_list="$train_diagnostic_scp_list ${args[$lang]}/train_diagnostic.scp"
75   valid_diagnostic_scp_list="$valid_diagnostic_scp_list ${args[$lang]}/valid_diagnostic.scp"
76   combine_scp_list="$combine_scp_list ${args[$lang]}/combine.scp"
78   # check parameter dimension to be the same in all egs dirs
79   for f in $check_params; do
80     if [ -f $megs_dir/$f ] && [ -f ${multi_egs_dir[$lang]}/$f ]; then
81       f1=$(cat $megs_dir/$f)
82       f2=$(cat ${multi_egs_dir[$lang]}/$f)
83       if [ "$f1" != "$f2" ]  ; then
84         echo "$0: mismatch for $f in $megs_dir vs. ${multi_egs_dir[$lang]}($f1 vs. $f2)."
85         exit 1;
86       fi
87     else
88       echo "$0: file $f does not exits in $megs_dir or ${multi_egs_dir[$lang]}/$f ."
89     fi
90   done
91 done
93 if [ $stage -le 0 ]; then
94   echo "$0: allocating multilingual examples for training."
95   if [ ! -z "$lang2weight" ]; then
96     egs_opt="--lang2weight '$lang2weight'"
97   fi
98   # Generate egs.*.scp for multilingual setup.
99   $cmd $megs_dir/log/allocate_multilingual_examples_train.log \
100   steps/nnet3/multilingual/allocate_multilingual_examples.py $egs_opt \
101       --minibatch-size $minibatch_size \
102       --samples-per-iter $samples_per_iter \
103       $train_scp_list $megs_dir || exit 1;
104 fi
106 if [ $stage -le 1 ]; then
107   echo "$0: combine combine.scp examples from all langs in $megs_dir/combine.scp."
108   # Generate combine.scp for multilingual setup.
109   $cmd $megs_dir/log/allocate_multilingual_examples_combine.log \
110   steps/nnet3/multilingual/allocate_multilingual_examples.py \
111       --random-lang false \
112       --max-archives 1 --num-jobs 1 \
113       --minibatch-size $minibatch_size \
114       --egs-prefix "combine." \
115       $combine_scp_list $megs_dir || exit 1;
117   echo "$0: combine train_diagnostic.scp examples from all langs in $megs_dir/train_diagnostic.scp."
118   # Generate train_diagnostic.scp for multilingual setup.
119   $cmd $megs_dir/log/allocate_multilingual_examples_train_diagnostic.log \
120   steps/nnet3/multilingual/allocate_multilingual_examples.py \
121       --random-lang false \
122       --max-archives 1 --num-jobs 1 \
123       --minibatch-size $minibatch_size \
124       --egs-prefix "train_diagnostic." \
125       $train_diagnostic_scp_list $megs_dir || exit 1;
128   echo "$0: combine valid_diagnostic.scp examples from all langs in $megs_dir/valid_diagnostic.scp."
129   # Generate valid_diagnostic.scp for multilingual setup.
130   $cmd $megs_dir/log/allocate_multilingual_examples_valid_diagnostic.log \
131   steps/nnet3/multilingual/allocate_multilingual_examples.py \
132       --random-lang false --max-archives 1 --num-jobs 1\
133       --minibatch-size $minibatch_size \
134       --egs-prefix "valid_diagnostic." \
135       $valid_diagnostic_scp_list $megs_dir || exit 1;
137 fi
138 for egs_type in combine train_diagnostic valid_diagnostic; do
139   mv $megs_dir/${egs_type}.output.1.ark $megs_dir/${egs_type}.output.ark || exit 1;
140   mv $megs_dir/${egs_type}.weight.1.ark $megs_dir/${egs_type}.weight.ark || exit 1;
141   mv $megs_dir/${egs_type}.1.scp $megs_dir/${egs_type}.scp || exit 1;
142 done
143 mv $megs_dir/info/egs.num_archives $megs_dir/info/num_archives || exit 1;
144 mv $megs_dir/info/egs.num_tasks $megs_dir/info/num_tasks || exit 1;
145 echo "$0: Finished preparing multilingual training example."