gdb nnet3-compute测试命令

$ matrix-dim 'scp: head -n 1 data/test/feats.scp|'

~/kaldi/src/bin/matrix-dim 'scp: head -n 1 data/test/feats.scp|'

foo 20560 39

$ nnet3-compute --frame_subsampling-factor=3 exp/chain/tuning/tdnn_c/final.mdl 'scp:

head -n 1 data/test/feats.scp|' ark:-|matrix

-dim ark:-

foo 6854 1808

 
 

void DecodableNnetSimple::EnsureFrameIsComputed(int32 subsampled_frame)

gdb_cmd=$(mktemp XXXX.gdb)

cat <<EOF > $gdb_cmd

set pagination off

set logging redirect on

set logging overwrite on

set logging file ./nnet3-compute.log

set logging on

b kaldi::nnet3::DecodableNnetSimple::EnsureFrameIsComputed

commands

printf "subsampled_frame=%d", subsampled_frame

c

end

run

quit

EOF

gdb -x $gdb_cmd --args nnet3-compute --frame_subsampling-factor=3 exp/chain/tuning/tdnn_c/final.mdl 'scp: head -n 1 data/test/feats.scp|' ark:/dev/null

 
 

grep '^subsampled_frame' ./nnet3-compute.log

subsampled_frame=0

subsampled_frame=17

subsampled_frame=34

subsampled_frame=51

subsampled_frame=68[Thread 0x7fffe29ff700 (LWP 984) exited]

 
 

帧)的第一帧

且EnsureFrameIsComputed函数一次计算一个chunk

监视DoNnetComputation函数的参数

 
 

gdb_cmd=$(mktemp XXXX.gdb)

cat <<EOF > $gdb_cmd

set pagination off

set logging redirect on

set logging overwrite on

set logging file ./nnet3-compute.log

set logging on

b kaldi::nnet3::DecodableNnetSimple::DoNnetComputation

commands

printf "input_t_start=%d,output_t_start=%d", input_t_start, output_t_start

c

end

run

quit

EOF

gdb -x $gdb_cmd --args nnet3-compute --frame_subsampling-factor=3 exp/chain/tuning/tdnn_c/final.mdl 'scp: head -n 1 data/test/feats.scp|' ark:/dev/null

grep '^input_t_start' ./nnet3-compute.log

input_t_start=-23,output_t_start=0

input_t_start=28,output_t_start=51

input_t_start=79,output_t_start=102

input_t_start=130,output_t_start=153

...

input_t_start=20428,output_t_start=20451

input_t_start=20479,output_t_start=20502

input_t_start=20530,output_t_start=20553[Thread 0x7fffe29ff700 (LWP 7120) exited]

 
 

这说明,DoNnetComputation函数的:

  1. 参数input_t_start表示当前chunk输出第一帧所依赖的输入帧中第一帧的索引(即当前帧的索引

    左上文);
  2. 参数output_t_start表示当前chunk输出第一帧所对应的输入帧的索引;

 
 

监视kaldi::nnet3::NnetComputer::ExecuteCommand中NnetComputation::Command &c.command_type

gdb_cmd=$(mktemp XXXX.gdb)

cat <<EOF > $gdb_cmd

set pagination off

set logging redirect on

set logging overwrite on

set logging file ./nnet3-compute.log

set logging on

b kaldi::nnet3::NnetComputer::ExecuteCommand

commands

p computation_.commands[program_counter_].command_type

c

end

run

quit

EOF

gdb -x $gdb_cmd --args nnet3-compute --frame_subsampling-factor=3 exp/chain/tuning/tdnn_c/final.mdl 'scp: head -n 1 data/test/feats.scp|' ark:/dev/null

 
 

grep '^\$' ./nnet3-compute.log

 
 

command_typed的规律

$ sed -n '/^\$/s/.* //p' ./nnet3-compute.log | less

kaldi::nnet3::kNoOperationPermanent * 1

kaldi::nnet3::kAllocMatrix * 8

kaldi::nnet3::kCopyRows * 5

kaldi::nnet3::kDeallocMatrix * 8

kaldi::nnet3::kPropagate * 19

...

kaldi::nnet3::kNoOperationPermanent * 1

kaldi::nnet3::kAllocMatrix * 8

kaldi::nnet3::kCopyRows * 5

kaldi::nnet3::kDeallocMatrix * 8

kaldi::nnet3::kPropagate * 19

 
 

各个运算的次数

$ sed -n '/^\$/s/.* //p' ./nnet3-compute.log | perl -e 'my %hash;while (<>){chomp;$ha

sh{$_}+=1;}for $i (keys %hash){printf("%s %d\n", $i, $hash{$i})}'

kaldi::nnet3::kCopyRows 2020

kaldi::nnet3::kPropagate 7676

kaldi::nnet3::kDeallocMatrix 3234

kaldi::nnet3::kAllocMatrix 3234

kaldi::nnet3::kNoOperationPermanent 404

