我们有一个研究RCN算法的Q群:515743445,有兴趣可以加入,一起研究和讨论(虽然名字叫HTM。。。)
代码不要下载github上第一页搜到的那个,那个windows用不了。
下载源码
GitHub上给了另一个,做给Windows用的,源码下载地址https://github.com/davidleon/science_rcn
因为是代码是python 和 c++混写的,python文件识别不了它里面的c++文件。
就是dilation.py中的第二句话,要从dilation.h和 dilation.cc导入东西
import numpyas np
from _dilationimport max_filter1d, brute_max_filter1d
报错:ImportError: No module named _dilation
怎么办呢?运行代码文件夹中的setup.py,这样python 和 c++就能和谐相处了(代码没仔细看,不知道它干了什么)
但是直接用会出现问题:
science_rcn/dilation/dilation.cc(8) : fatal error C1083: Cannot open include file: 'stdbool.h': No such file or directory
error: command 'C:\Users\hasee\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\Bin\amd64\cl.exe' failed with exit status 2
问题1:缺少stdbool.h文件
看错误提示:缺少stdbool.h文件,官方还是很贴心的,给了你一个,就在那个文件夹中
把stdbool.h放入你的python环境中的include文件夹下,我的是F:\Users\hasee\Anaconda3\envs\HTM\include
问题2:C++文件有语法错误
还有一个问题:
python和C++和谐相处了,但是你C++有语法错误:创建数组使用未知大小的变量等。
从技术上讲:
这里出现的问题是使用可变长度数组。
虽然扩展代码在C99标准中有效,但Visual C ++ for Python仅支持C89并且不接受这种类型的数组声明,而gcc / g ++是此处使用的唯一编译器选项。
所以要安装个GCC编译器
以下内容参考:https://blog.csdn.net/altland/article/details/63252757
首先我们需要打开网址: www.mingw.org
直接点击右上方的 Download Installer 即可下载。
在打开的新页面会提示我们等待几秒秒后将开始下载。如果十多秒后也没有反应,可以点击进度条下方的direct link手动下载。
有人可能发现下载的安装软件相当地小,只有几十K。
这是因为我们下载的只是一个包管理器,包管理器安装后才能继续安装编译器等组件。
注意,整个安装过程都是在线的,因此请不要断开网络。
首先打开安装程序,按照提示,以默认选项进行安装即可。
一直默认安装直到如下
包管理器安装完成后将弹出这个界面:
找到mingw32-gcc-g++,点击Mark for Installation。
然后点击左上角的Installation菜单中的Apply changes选项,然后管理器将开始在线安装或更新被选中的组件。
下面耐心等待程序的安装。
安装完成后关闭包管理器,如果由于某种原因安装未能成功,在退出程序前程序将给予提示,选择review changes选项重新安装即可。
下一步配置环境变量
打开控制面板 -> 系统 -> 高级系统设置 -> 高级 -> 环境变量。
找到列表中的PATH选项,选中后点击编辑,在末尾添加
C:\MinGW\bin
点击确定,重启电脑,完成环境变量的配置。
检验是否安装成功,黑框框中输入 g++ -v
运行setup.py
用anaconda的黑框框,进入science_rcn-master文件夹下
小tips,windows指令:
1.进入F盘——f:
2.进入文件夹xx——cd xx
3.快速打出文件夹的名字——先打出首字母,按 tab键
输入:
python setup.py install
完成,之后去pycharm运行代码run.py吧
问题3:语法错误
配置是配好了,但是还是有一些问题,我的是代码显示有语法错误
instance method' object has no attribute 'getitem '
就是说根本没这样的写法,语句写错了
将所有graph.edges[n1,n2]['perturb_radius'] 改为 graph[n1][n2]['perturb_radius']就行了
(大概有3处,learning好像有2个,inference好像有1个,你可以设几个断点,Debug一下就能揪出它们了)