前言

记录一下复现论文《SPIKING CONVOLUTIONAL NEURAL NETWORKS FOR TEXT CLASSIFICATION》的过程,以免就调包感觉自己什么也没干不建议一步一步跟着我的步骤做,这个是实况,建议跳着看看再参考着做

论文概况

借助工具,大概对此篇的论文的认识如下

这篇文章探讨了使用脉冲神经网络(SNN)进行自然语言处理任务的可行性,以实现比深度神经网络更节能的效果。虽然SNN已被证明在视觉任务中可产生具有竞争力的结果,但由于以脉冲形式表示单词和处理变长文本的困难,对于它们在自然语言处理(NLP)任务中的有效性的研究还很少。作者提出了一种“转换+微调”的两步法来训练SNN进行文本分类,并提出了一种编码预训练词嵌入为脉冲训练的有效方法,使SNN能够利用来自大量文本数据的词嵌入。实证结果表明,经过所提出的方法训练的SNN在能源消耗更少的情况下能够实现与其DNN同行竞争的结果,并且它们也更具对抗性。该研究是在英语和中文语言的文本分类任务中展示SNN有效性的首批研究之一,并突显了转换方法和微调阶段中的代用梯度作为该领域的一个关键贡献。

在论文的末尾,找到作者开源的代码,并将其下载下来


弯路1

然后用Pycharm打开刚开作者的项目,找到md文档,点击Install Requirements旁边的绿色箭头一键安装环境

屏幕截图 2023-06-23 200449

经过一段时间,大部分都安装好了,但是有些还是出现了类似如下的报错

屏幕截图 2023-06-23 201023

这时候需要分别查看requirements.txttextattack_r.txt文件里,查看有哪些包没有装好

首先把Pycharm的环境切换到snn

屏幕截图 2023-06-23 195956

查看requirements.txt文件

屏幕截图 2023-06-23 201847

纳尼?!为什么显示一个都没装,那么刚刚的东西都装哪了

重新检查了一下刚刚命令行的代码,发现了问题,在脚本里使用conda activate是不会生效的

屏幕截图 2023-06-23 202649

按照上面的建议,修改一下切换环境的代码,然后将第一句注销了

#conda create -n snn python=3.7
CALL activate snn
pip install -r requirements.txt
pip install -r textattack_r.txt

再次点击旁边的绿色小箭头!

屏幕截图 2023-06-23 204422

emmmmm他演我!看来还是自己老老实实用命令行吧

屏幕截图 2023-06-23 205049

而且环境里的Python文件都有问题了!

……

……

重头开始吧

先把环境删了重新装一下

conda remove -n snn --all

安装环境

重装环境

conda create -n snn python=3.7
conda activate snn

然后Pycharm重新加载一下环境,使用命令行进入到项目的路径

cd /d D:\code\SNN

安装环境

pip install -r requirements.txt
pip install -r textattack_r.txt

屏幕截图 2023-06-23 210230

走起!

屏幕截图 2023-06-23 210429