kaldi::nnet3::kMatrixCopy 3234

 
 

  • kaldi::nnet3::kCopyRows

    发生在以下组件结点中:

    component-node name=tdnn1.affine component=tdnn1.affine input=Append(Offset(input, -2), Offset(input, -1), input, Offset(input, 1), Offset(input, 2)) input-dim=195 output-dim=256

    行特性向量,符合"kaldi::nnet3::kCopyRows * 5"。

  • kaldi::nnet3::kPropagate

    帧。这可能与TDNN对左右上下文的依赖有关。

  • kaldi::nnet3::kDeallocMatrix

    在网络中进行每一个矩阵运算之后,都需要从内存中收回对应的矩阵空间

  • kaldi::nnet3::kAllocMatrix

    在网络中进行每一个矩阵运算(NaturalGradientAffineComponent、FixedAffineComponent等)之前,都需要从模型中将矩阵拷贝到内存中。

  • kaldi::nnet3::kNoOperationPermanent

    帧,默认chunk大小为50,由于frame_subsampling_factor=3,chunk大小变为其整数倍——51。这样,整条语句的chunk数为ceil(20560/51)=404。

    这与"kaldi::nnet3::kNoOperationPermanent"的个数相匹配,这说明,每个chunk运行一次"kaldi::nnet3::kNoOperationPermanent"。

  • kaldi::nnet3::kMatrixCopy

    在网络中进行每一个矩阵运算(NaturalGradientAffineComponent、FixedAffineComponent等)之前,从预计算组件中将上一层的输出结果拷贝至当前组件中

gdb nnet3-compute的更多相关文章

  1. gdb 调试入门,大牛写的高质量指南

    引用自:http://blog.jobbole.com/107759/ gdb 调试 ncurses 全过程: 发现网上的“gdb 示例”只有命令而没有对应的输出,我有点不满意.gdb 是 GNU 调 ...

  2. gdb 调试 ncurses 全过程:

    转载地址: http://blog.jobbole.com/107759/ gdb 调试 ncurses 全过程: 发现网上的“gdb 示例”只有命令而没有对应的输出,我有点不满意.gdb 是 GNU ...

  3. Android gdb so

    gdb debug an android application 1.gdb 要有gdbserver 一般模拟器默认装有gdbserver,如2.3.3的模拟器,看一下有没有: D:\Develope ...

  4. gdb help all 帮助信息

    Command class: aliases ni -- Step one instruction rc -- Continue program being debugged but run it i ...

  5. linux应用调试技术之GDB和GDBServer

    1.调试原理 GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB,开发板上运行GDBServer.在应用程序调试的时候,pc机上的gdb向开发板上的GDB ...

  6. 新手如何在gdb中存活

    网络上已经有很多gdb调试的文章了,为什么我还要写这篇文章呢,因为本文是写给gdb新手的,目的就是通过一个简单的例子来让新手很快上手.一旦上手入门了,其他的问题就可以自己去搜索搞定了.右边是gdb的L ...

  7. GDB 多线程调试:只停止断点的线程,其他线程任然执行; 或只运行某些线程 其他线程中断

    多线程调试之痛 调试器(如VS2008和老版GDB)往往只支持all-stop模式,调试多线程程序时,如果某个线程断在一个断点上,你的调试器会让整个程序freeze,直到你continue这个线程,程 ...

  8. GDB调试命令

    1.查看源码: list [函数名][行数] 2.暂停程序 (1)设置断点: a.break + [源代码行号][源代码函数名][内存地址] b.break ... if condition   .. ...

  9. 关于gdb和shp的FID问题

    gdb的FID从1开始,并且FID唯一,从数字化时开始,每个图形对应唯一的FID,删除图形亦删除对应的FID.FID可能出现中断的情况. shp的FID从0开始,并且永远连续.删除图形,则编号在其下面 ...

随机推荐

  1. 最新webstorm

    https://blog.csdn.net/hdp134793/article/details/81530472 最新webstorm,立即装,还有小盒子要弄个备份的,还有公交卡 2019-3-17( ...

  2. 好程序员web前端分享HTML基础篇

    好程序员web前端分享HTML基础篇,最近遇到很多新手,都会问,如果要学web前端开发,需要学什么?难不难学啊?多久能入门之类的问题?那么今天好程序员就先来给大家分享一下web前端学习路线:HTML基 ...

  3. 好程序员分享该如何选择background-image和img标签

    好程序员分享该如何选择background-image和img标签,用img标签 如果你希望别人打印页面时候包含这张图片请使用img标签 当这张图片有非常有意义的语义,比如警告图标,请使用img标签及 ...

  4. Jsp监听器

    监听器: 监听器就是对内置对象的状态或者属性变化进行监听,并且做出反应的特殊的servlet,在web.xml文件中对监听器进行的配置. 内置对象有两种状态变化:产生.销毁,就是当产生内置对象的时候能 ...

  5. 在oracle表中增加字段,并调整字段的顺序

    增加字段的语句很简单,以用户身份连接oracle服务: alter table tablename add(colname coltype); # 填上表名.字段名.字段类型 修改字段顺序前,查看表中 ...

  6. flutter获取状态栏高度

    import 'dart:ui'; MediaQueryData.fromWindow(window).padding.top 系统默认的appBar等高度 位于Dart Packages/flutt ...

  7. centos7之zabbix邮件报警(短信报警)

    前言 前面我们介绍了zabbix的基本linux和window及SNMP流量的简单监控,我们知道作为运维人员,需要7x24小时待命,但是我们不可能时时刻刻都坐在电脑旁边查看监控上的各个主机状态,所以我 ...

  8. axios delete请求 参数

    内容转载作者:https://www.cnblogs.com/pangguoming/p/8994742.html 如果服务端将参数当做 java对象来封装接收则 参数格式为:{data: param ...

  9. asp.net动态为网页添加关键词的代码

    如下资料是关于asp.net动态为网页添加关键词的代码,希望能对小伙伴们有较大用.HtmlMeta keywords = new HtmlMeta();keywords.Name = "ke ...

  10. 怎么用MATLAB产生FPGA所需的hamming窗系数

    需求 在FPGA处理中如果需要对待处理数据加窗,则需要窗系数存储在ROM中以供使用. 前言 MATLAB窗函数说明 流程 比如加个hamming窗,8192点,16bit放大,最终系数18bit位宽. ...