今天下午调试 FCN 代码,因为需要上采样保持输出尺寸,所以需要往 Torch7 框架中添加 SpatialDeconvolution 层。
找了一圈发现 google 不到相应的信息,所以自己试,踩坑踩了一下午。
添加方法和坑见下,希望有同样需求的伙伴能避过坑。
添加方法
1 - 下载 Torch7 到本地
(in a terminal, run the commands)
curl -s https://raw.githubusercontent.com/torch/ezinstall/master/install-deps | bash
git clone https://github.com/torch/distro.git ~/torch --recursive
2 - 将需要添加的层添加到相应的分组中
比如说,SpatialDeconvolution 层是为了实现反卷积(上采样),属于 nn 模块,路径:~/torch/extra/nn/。
添加 SpatialDeconvolution.lua 到 ~/torch/extra/nn/ 目录
添加 SpatialDeconvolution.c 到 ~/torch/extra/nn/generic 目录
3 - init.c 及 init.lua 中添加相应初始化方式和调用方式
模仿同目录的层定义来写。
比如说,SpatialDeconvolution 可以按照 SpatialConvolution 的定义方式来模仿写。
4 - 安装
如果以前按照
cd ~/torch ./install.sh
安装过,那么进入目录,./clean.sh 先卸载,再 ./install.sh 安装。
如果没有安装过,直接 ./install.sh 就可以。
5 - 添加环境变量
source ~/.bashrc
(Linux)
source ~/.profile
(OSX)
踩过的坑
1 - 绝对不要试图将修改过的目录(比如上述示例中的 nn 文件夹)保存下来,通过下次直接替换整个目录的方式引入新定义的层。
Torch7 是个开源项目,今天下载的 Torch 和明天下载的 Torch 可能具有很大的差异。
今天我就是这样做的,结果发现 require 'cunn' 的时候报错,但是通过 luarocks install cunn 和查看已安装包的方式发现是安装了的。
后来发现是因为 cunn 基于 nn 实现,我直接替换上去的整个 nn 文件夹和现在的 cunn 调用 nn 的方式不一样,导致 cunn 无法被 require。
2 - 单独 make 某个 torch 子目录下的文件夹是没用的
在 Torch 下的子目录中,有大量的 CmakeList.txt 文件,最开始我以为只要 cmake + make 子文件夹就能起作用,后来发现都没用,有且只有 install.sh 是有用的。
这是因为 Torch7 中存在大量相互调用关系,比如之前提到的 cunn 实际上是调用了 nn 实现的,因此,单独 cmake + make nn 模块是不起作用的。
3 - 从官网 git clone 代码最靠谱
因为服务器上的 Torch 安装了有一段时间了,当时的 Torch 还没有实现 signal 中的傅里叶变换,所以当时需要自己添加。
今天下午 git clone 下来的代码发现已经添加了 fft 进去,省事很多。
作者署名:Hongyang Wang
版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0