DBN+DNN的结构问题(含bottleneck)

本文探讨了在预训练DBN之后如何设计DNN的结构,特别是当加入Bottleneck层时。初步结论指出,DNN的隐层数量等于DBN的层数,前两层的维度与DBN保持一致。在Kaldi的实现中,DBN和DNN结合形成完整的网络结构,Bottleneck层通常位于全连接层前。实践中发现,DBN的层数并非越多越好,整体架构为:n层DBN + m层DNN + BN + 全连接层 + 输出层。同时,不应随意添加remove-last-components参数,除非使用deep feature。
摘要由CSDN通过智能技术生成

假期之前遇到一个问题一直在困扰着我,先用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值