假期之前遇到一个问题一直在困扰着我,先用DBN做pretrain的时候,那么DNN的层数以及每层的结构该怎么设计呢?匆匆忙忙的三四天假期结束了,先解决一下这个问题。
先来看一下,之前做的一个wsj的一个demo,用的原始的配置:
hidlayers=2
hiddims=512
#训练dbn的脚本,两层的RBM 隐层维数是512
steps/nnet/pretrain_dbn.sh --rbm-iter 3 --nn-depth $hidlayers --hid-dim $hiddims \
data/fmllr_${gmmname}/train_data $dir
#训练dnn的脚本,用的上面pretrain生成的feature_transform 和 dbn, 注意:--hid-layers 0,也没有hidden_dim的参数
steps/nnet/train.sh --feature-transform $feature_transform --dbn $dbn --hid-layers 0 --learn-rate 0.004 data/fmllr_${gmmname}/train_data data/fmllr_${gmmname}/test_data data/lang ${ali}_train \ ${ali}_test $dir || exit 1;
下面分别看一下生成的网络拓扑图:
#1.rbm.proto
<Rbm> <InputDim> 462 <OutputDim> 512 <VisibleType> gauss <HiddenType> bern <ParamStddev> 0.1
#2.rbm.proto
<Rbm> <InputDim> 512 <OutputDim> 512 <VisibleType> bern <HiddenType> bern <ParamStddev> 0.1 <VisibleBiasCmvnFilename> exp/pretrain_lstm_2_512_recurrent/2.cmvn
#nnet.proto, 这里用的lstm,AffineTransform是输出层
<NnetProto>
<LstmProjectedStreams> <InputDim> 462 <OutputDim> 512 <CellDim> 800 <ParamScale> 0.010000 <ClipGradient> 5.000000
<LstmProjectedStreams> <InputDim> 512 <OutputDim> 512 <CellDim> 800 <ParamScale> 0.010000 <ClipGradient> 5.000000
<AffineTransform> <InputDim> 512 <OutputDim> 1979 <BiasMean> 0.0 <BiasRange> 0.0 <ParamStddev> 0.040000
<Softmax> <InputDim> 1979 <OutputDim> 1979
</NnetProto>
初步总结一下结论(不确定,具体问一下作者再来补充): dnn隐层的个数等于dbn的层数,并且前两层的维数保持与之前dbn的结构一致(不设置隐层维数参数)。
但是现在我们需要加bottleneck layer:
dnn_hidden_layer=0
scripts/train.sh –splice 5 –dbn