找不见文件?!检查了一下,发现是作者是文件名和代码里的名字对不上(少了一个i

把其中一句改一下

pip install -r requrements.txt

再跑一次!

屏幕截图 2023-06-23 210804

很好,没有报错!再继续安装另一个文件里的包

屏幕截图 2023-06-23 211222

根据提示,只有 pycld2这个包没有安装成功

重新单独装一下试试

pip install pycld2

屏幕截图 2023-06-23 211601

还是报错,这次发现了原因,是缺少某个C++的库,点进去提供的链接进行下载

选择如下模块进行安装(建议装在除C盘外的盘,占用

屏幕截图 2023-06-23 211947

经过大概20多分钟,安装完毕,重启,然后再次安装那个包

屏幕截图 2023-06-24 081107

啊嘞,还报错!

通过搜索,看到了一个解决方案。首先进去这个网站下载需要安装的包,由于当前环境是Python3.7的,所以下载如下的包

屏幕截图 2023-06-24 083511

下载完成后,使用如下命令进行安装:

pip install .whl文件的绝对路径

例如我的命令

pip install G:\Download\Chrome\pycld2-0.41-cp37-cp37m-win_amd64.whl

走起!

屏幕截图 2023-06-24 083832

nice,这下包就全部安装完毕了,可以试试能不能跑起来了

下载数据库ChnSenti

屏幕截图 2023-06-24 084301

当我翻到最后时,发现居然要自己准备数据集!!!

让我翻一下论文康康他们用的什么数据集,发现他们中文数据集用的是ChnSentiWaimai,我挑了一个ChnSenti数据集

网上搜索一下ChnSenti数据集的下载地址,找到一个github的地址

将下载的ChnSentiCorp_htl_all.csv文件放在项目中(新建一个名为datasets的文件夹)

屏幕截图 2023-06-24 090501

然后应该就是找找从哪调用这个数据集,改一下路径什么的了

安装环境DLC

ちょっと待って,好像还有包没有装完

屏幕截图 2023-06-24 090634

鼠标右键一键安装一下(好像要一个什么插件,根据Pycharm的提示安装一下就行)

然后就可以摸摸鱼

经过了一个多小时的等待,安装的差不多了

image-20230624132216425

把剩下的包再装一下

pip install bert-score==0.3.5
pip install flair
pip install pinyin==0.4.0
pip install OpenHowNet

安装完毕后,就会显示浅色的波浪线了

屏幕截图 2023-06-24 155740

接下来应该就是跑程序了,我需要跑的是一个中文数据集

根据作者的md文件

Shift Pre-trained Word Embeddings to [0, 1]

cd data_preprocess
python tensor_encoder.py
python chinese_tensor_encoder.py

找到项目根目录\data_preprocess\chinese_tensor_encoder.py

屏幕截图 2023-06-24 162120

这里应该需要把地址和数据集(也改成txt格式的)改一下

先换格式

屏幕截图 2023-06-24 162547

然后改一下地址

datafile_path="../datasets/chnsenti_test.txt"

先跑一下试试

屏幕截图 2023-06-24 163436

重装numpy

大概意思应该是我numpy这个包有问题,康康自己是装的是什么版本的

pip list

然后Ctrl+Shift+F搜索一下numpy,发现我的版本是1.21.6,盲猜是不是有点高了

屏幕截图 2023-06-24 163609

根据之前的经验,可能是TensorFlownumpy的版本不适配导致的

于是查了一下,果然不匹配,我的TensorFlow版本是1.14.0

屏幕截图 2023-06-24 164441

于是重装一下numpy

pip install -U numpy==1.16.0

屏幕截图 2023-06-24 164740

然后跳出来一片红……我的基金要是这样红该有多好

研究一下,装一下版本为1.17.3的就可以全解决,再试一下

pip install -U numpy==1.17.3

屏幕截图 2023-06-24 165037

还有一个问题,是torchvision不和torch版本不匹配,重新安装一下torch吧,(我记得他会自动卸载之前的版本)

conda install pytorch==1.12.0 torchvision==0.13.0 torchaudio==0.12.0 cudatoolkit=11.3

安装完以后,在试一次!

屏幕截图 2023-06-24 180924

又双叒叕报错了,这次应该是pyarrow这个包有问题,试试重装?

pip install -U pyarrow

再跑一次试试

屏幕截图 2023-06-24 181728

好消息,刚才那个错是没有了。看前面几行,好像是numpy装了两个版本吗,查看一下

pip list

屏幕截图 2023-06-24 184534

只有一个啊,是不是之前操作失误,把包全装在base环境里导致的

切换到base环境删除numpy(这个需要使用管理员运行prompt

pip uninstall numpy

屏幕截图 2023-06-24 185504

再跑一次试试

好吧还是刚刚那个问题,要不这次直接物理删除试试\doge,找到他说的地方,删除其中一个文件

屏幕截图 2023-06-24 185819

在跑一次康康有没有前面的报错了(删除要关闭Pycharm,否则会提示文件被占用)

屏幕截图 2023-06-24 190048

啊这,这是删除崩了吗,那就重装一下吧,把剩下的直接物理删除完

屏幕截图 2023-06-24 190201

重新安装一下(复制一下上面的代码

pip install -U numpy==1.17.3

屏幕截图 2023-06-24 190459

怎么感觉自己越走越远了,试试他给我的建议

pip install --force-reinstall --no-deps numpy==1.21.6

屏幕截图 2023-06-24 190740

淦,还不行,等等,我可以从回收站恢复!还可以挽救。

恢复完毕后,再跑一下看看

屏幕截图 2023-06-24 190953

又回到了这个熟悉的报错,那就先解决下面的问题吧,感觉是什么xxhash的包有问题

重新安装一下试试

pip install -U xxhash

屏幕截图 2023-06-24 191156

看来刚刚一番折腾,还得把numpy这个包重装一下

pip install -U numpy==1.17.3

屏幕截图 2023-06-24 191311

啊?我康康能不能先卸载了

屏幕截图 2023-06-24 191512

也不太行,查了一下网上的强制升级试试?

pip install numpy --ignore-installed numpy

屏幕截图 2023-06-24 191614

nice,装好了,那再重装到1.17.3版本试试

pip install -U numpy==1.17.3

屏幕截图 2023-06-24 191712

回来了,都回来了!跑一下试试

解决报错OSError: [WinError 126]

屏幕截图 2023-06-24 191846

又换错了…但是前面的冲突居然没有了耶

查了一下网上这个错最好还是重装

那就试试重装nltk这个包吧

pip uninstall nltk
pip install nltk

再跑试试。好吧还是上面那个错。网上看了一个博客的解决方法,打算试试

屏幕截图 2023-06-24 193137

但是这个错我感觉还是nltk这个包的问题啊

查一下作者用的版本

屏幕截图 2023-06-24 193236

这也太痛了,那么就查一下nltk关于OSError: [WinError 126]这个错的方向吧

果不其然搜到了

屏幕截图 2023-06-24 193523

照着上面的解决方案做一下

屏幕截图 2023-06-24 193720

但是还是有戏的,安装完毕

屏幕截图 2023-06-24 193921

再….跑一次试试吧

屏幕截图 2023-06-24 194018

???为什么。网上搜了一圈也没有很合适的,问问万能的chatGPT吧

屏幕截图 2023-06-26 230624

我盲猜可能是因为第三条,安装一下试试,由于找不见他说的Microsoft Visual C++ Redistributable for Visual Studio,我直接装了一个IDE,(这总可以包含了吧)

屏幕截图 2023-06-27 180927

跑一下试试

屏幕截图 2023-06-27 181140

oh no!我不信了!B站找到了一个下载方式,把文件下载下来如下:

屏幕截图 2023-06-27 181620

运行一下.bat文件试试

屏幕截图 2023-06-27 182021

然后重启一下试试,然后跑一下

屏幕截图 2023-06-27 182610

所以可能就不是少装C++库的问题吧,把nltk重装了试试吧

pip uninstall nltk
pip install nltk

用网上验证成功安装的方法检测一下:

屏幕截图 2023-06-27 190509

from nltk.book import *

屏幕截图 2023-06-27 190547

这应该是成功安装了,再跑试试

屏幕截图 2023-06-27 182823

卡住了啊!难道是这个版本太新了?可是也不知道作者的版本是多少啊emm。全局搜一下康康能不能有什么线索

最后也没找到emm,问问chatGPT 4.0的试试吧……

出现这个错误的原因可能是nltk库所依赖的某些模块或动态链接库在你的系统中找不到。为了帮助你解决这个问题,请按照以下步骤操作:

1. 首先,确保你已经安装了nltk库。在conda虚拟环境中,你可以运行以下命令来安装nltk:

```sh
conda activate your_env_name
conda install -c anaconda nltk
```

将`your_env_name`替换为你的conda虚拟环境名称。

2. 请确保你的操作系统中安装了对应的Visual C++运行时库。对于不同版本的Python,需要相应版本的Visual C++运行时库。例如,对于Python 3.7,你应该安装[Microsoft Visual C++ 2015-2019 Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)。

3. 如果问题仍未解决,请尝试升级nltk库:

```sh
conda activate your_env_name
conda update nltk
```

4. 如果问题仍然存在,可以尝试重装nltk库:

```sh
conda activate your_env_name
conda uninstall nltk
conda install -c anaconda nltk
```

5. 如果以上方法都不能解决问题,请尝试在conda虚拟环境中安装`nltk`库的依赖项。例如,`numpy`可能是一个必要的依赖项。要安装它,请运行:

```sh
conda activate your_env_name
conda install numpy
```

希望上述步骤能帮助你解决问题。如果问题仍然存在,请提供更多详细信息,以便我们能够更好地帮助你。

感觉完全没用呀,要不我试试把x86Microsoft Visual C++ 2015-2019 Redistributable卸载了?有没有可能和x64版本的相互影响?

屏幕截图 2023-06-27 184933

卸载完后,在运行试试?

太离谱了,还是上面的错!又看了几个博客,好像意思是可能是依赖缺少的问题,他们推荐用Dependency Walker这个软件下一下组件

屏幕截图 2023-06-27 185446

我下载的是这个,根据网上说明,只要找到dll或者exe文件就可以了

屏幕截图 2023-06-27 191021

但是!

屏幕截图 2023-06-27 190817

就离谱!exe文件也一样

仔细想了想,可能nltk这个库确实是没问题的,那么可能是他下面依赖的库不全的问题,继续查看报错的信息,看到最后一行

屏幕截图 2023-06-27 191447

他最后要找的是ctypes这个库下的某个东西,结果没有找到,那可能出问题的是ctypes这个库?

安装一下

pip install ctypes

屏幕截图 2023-06-27 192030

打扰了,使用conda安装也装不了

又难道是scipy这个库,他说scipy>=1.4.1,我的版本是1.7.3难道是太高了吗

试试重装一个1.4.1版本的

pip install -U scipy==1.4.1

屏幕截图 2023-06-27 194333

跑一下试试吧…

image-20230627194555681

woc?!这个错解决了吗?!ohhhhhhh

弯路2


这个错感觉好说,配一下路径就行(理论上

好像是没有下载word2vec这个数据集,网上搜了一下,找到了好人发的度盘资源,下载下来康康

image-20230628114534236

emmm怎么用呢,好像和程序里的目录不太一样

在论文里康康

79405c0f6bd9693beb7fdeafaf230a9

我不会还要自己先用这个工具包先弄出点数据吧…

往下看md文档,好像下面就是训练数据了,先试试可以跳过预训练不

Train Tailored Models

python main.py \
--mode train
--model_mode ann
--model_type textcnn

把这部分改成bash语言(转换用的chatGPT)

@echo off
python main.py ^
--mode train ^
--model_mode ann ^
--model_type textcnn

然后新建一个.bat文件,把这段代码放进去跑一下试试

image-20230628160203135

走起

image-20230628160249712

盲猜是因为在脚本里没有选择环境(之前的经验),在脚本最前面加入这段代码

%切换到snn环境%
CALL activate snn

image-20230628160628632

跑一下

image-20230628160706883

好像是又少什么包了

image-20230628160811533

对比了一下,画红线的那两个包在代码里也没有啊,要不注释了试试吧

image-20230628161111726

再跑试试

image-20230628161142673

看了一下,下面的代码还用到了,那就退回上一步,用IDE的建议试试

image-20230628161422730

可恶,还报错

观察了一下刚刚转换完的脚本,他用的是textcnn这个模型,和报错的那两个没有关系

那就!把报错的全注释8!再运行一下

image-20230628162018807

好像是路径的问题,怎么会有lvchangze这个文件夹

全局搜索一下

image-20230628162158756

修改一下吧

image-20230628163618882

再试试吧

image-20230628163705575

好消息是少了前面一坨红字了,网上查了一下这个错

image-20230629092442814

看来可能还是路径的问题?修改一下刚刚改的路径试试

self.workspace = 'D:\\code\\SNN'

image-20230629092733737

跑一下试试

image-20230629092837676

行吧,还是那个错,但是我发现这个目录最后有一个.log文件,但是实习在那个目录里却没有

image-20230629092931037

难道是因为创建不了这个文件的原因,所以导致读取不到吗(可能是不是权限的问题

image-20230629093039827

加点权限试试,然后再跑一下试试

image-20230629093155829

好吧,还是这个错。那试试用管理员开始bat文件?

可恶一闪而过了,加入点东西让他运行完停止

%使用read命令达到类似bat中的pause命令效果%
echo 按任意键继续
read -n 1
echo 继续运行

再运行试试,可恶也是一闪而过

这样吧,反正这玩意是日志,应该注释了不影响

image-20230629093706751

给他注释了

image-20230629093746034

这是数据集找不见了,全局搜索一下data_path的字段

根据脚本的字段设置,找到关于anntextcnn相关的,修改一下路径

--model_mode ann ^
--model_type textcnn

等等有一个更好的方法,可以让程序输出一下原本data_path里的字段,然后顺着这个字段改一下就行

print("这里应该有数据集"+args.data_path)

把上面这句加在这里

image-20230629094553351

跑一下康康路径在哪

屏幕截图 2023-06-29 094634

bingo!把我刚找的数据集放在这个目录下试试吧,等等我找的应该不太行

他之前的文件夹是sst2,在论文里找一下这个数据集的下载方式吧

网上搜了一下SST-2是一个什么东西

image-20230629095830475

这是他论文中提供的一个数据集的下载地址,搜了一圈,发现他是把积极和消极的评论数据集分开放了

发现我又从网上找到了一个SST-2下载地址,下载下来后解压是这些文件

image-20230629101313283

试试能不能套上去吧

image-20230629102623668

跑一下试试

image-20230629102827453

啊好吧,可能是路径没改完,这样吧,直接在main文件里把传过来的地址改一下,把之前改的注销了

image-20230629103651187

再跑一下试试

image-20230629103825433

阿哲,还可以下溢的吗


弯路3

隔了好多天,网上看博客用word2vec工具把预训练集弄出来了,这次试试吧

这次跑完生成了如下几个文件

image-20230705154808654

试试把预训练的代码改一下

image-20230705155238466

跑一下data_preprocess/chinese_tensor_encoder.py试试吧

image-20230705155346084

有毒,那把第一个文件改成wiki.zh.text.model.syn1neg试试

vocab_path="../word2vec/wiki.zh.text.model.syn1neg"

image-20230705155536477

看来没有这个文件还是不太行啊


将预训练的词嵌入转移到 [0, 1]

又过了一段时间,联系到了原作者,热心的作者给我发了这个文件!!!!

链接:https://pan.baidu.com/s/1eHcj8bvbQPAg76v7D_Xs8A 
提取码:tvr8

image-20230710124846593

跑一跑试试吧

image-20230710125324489

解决编码问题

好像是编码的问题?

image-20230710125505872

把里面的代码改改试试

with open(self.vocab_path, "r") //旧
with open(self.vocab_path, "r",encoding='utf8') //新

再跑试试?

image-20230710130032731

这是在跑吗好像,先等会康康吧

image-20230710131123106

看来可以跑,应该是刚刚没改干净,看来和open有关的都需要改

with open(datafile_path, "r") as f:   //旧
with open(datafile_path, "r",encoding='utf8') as f: //新

再跑试试

python chinese_tensor_encoder.py

image-20230710144910295

还有错?!继续查查怎么改

image-20230710145152994

试试直接ignore了,不对,可能是我的数据集的问题

image-20230710150619368

ChnSentiCorp_htl_all.csv的内容直接复制到chnsenti_test.txt中,用utf-8就不会出现乱码了

再跑跑试试

image-20230710151333555

6!把数据集直接改成ChnSentiCorp_htl_all.csv这个文件试试

emmm还是这个错,有仔细观察了一下,好像是label在第一个,句子在第二个,那感觉和代码里的就反过来了

之前的代码:

sentence = temp[0].strip()
label = int(temp[1])

改后:

sentence = temp[1].strip()
label = int(temp[0])

再跑试试吧

image-20230710161042621

emmm用Pycharm还不能直接运行,只能在命令行里运行

等等我知道我为什么pycharm运行不了了

之前迁移过一次环境从C盘到D盘,试了试这个博客的方法,把这个问题解决了

调试了一下,发现要把数据集最开始的一行删了,感觉是那个导致的报错

再跑试试,发现还是那个错

我感觉可能是数据集变了处理数据的内容需要修改一下

康康chatGPT是怎么处理的吧:

可以使用Python中的字符串操作来提取这个句子并将它分别存放在label和sentence字段中。

text = '1,"距离川沙公路较近,但是公交指示不对,如果是""蔡陆线""的话,会非常麻烦.建议用别的路线.房间较为简单."\n'

# 提取label
label = text.split(',')[0]

# 提取sentence
sentence = text.split(',')[1].strip()[1:-2]

print(label)
print(sentence)

输出结果为:

1
距离川沙公路较近,但是公交指示不对,如果是"蔡陆线"的话,会非常麻烦.建议用别的路线.房间较为简单.

按照这个把代码改一改,原代码

with open(datafile_path, "r", encoding='utf8') as f:
for line in f.readlines():
temp = line.split('\t')
sentence = temp[0].strip()
label = int(temp[0])
# sentence = temp[1].strip()
# label = int(temp[0])
sample_list.append((sentence, label))

改完

with open(datafile_path, "r", encoding='utf8') as f:
for line in f.readlines():
temp = line.split('\t')
# sentence = temp[0].strip()
# label = int(temp[1])
sentence = temp[0].split(',')[1].strip()[1:-2]
label = temp[0].split(',')[0]
sample_list.append((sentence, label))

跑跑试试

image-20230710184632963

感觉有希望了耶,试试把报错那句的utf8去掉试试。再跑试试

image-20230710185614613

别报错别报错×114514

image-20230710190309371

居然说我找不到文件,建个叫senti的文件夹试试

08f46c72ca112d14c2102a5e17a7406

训练定制模型

image-20230710194725452

好像又是少文件,试试把刚刚跑出来的文件重命名为train_u_3v_sst2_glove300d_sent_len25.tensor_dataset试试

image-20230710195102925

啊这,再把上面跑出来的文件复制一份改个名过去康康

image-20230710195304235

我怎么没看懂哪错了,从下往上看,找到最后项目代码报的那一行错

torch.save(model.state_dict(), save_path)

好像是我之前把日志那行代码注释了导致的

屏幕截图 2023-07-12 203749

解除注释试试

image-20230712203926230

又是文件读写的问题,好像日志文件就是创建不了,难道是系统权限的问题吗

解决报错OSError:[Errno 22] Invalid argument

试试用管理员身份运行试试

image-20230712204810636

看来不是权限的问题,突然网上看到了这个,我感觉很有道理耶

image-20230712204932116

不能用冒号啊!!!!!!!!!!!!!!!!!!!!!!!

屏幕截图 2023-07-12 222221

瞬间知道怎么改了

把这句改一下

file_name = "{}.log".format(time.strftime("%Y-%m-%d %H:%M:%S", local_time))  //旧

file_name = "{}.log".format(time.strftime("%Y-%m-%d %H-%M-%S", local_time)) //新

跑一次试试

image-20230712222431492怎么还有冒号

image-20230712222534705

把这里全局搜索到的都改一下试试

image-20230712222823863

难道有戏?!

image-20230712222935732

对比一下作者的结果

屏幕截图 2023-07-13 161415

为什么作者的好高啊

转换+归一化

接下来就是把这句改成批处理的代码

python main.py \
--mode conversion
--model_mode snn
--model_type textcnn
--conversion_mode normalize
--conversion_normalize_type model_base or data_base

转换完后,在前面加上切换环境的代码

@echo off

%切换到snn环境%
CALL activate snn

python main.py ^
--mode conversion ^
--model_mode snn ^
--model_type textcnn ^
--conversion_mode normalize ^
--conversion_normalize_type model_base or data_base

跑一下试试

image-20230713091029595

这题我会!又是文件名不符合Windows的命名规则(说人话就是不能出现:

在全局搜一下%H:%M:%S关键字,但是我搜到的全改了啊

突然一看报的时间,咦?为什么是2022年的呢,可能是不是写死文件名了

顺着搜了一下

image-20230713091633520

果然!!!把后面那部分去了试试

self.conversion_model_path = "saved_models/2022-09-17 22:53:22.log--epoch4.pth"   //旧
self.conversion_model_path = "saved_models/" //新

再跑跑试试

image-20230713091926963

为什么拒绝访问鸭。我懂了,应该是要加载某个文件,我试试加载一个文件试试

self.conversion_model_path = "saved_models/model_modeann-modetrain-model_typetextcnn-dataset_namesst2-sentence_length25-dropout_p0.5-weight_decay0.0-batch_size32-learning_rate0.0001-label_num2/2023-07-12 22-29-13.log--epoch46.pth"

image-20230713093254555

虽然但是,为什么精度还下降了一点emm。不过我的推理没错,这里果然是要加载一个文件,跑起来就算成功

以下是作者的结果,好神秘只有Conv SNN + MN这一项和作者比较接近

image-20230713162351591

转换 + 微调

还是惯例,把下面的代码换成Windows下能运行的

python main.py \
--mode conversion
--model_mode snn
--model_type textcnn
--conversion_mode tune

换成.bat文件后,加上环境

@echo off

%切换到snn环境%
CALL activate snn

python main.py ^
--mode conversion ^
--model_mode snn ^
--model_type textcnn ^
--conversion_mode tune

运行试试

image-20230713094327585

为什么不动鸭,再等等吧

image-20230713094837489

速度好慢,一直挂着吧

image-20230713102720050

半小时走了20%

image-20230713112248591

过了一小时,又走了20%多

image-20230713115158894

又过了一小时,说起来这玩意占资源占的好多

image-20230713115306126

又过了一个多小时….

image-20230713125534432

ohhhhhhhhhhhhhh终于跑完了

屏幕截图 2023-07-13 131142

屏幕截图 2023-07-13 131125

记录一下全部的输出

cmd.exe /c "Conversion + Fine-tuning SNNs.bat"
Program args: SNNArgs(args_for_logging=['model_mode', 'mode', 'conversion_mode', 'model_type', 'dataset_name', 'conversion_normalize_type', 'label_num', 'positive_init_rate', 'num_steps', 'learning_rate'], attack_logging_dir='D:\\code\\SNN\\logs_attack', attack_method='textfooler', attack_model_path='saved_models/best.pth', attack_numbers=1000, attack_text_path='data/sst2/test.txt', attack_times=1, batch_size=32, beta=1.0, bidirectional='True', bit=8, codebook_type='green', conversion_mode='tune', conversion_model_path='saved_models/model_modeann-modetrain-model_typetextcnn-dataset_namesst2-sentence_length25-dropout_p0.5-weight_decay0.0-batch_size32-learning_rate0.0001-label_num2/2023-07-12 22-29-13.log--epoch46.pth', conversion_normalize_type='model_base', data_augment_path='data/sst2/train_augment.txt', data_dir='D:\\code\\SNN\\data\\sst2', data_path='data/sst2/train_u_3v_sst2_glove300d_sent_len25.tensor_dataset', dataset_name='sst2', dead_neuron_checker='False', dev_data_path='data/sst2/dev_u_3v_sst2_glove300d_sent_len25.tensor_dataset', device=device(type='cuda'), distill_batch=32, distill_epoch=30, dpcnn_block_num=2, dpcnn_step_length=5, dropout_p=0.5, encode='rate', ensemble='False', ensemble_class=2, epochs=50, feature_loss_weight=10, filter_num=100, filters=[3, 4, 5], hidden_dim=300, hidden_layer_num=200, initial_method='zero', label_num=2, learning_rate=0.0001, logging_dir='D:\\code\\SNN\\logs\\model_modesnn-modeconversion-conversion_modetune-model_typetextcnn-dataset_namesst2-conversion_normalize_typemodel_base-label_num2-positive_init_rate0.55-num_steps50-learning_rate0.0001', logging_path='D:\\code\\SNN\\logs\\model_modesnn-modeconversion-conversion_modetune-model_typetextcnn-dataset_namesst2-conversion_normalize_typemodel_base-label_num2-positive_init_rate0.55-num_steps50-learning_rate0.0001\\2023-07-13 09-38-21.log', logit_loss_weight=1.0, loss='ce_rate', lstm_fc1_num=200, lstm_hidden_size=150, lstm_layers_num=1, max_len=25, mode='conversion', model_mode='snn', model_type='textcnn', modify_ratio=0.1, neighbour_vocab_size=15, num_steps=50, optimizer_name='Adamw', positive_init_rate=0.55, pretrain_embedding_name='glove', saving_dir='D:\\code\\SNN\\saved_models\\model_modesnn-modeconversion-conversion_modetune-model_typetextcnn-dataset_namesst2-conversion_normalize_typemodel_base-label_num2-positive_init_rate0.55-num_steps50-learning_rate0.0001', seed=42, sentence_length=25, sentence_similarity=0.8, student_model_name='dpcnn', surrogate='fast_sigmoid', teacher_model_path='saved_models/bert-base-uncased_2022-09-14 18:27:35_epoch0_0.9335529928610653', test_data_path='data/sst2/test_u_3v_sst2_glove300d_sent_len25.tensor_dataset', threshold=1.0, use_codebook='False', use_seed='False', vocab_path='D:\\code\\SNN\\data/glove.6B.300d.txt', weight_decay=0.0, workspace='D:\\code\\SNN')
Build model...
SNN_TextCNN(
(convs_1): ModuleList(
(0): Conv2d(1, 100, kernel_size=(3, 300), stride=(1, 1))
(1): Conv2d(1, 100, kernel_size=(4, 300), stride=(1, 1))
(2): Conv2d(1, 100, kernel_size=(5, 300), stride=(1, 1))
)
(middle_lifs): ModuleList(
(0): Leaky()
(1): Leaky()
(2): Leaky()
)
(avgpool_1): ModuleList(
(0): AvgPool2d(kernel_size=(23, 1), stride=(23, 1), padding=0)
(1): AvgPool2d(kernel_size=(22, 1), stride=(22, 1), padding=0)
(2): AvgPool2d(kernel_size=(21, 1), stride=(21, 1), padding=0)
)
(lif1): Leaky()
(fc_1): Linear(in_features=300, out_features=2, bias=True)
(lif2): Leaky()
)
Build dataset...
Build dataset...
Build rated_dataset...
Build dataloader...
Build rated_dataset...
Build dataloader...
Test acc of conversioned textcnn is: 0.7939737316507854
Build Optimizer...
Training Begin
56%|█████▌ | 28/50 [2:00:10<1:38:16, 268.02s/it]Dead_neuron_rate in epoch 0: 0.15.
Too_Activate_neuron_rate in epoch 0: 0.0.
Training epoch 0, avg_loss: tensor([0.5627], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 0 is: 0.7807107906258048
D:\code\SNN\saved_models\model_modesnn-modeconversion-conversion_modetune-model_typetextcnn-dataset_namesst2-conversion_normalize_typemodel_base-label_num2-positive_init_rate0.55-num_steps50-learning_rate0.0001\2023-07-13 09-44-12.log--epoch0.pth
Dead_neuron_rate in epoch 1: 0.15333333333333332.
Too_Activate_neuron_rate in epoch 1: 0.0.
Training epoch 1, avg_loss: tensor([0.5601], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 1 is: 0.7866340458408447
D:\code\SNN\saved_models\model_modesnn-modeconversion-conversion_modetune-model_typetextcnn-dataset_namesst2-conversion_normalize_typemodel_base-label_num2-positive_init_rate0.55-num_steps50-learning_rate0.0001\2023-07-13 09-47-44.log--epoch1.pth
Dead_neuron_rate in epoch 2: 0.15.
Too_Activate_neuron_rate in epoch 2: 0.0.
Training epoch 2, avg_loss: tensor([0.5585], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 2 is: 0.7778779294360031
Dead_neuron_rate in epoch 3: 0.15333333333333332.
Too_Activate_neuron_rate in epoch 3: 0.0.
Training epoch 3, avg_loss: tensor([0.5592], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 3 is: 0.7863765130054082
Dead_neuron_rate in epoch 4: 0.12333333333333334.
Too_Activate_neuron_rate in epoch 4: 0.0.
Training epoch 4, avg_loss: tensor([0.5588], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 4 is: 0.7892093741952099
D:\code\SNN\saved_models\model_modesnn-modeconversion-conversion_modetune-model_typetextcnn-dataset_namesst2-conversion_normalize_typemodel_base-label_num2-positive_init_rate0.55-num_steps50-learning_rate0.0001\2023-07-13 09-59-33.log--epoch4.pth
Dead_neuron_rate in epoch 5: 0.16333333333333333.
Too_Activate_neuron_rate in epoch 5: 0.0.
Training epoch 5, avg_loss: tensor([0.5589], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 5 is: 0.7898532062838012
D:\code\SNN\saved_models\model_modesnn-modeconversion-conversion_modetune-model_typetextcnn-dataset_namesst2-conversion_normalize_typemodel_base-label_num2-positive_init_rate0.55-num_steps50-learning_rate0.0001\2023-07-13 10-03-51.log--epoch5.pth
Dead_neuron_rate in epoch 6: 0.15.
Too_Activate_neuron_rate in epoch 6: 0.0.
Training epoch 6, avg_loss: tensor([0.5583], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 6 is: 0.7944887973216586
D:\code\SNN\saved_models\model_modesnn-modeconversion-conversion_modetune-model_typetextcnn-dataset_namesst2-conversion_normalize_typemodel_base-label_num2-positive_init_rate0.55-num_steps50-learning_rate0.0001\2023-07-13 10-08-05.log--epoch6.pth
Dead_neuron_rate in epoch 7: 0.15333333333333332.
Too_Activate_neuron_rate in epoch 7: 0.0.
Training epoch 7, avg_loss: tensor([0.5564], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 7 is: 0.7647437548287407
Dead_neuron_rate in epoch 8: 0.13333333333333333.
Too_Activate_neuron_rate in epoch 8: 0.0.
Training epoch 8, avg_loss: tensor([0.5547], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 8 is: 0.773886170486737
Dead_neuron_rate in epoch 9: 0.15.
Too_Activate_neuron_rate in epoch 9: 0.0.
Training epoch 9, avg_loss: tensor([0.5537], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 9 is: 0.7920422353850116
Dead_neuron_rate in epoch 10: 0.15666666666666668.
Too_Activate_neuron_rate in epoch 10: 0.0.
Training epoch 10, avg_loss: tensor([0.5517], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 10 is: 0.7962915271697142
D:\code\SNN\saved_models\model_modesnn-modeconversion-conversion_modetune-model_typetextcnn-dataset_namesst2-conversion_normalize_typemodel_base-label_num2-positive_init_rate0.55-num_steps50-learning_rate0.0001\2023-07-13 10-25-53.log--epoch10.pth
Dead_neuron_rate in epoch 11: 0.15.
Too_Activate_neuron_rate in epoch 11: 0.0.
Training epoch 11, avg_loss: tensor([0.5532], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 11 is: 0.7890806077774917
Dead_neuron_rate in epoch 12: 0.14333333333333334.
Too_Activate_neuron_rate in epoch 12: 0.0.
Training epoch 12, avg_loss: tensor([0.5551], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 12 is: 0.7742724697398918
Dead_neuron_rate in epoch 13: 0.15.
Too_Activate_neuron_rate in epoch 13: 0.0.
Training epoch 13, avg_loss: tensor([0.5559], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 13 is: 0.801184651043008
D:\code\SNN\saved_models\model_modesnn-modeconversion-conversion_modetune-model_typetextcnn-dataset_namesst2-conversion_normalize_typemodel_base-label_num2-positive_init_rate0.55-num_steps50-learning_rate0.0001\2023-07-13 10-38-37.log--epoch13.pth
Dead_neuron_rate in epoch 14: 0.13666666666666666.
Too_Activate_neuron_rate in epoch 14: 0.0.
Training epoch 14, avg_loss: tensor([0.5492], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 14 is: 0.7755601339170745
Dead_neuron_rate in epoch 15: 0.14666666666666667.
Too_Activate_neuron_rate in epoch 15: 0.0.
Training epoch 15, avg_loss: tensor([0.5500], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 15 is: 0.8000257532835436
Dead_neuron_rate in epoch 16: 0.14.
Too_Activate_neuron_rate in epoch 16: 0.0.
Training epoch 16, avg_loss: tensor([0.5511], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 16 is: 0.798738089106361
Dead_neuron_rate in epoch 17: 0.14333333333333334.
Too_Activate_neuron_rate in epoch 17: 0.0.
Training epoch 17, avg_loss: tensor([0.5511], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 17 is: 0.800154519701262
Dead_neuron_rate in epoch 18: 0.13666666666666666.
Too_Activate_neuron_rate in epoch 18: 0.0.
Training epoch 18, avg_loss: tensor([0.5511], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 18 is: 0.7955189286634046
Dead_neuron_rate in epoch 19: 0.14333333333333334.
Too_Activate_neuron_rate in epoch 19: 0.0.
Training epoch 19, avg_loss: tensor([0.5499], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 19 is: 0.7998969868658254
Dead_neuron_rate in epoch 20: 0.14.
Too_Activate_neuron_rate in epoch 20: 0.0.
Training epoch 20, avg_loss: tensor([0.5454], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 20 is: 0.7839299510687613
Dead_neuron_rate in epoch 21: 0.14666666666666667.
Too_Activate_neuron_rate in epoch 21: 0.0.
Training epoch 21, avg_loss: tensor([0.5480], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 21 is: 0.7948750965748133
Dead_neuron_rate in epoch 22: 0.14333333333333334.
Too_Activate_neuron_rate in epoch 22: 0.0.
Training epoch 22, avg_loss: tensor([0.5478], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 22 is: 0.8050476435745557
D:\code\SNN\saved_models\model_modesnn-modeconversion-conversion_modetune-model_typetextcnn-dataset_namesst2-conversion_normalize_typemodel_base-label_num2-positive_init_rate0.55-num_steps50-learning_rate0.0001\2023-07-13 11-20-25.log--epoch22.pth
Dead_neuron_rate in epoch 23: 0.13.
Too_Activate_neuron_rate in epoch 23: 0.0.
Training epoch 23, avg_loss: tensor([0.5459], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 23 is: 0.8016997167138811
Dead_neuron_rate in epoch 24: 0.13.
Too_Activate_neuron_rate in epoch 24: 0.0.
Training epoch 24, avg_loss: tensor([0.5517], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 24 is: 0.8019572495493176
Dead_neuron_rate in epoch 25: 0.14333333333333334.
Too_Activate_neuron_rate in epoch 25: 0.0.
Training epoch 25, avg_loss: tensor([0.5518], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 25 is: 0.8047901107391192
Dead_neuron_rate in epoch 26: 0.14333333333333334.
Too_Activate_neuron_rate in epoch 26: 0.0.
Training epoch 26, avg_loss: tensor([0.5454], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 26 is: 0.8023435488024723
Dead_neuron_rate in epoch 27: 0.13666666666666666.
Too_Activate_neuron_rate in epoch 27: 0.0.
Training epoch 27, avg_loss: tensor([0.5489], device='cuda:0', grad_fn=<DivBackward0>).
100%|██████████| 50/50 [3:27:59<00:00, 249.58s/it]

Dead_neuron_rate in epoch 28: 0.13.
Too_Activate_neuron_rate in epoch 28: 0.0.
Training epoch 28, avg_loss: tensor([0.5489], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 28 is: 0.7604944630440381
Dead_neuron_rate in epoch 29: 0.12.
Too_Activate_neuron_rate in epoch 29: 0.0.
Training epoch 29, avg_loss: tensor([0.5444], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 29 is: 0.798738089106361
Dead_neuron_rate in epoch 30: 0.12333333333333334.
Too_Activate_neuron_rate in epoch 30: 0.0.
Training epoch 30, avg_loss: tensor([0.5491], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 30 is: 0.7631985578161216
Dead_neuron_rate in epoch 31: 0.12333333333333334.
Too_Activate_neuron_rate in epoch 31: 0.0.
Training epoch 31, avg_loss: tensor([0.5452], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 31 is: 0.7772340973474118
Dead_neuron_rate in epoch 32: 0.11.
Too_Activate_neuron_rate in epoch 32: 0.0.
Training epoch 32, avg_loss: tensor([0.5444], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 32 is: 0.8040175122328097
Dead_neuron_rate in epoch 33: 0.11666666666666667.
Too_Activate_neuron_rate in epoch 33: 0.0.
Training epoch 33, avg_loss: tensor([0.5444], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 33 is: 0.8032449137265001
Dead_neuron_rate in epoch 34: 0.11333333333333333.
Too_Activate_neuron_rate in epoch 34: 0.0.
Training epoch 34, avg_loss: tensor([0.5453], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 34 is: 0.7830285861447335
Dead_neuron_rate in epoch 35: 0.11.
Too_Activate_neuron_rate in epoch 35: 0.0.
Training epoch 35, avg_loss: tensor([0.5422], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 35 is: 0.7910121040432655
Dead_neuron_rate in epoch 36: 0.11666666666666667.
Too_Activate_neuron_rate in epoch 36: 0.0.
Training epoch 36, avg_loss: tensor([0.5444], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 36 is: 0.8082668040175123
D:\code\SNN\saved_models\model_modesnn-modeconversion-conversion_modetune-model_typetextcnn-dataset_namesst2-conversion_normalize_typemodel_base-label_num2-positive_init_rate0.55-num_steps50-learning_rate0.0001\2023-07-13 12-15-12.log--epoch36.pth
Dead_neuron_rate in epoch 37: 0.11.
Too_Activate_neuron_rate in epoch 37: 0.0.
Training epoch 37, avg_loss: tensor([0.5459], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 37 is: 0.8078805047643575
Dead_neuron_rate in epoch 38: 0.11333333333333333.
Too_Activate_neuron_rate in epoch 38: 0.0.
Training epoch 38, avg_loss: tensor([0.5459], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 38 is: 0.7796806592840587
Dead_neuron_rate in epoch 39: 0.10666666666666667.
Too_Activate_neuron_rate in epoch 39: 0.0.
Training epoch 39, avg_loss: tensor([0.5416], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 39 is: 0.805176409992274
Dead_neuron_rate in epoch 40: 0.10333333333333333.
Too_Activate_neuron_rate in epoch 40: 0.0.
Training epoch 40, avg_loss: tensor([0.5448], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 40 is: 0.8096832346124131
D:\code\SNN\saved_models\model_modesnn-modeconversion-conversion_modetune-model_typetextcnn-dataset_namesst2-conversion_normalize_typemodel_base-label_num2-positive_init_rate0.55-num_steps50-learning_rate0.0001\2023-07-13 12-32-03.log--epoch40.pth
Dead_neuron_rate in epoch 41: 0.09333333333333334.
Too_Activate_neuron_rate in epoch 41: 0.0.
Training epoch 41, avg_loss: tensor([0.5424], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 41 is: 0.7995106876126706
Dead_neuron_rate in epoch 42: 0.09.
Too_Activate_neuron_rate in epoch 42: 0.0.
Training epoch 42, avg_loss: tensor([0.5402], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 42 is: 0.8072366726757662
Dead_neuron_rate in epoch 43: 0.09666666666666666.
Too_Activate_neuron_rate in epoch 43: 0.0.
Training epoch 43, avg_loss: tensor([0.5383], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 43 is: 0.8074942055112027
Dead_neuron_rate in epoch 44: 0.09.
Too_Activate_neuron_rate in epoch 44: 0.0.
Training epoch 44, avg_loss: tensor([0.5393], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 44 is: 0.8074942055112027
Dead_neuron_rate in epoch 45: 0.08333333333333333.
Too_Activate_neuron_rate in epoch 45: 0.0.
Training epoch 45, avg_loss: tensor([0.5374], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 45 is: 0.7249549317537987
Dead_neuron_rate in epoch 46: 0.08666666666666667.
Too_Activate_neuron_rate in epoch 46: 0.0.
Training epoch 46, avg_loss: tensor([0.5392], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 46 is: 0.8002832861189801
Dead_neuron_rate in epoch 47: 0.08333333333333333.
Too_Activate_neuron_rate in epoch 47: 0.0.
Training epoch 47, avg_loss: tensor([0.5377], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 47 is: 0.8028586144733454
Dead_neuron_rate in epoch 48: 0.08666666666666667.
Too_Activate_neuron_rate in epoch 48: 0.0.
Training epoch 48, avg_loss: tensor([0.5361], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 48 is: 0.8007983517898533
Dead_neuron_rate in epoch 49: 0.08333333333333333.
Too_Activate_neuron_rate in epoch 49: 0.0.
Training epoch 49, avg_loss: tensor([0.5375], device='cuda:0', grad_fn=<DivBackward0>).
Test acc in epoch 49 is: 0.8078805047643575
Mean Dead_neuron_rate: 0.1266
Mean Too_Activate_neuron_rate: 0.0
Best Test Acc: 0.8096832346124131

进程已结束,退出代码0

作者的结果如下,比作者的低一点

image-20230713162351591

总结

历时20多天,终于把这个论文复现出来了。

再次感谢作者,提供了数据集!!!