Torch-RNN运行过程中的坑 [1](读取Lua非空table,size为0)
0、踩坑背景
执行Torch-RNN的时候,在LanguageModel.lua中的encode_string函数中,对start_text的各个character进行id映射编码,实现功能类似“北京天安门”-->“5 10 88 32 111”,方便后面的计算。
这个函数会利用一个全局的类似HashMap的table,hashmap中的key是character(char),value是id(int),涉及到一个从hashmap中按照key取值的操作,代码如下:
local idx = self.token_to_idx[token]
assert(idx ~= nil, 'Got invalid idx')
但是每次运行到assert语句时,都会报错,返回的是nil。
我的训练数据集的规模足够大,同时编码正确的情况下,那么我就需要从几个方面debug:
- 这个字典table文件压根没数据(本文测试的内容)
- token确实在table中未命中
我对 self.token_to_idx 这个table类型的变量的大小,进行打印的时候,采用了多种方式:
print(table.getn(self.token_to_idx))
print(table.maxn(self.token_to_idx))
print(#self.token_to_idx)
但是输出都为0,奇了怪了,我用如下语句打印这个table,是有值的:
for k,v in pairs(self.token_to_idx) do
print(k,v)
end
--------------------------------------------------------------------
那么这是为什么呢?明明table不为空,取table size的时候都是0?
1、lua中的table是什么,各种size函数的区别?
在上一篇《Torch-RNN运行过程中的坑 [0](一些基础概念)》中,我们了解到了lua的introduction中有一句:
自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
也就是说lua中的数组和hashmap两种数据类型是合并的,美其名曰通用类型的表。
table的API本篇不研究,抛一个链接:Lua table(表),我们先研究一下咱们碰到的问题,即如何取table的真实size。
下面有四种方法(均在Lua 5.14下进行):
- table.getn(t)
返回table中元素的个数。给出一个调用例子:
> t1 = {, , , };
> print(table.getn(t1))
> t2 = {[]=,[]=,[]=,[]=};
> print(table.getn(t2))
这不正和我们的要求吻合嘛,继续试试:
> t3 = {[]=,[]=,[]=,[]=};
> print(table.getn(t2))
--第4个元素下标为6,非连续
> t4 = {[]=,[]=,nil,[]=};
> print(table.getn(t4))
--有nil,长度异常
> t5 = {[]=,[""]=,nil,[]=};
> print(table.getn(t5))
--有nil,长度异常
> t6 = {[]=,[""]=,[]=};
> print(table.getn(t6))
--1后面没有2,没连续上
> t7 = {[]=,[""]=,[]=};
> print(table.getn(t7))
--即使1和2两个index没有写连上,但是table首先排序后,计数为2
> t8 = {[""]=,[""]=,[""]=};
> print(table.getn(t8))
--hashmap型长度异常
好像出问题了,在index不连续的情况下、在含有nil的情况下、有hashmap、数组与hashmap混搭等情况下getn返回的结果都不正常。
----------------------------------------------------------------------------------------------------------
lua的table长度问题中,作者提出了table可以存储两种类型,一种是list类型(数组,key必为正整数),另外一种是record类型(hashmap,key为非正整数),getn函数统计的是连续的key为正整数的数目,所以我们看头两个例子是输出正常的。
所以没必要记这个规律,除了上面几个例子,getn肯定还有一些其他的规律没发现,不过记住这个getn函数要在有序正整数key的size计数时,输出才是正确的。。。
- table.maxn(t)
Lua中的table函数库中总结的很好,在这里引用一下:
table.maxn()函数返回指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0. 此函数不限于table的数组部分.
下面的例子也搬运一下:
> tbl = {[] = "a", [] = "b", [] = "c", [] = "z"}
> print(#tbl)
-- 因为26和之前的数字不连续, 所以不算在数组部分内
> print(table.maxn(tbl))
26
> tbl[91.32] = true
> print(table.maxn(tbl))
91.32
- #t
#方法取size,经测试,效果上应该与getn()方法一毛一样。从1开始,连续整数key的元素个数(必须从1开始计数,结果才正常)。再抛几个例子,希望看官不要花眼。。。
> t5 = {[]=,[]=,[""]=,[]=};
> print(#t5)
--1和2连续
> t5 = {[]=,[]=,[""]=,[]=};
> print(#t5)
--从1开始计数,下一个就是9了,不连续
> t5 = {[]=,[]=,[""]=,[]=};
> print(#t5)
--没从1开始计数,非常遗憾
- for遍历cnt++
那么难道没有API可以对hashmap计数了吗?让我这个Java流选手写Lua情何以堪。。。最后找了一位同学同样的疑问,它使用了for循环对key-value计数。。。
function count(ht)
local n = ;
for _, v in pairs(ht) do
n = n + ;
end
return n;
end
2、重点来啦,那么解决问题的方法?
相信大家看完文章,答案自然成竹于胸,也是很尴尬。那就是:
Lua中“hashmap型”table的元素计数,还得用for循环cnt++的方法。。。。
3、结论与感慨
该踩的坑还是得踩啊。。。
Torch-RNN运行过程中的坑 [1](读取Lua非空table,size为0)的更多相关文章
- Torch-RNN运行过程中的坑 [2](Lua的string sub函数,读取中文失败,乱码?)
0.踩坑背景 仍然是torch-rnn/LanguageModel.lua文件中的一些问题,仍然是这个狗血的LM:encode_string函数: function LM:encode_string( ...
- Torch-RNN运行过程中的坑 [0](一些基础概念)
0.Lua & LuaJIT简介 Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. Lua 是巴 ...
- HOWTO - Basic MSI安装包在安装运行过程中如何获取完整源路径
有朋友问到如何在一个Windows Installer安装包中获取安装包源路径,就是在安装包运行过程中动态获取*.msi所在完整路径. 这个问题分两类,如果我们的安装包只是一个*.msi安装文件,那么 ...
- ionic 运行过程中动态切换API服务器地址
ionic 运行过程中动态切换API服务器地址 keywords: ionic,phonegap,cordova,网络制式,动态切换,变更,API,服务器地址,$resource,localstora ...
- (转)在.NET程序运行过程中,什么是堆,什么是栈?什么情况下会在堆(栈)上分配数据?它们有性能上的区别吗?“结构”对象可能分配在堆上吗?什么情况下会发生,有什么需要注意的吗?
转自:http://www.cnblogs.com/xiaoyao2011/archive/2011/09/09/2172427.html 在.NET程序运行过程中,什么是堆,什么是栈? 堆也就是托管 ...
- Jmeter运行过程中如何让Fiddler同时可以抓获到服务器的应答报文
在默认情况下,Jmeter运行过程中,Fiddler是抓不到对应的应答报文的. 但是,在某些时候,我们希望分析Jmeter执行失败的原因,想了解Jmeter获取到的应答报文是否有问题,就需要同服务器返 ...
- 程序运行过程中遇到“ORA-03114: not connected to ORACLE”的问题解决
c#,winform程序,数据批量入oracle库时用到DataAdaper的.FillSchema函数,如:da.FillSchema(dt2, SchemaType.Mapped); 程序运行一段 ...
- 菜鸟帮你跳过openstack配置过程中的坑
一:前言 对于一个以前做java全栈工程师而言,而且没学过Linux,很少用虚拟机(还是在大学的时候简单的用过),去配置openstack我想我入的坑肯定比有基础的一定要多,躺在每个坑中徘徊思索的时间 ...
- 菜鸟帮你跳过openstack配置过程中的坑[文末新添加福利]
一:前言 对于一个以前做java全栈工程师而言,而且没学过Linux,很少用虚拟机(还是在大学的时候简单的用过),去配置openstack我想我入的坑肯定比有基础的一定要多,躺在每个坑中徘徊思索的时间 ...
随机推荐
- Spring3.0官网文档学习笔记(四)--3.1~3.2.3
3.1 Spring IoC容器与Beans简单介绍 BeanFactory接口提供对随意对象的配置: ApplicationContext是BeanFactory的子接口.整合了Sp ...
- 彻底删除Oracle 11g的方法
1.关闭oracle所有的服务. 可以在windows的服务管理器中关闭. 2.打开注册表:regedit 打开路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlS ...
- 用prerender-spa-plugin插件Vue项目优化SEO做ssr服务端渲染及预渲染
今天在做公交的时候没干,用手机看看文章,偶然发现了一个关于Vue优化seo的文章,我先是在Vue的官方文档看了一篇关于Vue做SEO优化的文章. 上面提到了nuxt.js这个框架,这个框架我做过一个小 ...
- mongodb - 查看数据库状态
> use test switched to db test > db.stats() { "db" : "test", #数据库名 "c ...
- LAMP架构二
安装PHP7 1.查看php配置文件信息(phpinfo),php有两个配置文件开发环境和生产环境 [root@localhost php-5.6.30]# /usr/local/php/bin/ph ...
- Application Request Route实现IIS Server Farms集群负载详解(转)
http://www.cnblogs.com/knowledgesea/p/5099893.html http://www.cnblogs.com/smileberry/p/4300849.html
- intellij jetBrains phpstorm/webstorm/IDEA 编辑器使用诀窍
下载地址 https://www.jetbrains.com/products.html?fromMenu 主题/皮肤切换或下载:https://blog.csdn.net/smallxiannoti ...
- ubuntu命令改变文档权限和所有者
chgrp :改变档案所属群组 chown :改变档案拥有者 chmod :改变档案的权限, SUID, SGID, SBIT等等的特性,可读.可写.可执行 1 chgrp 例子 chgrp [-R] ...
- OpenJudge百炼习题解答(C++)--题4074:积水量
题: 总时间限制: 1000ms 内存限制:65536kB 描写叙述 凹凸不平的地面每当下雨的时候总会积水.如果地面是一维的.每一块宽度都为1,高度是非负整数.那么能够用一个数组来表达一块 ...
- [svc]jdk1.7.0_13(系列)下载url
蛋疼了,这个版本,找了老半天没找到 最后是同事找到的 http://download.oracle.com/otn/java/jdk/7u13-b20/jdk-7u13-linux-x64.tar.g ...