tensorflow deep_speech2 神经网络结构代码分析

本文通过源码分析和调试,详细揭示了TensorFlow deep_speech2模型的神经网络结构。从输入层到卷积、池化、 reshape、RNN、全连接层以及CTC损失函数的计算过程,逐步展示了模型的工作原理。同时,还提供了使用Keras重写模型结构后的输出结果作为对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源码地址:https://github.com/tensorflow/models/tree/master/research/deep_speech

运行脚本

export PYTHONPATH="$PYTHONPATH:/home/luke/Download/tmp/models"
export TF_FORCE_GPU_ALLOW_GROWTH=true
python deep_speech.py --train_data_dir=/tmp/librispeech_data/final_train_dataset.csv --eval_data_dir=/tmp/librispeech_data/final_eval_dataset.csv --num_gpus=1 --wer_threshold=0.23 --seed=1

_______________________________________________

调试笔记:

我对 tf.estimator.Estimator 并不熟悉,之前并没有用过,不知道怎么可以像Keras一样,直接来个 model.summary() 就可以把模型做到心中有数,

所以还是想把各层的结构打印出来,

但是在TensorFlow下,打印也不是一件容易的事,不像常规的代码一样,直接print,很方便

所以想到了一个暴力调试办法,就是制造错误,

如在 deep_speech_model.py 中,我想要打印 DeepSpeech2 的 input 的结构,我添加一行代码,制造下面的错误:

  def __call__(self, inputs, training):
    inputs = tf.keras.layers.Conv1D(10, 20)(inputs)

    # Two cnn layers.
    inputs = _conv_bn_layer(
        inputs, padding=(20, 5), filters=_CONV_FILTERS, kernel_size=(41, 11),
        strides=(2, 2), layer_id=1, training=training)

然后开始训练,就会得到如下报错:

ValueError: Input 0 of layer conv1d is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: [None, None, 161, 1]

那么我就知道了,这个inputs的shape是 [None, 161, 1]

这样,把代码接着往下移动,就会打印出下面 _conv_bn_layer 之后的shape

[None, 81, 32]

接下来又是一个 _conv_bn_layer ,打印shape,

[None, 81, 32]

依次类似,想办法制造错误,就可以把各个层的结构调试出来

 

其中,里面有一个pad,参数padding的维度[0],和inputs的维度[0]应该一致,因为大部分demo中都是二维的,不熟悉的情况下有点萌,根据这里的代码大致可以理解为,原输入inputs结构为 [None, 161, 1],实际前面还有一个batch,所以,大致算是  [1,None, 161, 1],而paddings为[[0, 0], [20, 20], [5, 5], [0, 0]]的情况下,pad后的shape为[1, None + 20 + 20, 161 + 5 + 5, 1],而TensorFlow是channel-last,所以最后那个1是channel,pad后的结果为[1, None + 40, 171, 1],再卷积,卷积后大小为

(in_height+2pad-filter_height)/strides[1]+1

(171 + 0 - 11)/2 + 1 = 81

第二个卷积,pad后尺寸为(1, None, 81 + 5 + 5, 32),然后卷积,尺寸为

(91 + 0 - 11)/ 1 + 1 = 81

所以和上面调试结果一致

 

OK,我们现在要经历一个reshape,获取 feat_size = 81, _CONV_FILTERS = 32,那么reshape后的结构为:

[None, None, 2592]

2592 = 81 * 32

 

下面是_rnn_layer,之后的尺寸为[None, None, 1600], 其中1600就是rnn_hidden_size * 2,这里的2是因为在bidire

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值