gdb nnet3-compute
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函数的:
- 参数input_t_start表示当前chunk输出第一帧所依赖的输入帧中第一帧的索引(即当前帧的索引
−
左上文); - 参数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的更多相关文章
- gdb 调试入门,大牛写的高质量指南
引用自:http://blog.jobbole.com/107759/ gdb 调试 ncurses 全过程: 发现网上的“gdb 示例”只有命令而没有对应的输出,我有点不满意.gdb 是 GNU 调 ...
- gdb 调试 ncurses 全过程:
转载地址: http://blog.jobbole.com/107759/ gdb 调试 ncurses 全过程: 发现网上的“gdb 示例”只有命令而没有对应的输出,我有点不满意.gdb 是 GNU ...
- Android gdb so
gdb debug an android application 1.gdb 要有gdbserver 一般模拟器默认装有gdbserver,如2.3.3的模拟器,看一下有没有: D:\Develope ...
- gdb help all 帮助信息
Command class: aliases ni -- Step one instruction rc -- Continue program being debugged but run it i ...
- linux应用调试技术之GDB和GDBServer
1.调试原理 GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB,开发板上运行GDBServer.在应用程序调试的时候,pc机上的gdb向开发板上的GDB ...
- 新手如何在gdb中存活
网络上已经有很多gdb调试的文章了,为什么我还要写这篇文章呢,因为本文是写给gdb新手的,目的就是通过一个简单的例子来让新手很快上手.一旦上手入门了,其他的问题就可以自己去搜索搞定了.右边是gdb的L ...
- GDB 多线程调试:只停止断点的线程,其他线程任然执行; 或只运行某些线程 其他线程中断
多线程调试之痛 调试器(如VS2008和老版GDB)往往只支持all-stop模式,调试多线程程序时,如果某个线程断在一个断点上,你的调试器会让整个程序freeze,直到你continue这个线程,程 ...
- GDB调试命令
1.查看源码: list [函数名][行数] 2.暂停程序 (1)设置断点: a.break + [源代码行号][源代码函数名][内存地址] b.break ... if condition .. ...
- 关于gdb和shp的FID问题
gdb的FID从1开始,并且FID唯一,从数字化时开始,每个图形对应唯一的FID,删除图形亦删除对应的FID.FID可能出现中断的情况. shp的FID从0开始,并且永远连续.删除图形,则编号在其下面 ...
随机推荐
- OpenGL实例:几何变换
OpenGL实例:几何变换 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 更多请查看:计算机图形学 1. 平移 #include <GL/glu ...
- 从零开始制作 Hexo 主题
原文地址:从零开始制作 Hexo 主题 · Ahonn 写在前面 本文将会从零开始开发一个简单的博客主题.样式主要参考 Hexo theme 中的 Noise 主题. 开始之前你需要了解: 模板引擎 ...
- 在windows系统下安装linux虚拟机(VMware)
一.下载Vmware安装包(此处我安装的是VMware-workstation-full-14.1.3) 链接: https://pan.baidu.com/s/12xT1JaA7eheEgFfM-2 ...
- JS去除掉字符串前后空格
1. 推荐使用jquery已封装好的方法,非常简单 $.trim(str) jquery的内部实现如下, function trim(str){ return str.replace(/^(\s|\u ...
- zabbix-agent(zabbix-proxy)配置
PidFile=/var/run/zabbix/zabbix_agentd.pidLogFile=/var/log/zabbix/zabbix_agentd.logLogFileSize=30Serv ...
- mysql容灾备份脚本
一,环境需求 **安装前准备 操作系统环境:Centos 7.2 [root@localhost soft]# rpm -qa | grep mariadb [root@localhost soft] ...
- 在Winform开发框架中下拉列表绑定字典以及使用缓存提高界面显示速度
在我们开发Winform界面的时候,往往需要绑定数据字典操作,也就是绑定一些下拉列表或者一些列表显示等,以便我们方便选择数据操作,常见的字典绑定操作就是对下拉列表的处理,本篇随笔是基于DevExpre ...
- node的第一步,hello,以及小技巧和CPU使用情况。到底能用几个核心?
安装了啥的就不说了,百度一下有很多. Windows环境.Linux不会,所有就不说了. 1. hello Word node的hello Word很简单,就一行. console.log(&quo ...
- iOS 快捷下载和安装并使用CocoaPods
CocoaPods是什么? 当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等.可能某个类库又用到其他类库,所以要使用它,手动一个个去下载所需类库十 ...
- git添加秘钥提示Key is already in use
种种原因,需要修改git账号的秘钥. 操作如下: 1.删除系统上.ssh下的known_hosts文件 (一般在这个路径下C:\Users\Administrator\.ssh)如果账号不是Admi ...