0.背景
2018年,Aidan N. Gomez往ICLR会议投稿Unsupervised cipher cracking using discrete GANs论文,此论文主要介绍了利用GAN破译移位密码和维吉尼亚密码,将GAN应用于离散数据。虽然移位密码和维吉尼亚密码属于古典密码,已属于能够被破译的密码,但是此篇是首次将密码分析和GAN联系起来。
本文主要讨论复现代码过程中遇到的问题。
原论文链接:《UNSUPERVISED CIPHER CRACKING USING DISCRETE GANS》
论文代码链接:GitHub - for-ai/CipherGAN: TensorFlow implementation of CipherGAN
环境:tensorflow 1.15.2(CPU版)
(但是其实源代码要求是GPU版本)
1. 复现过程中遇到的问题
我在调试代码过程中,遇到了接连两个Windows fatal exception: access violation的错误,被困了好久,在这里记录一下解决办法,希望能帮助到一些人。o(* ̄▽ ̄*)ブ
1.1 Windows fatal exception: access violation之 _preread_check
在train.py执行过程中,输入以下示例命令:
python -m CipherGAN-master.train --output_dir=runs\vig345 --test_name="vigenere345-brown200-eval*" --train_name="vigenere345-brown-train*" --hparam_sets=vigenere_brown_vocab_200
报错如下:
Windows fatal exception: access violation
File "E:\envi\anaconda3\envs\tf\lib\site-packages\tensorflow_core\python\lib\io\file_io.py", line 84 in _preread_check
详细信息如下所示:
Windows fatal exception: access violation
Current thread 0x00002cb8 (most recent call first):
File "E:\envi\anaconda3\envs\tf\lib\site-packages\tensorflow_core\python\lib\io\file_io.py", line 84 in _preread_check
File "E:\envi\anaconda3\envs\tf\lib\site-packages\tensorflow_core\python\lib\io\file_io.py", line 178 in readline
File "E:\envi\anaconda3\envs\tf\lib\site-packages\tensorflow_core\python\lib\io\file_io.py", line 214 in next
File "E:\envi\anaconda3\envs\tf\lib\site-packages\tensorflow_core\python\lib\io\file_io.py", line 220 in __next__
File "C:\Users\admin\Downloads\CipherGAN-master\CipherGAN-master\train_utils\vocab_utils.py", line 15 in read_vocab
File "C:\Users\admin\Downloads\CipherGAN-master\CipherGAN-master\train.py", line 47 in _run_locally
File "C:\Users\admin\Downloads\CipherGAN-master\CipherGAN-master\train.py", line 85 in main
File "E:\envi\anaconda3\envs\tf\lib\site-packages\tensorflow_core\python\lib\io\file_io.py", line 178 in readline
File "E:\envi\anaconda3\envs\tf\lib\site-packages\tensorflow_core\python\lib\io\file_io.py", line 214 in next
File "E:\envi\anaconda3\envs\tf\lib\site-packages\tensorflow_core\python\lib\io\file_io.py", line 220 in __next__
File "C:\Users\admin\Downloads\CipherGAN-master\CipherGAN-master\train_utils\vocab_utils.py", line 15 in read_vocab
File "C:\Users\admin\Downloads\CipherGAN-master\CipherGAN-master\train.py", line 47 in _run_locally
File "C:\Users\admin\Downloads\CipherGAN-master\CipherGAN-master\train.py", line 85 in main
File "E:\envi\anaconda3\envs\tf\lib\site-packages\absl\app.py", line 254 in _run_main
File "E:\envi\anaconda3\envs\tf\lib\site-packages\absl\app.py", line 308 in run
File "E:\envi\anaconda3\envs\tf\lib\site-packages\tensorflow_core\python\platform\app.py", line 40 in run
File "C:\Users\admin\Downloads\CipherGAN-master\CipherGAN-master\train.py", line 89 in <module>
File "E:\envi\anaconda3\envs\tf\lib\runpy.py", line 85 in _run_code
File "E:\envi\anaconda3\envs\tf\lib\runpy.py", line 193 in _run_module_as_main
解决:
该问题本质就是 在 read_vocab 函数内部,当尝试读取文件时,发生了错误。进一步调试代码,将语料库的文件路径打印,发现是路径出错。
因此直接将filepath修改为语料库所在的绝对路径
(同时如果还报错就将读文件的gfile.FastGFile方式修改为open)
但是!!又报错权限不够:“PermissionError: [Errno 13] Permission denied:”
PermissionError: [Errno 13] Permission denied:
'C:\\Users\\admin\\Downloads\\CipherGAN-master\\CipherGAN-master\\data\\tmp\\data'
这里是因为路径最终只定位到了文件夹,需要把txt文件的完整名称也加上。
最终修改后如下所示:
1.2 Windows fatal exception: access violation 之 get_matching_files_v2
然后又遇到了这个报错,详细信息如下:
Windows fatal exception: access violation
Current thread 0x00002e58 (most recent call first):
File "E:\envi\anaconda3\envs\tf\lib\site-packages\tensorflow_core\python\lib\io\file_io.py", line 384 in get_matching_files_v2
File "E:\envi\anaconda3\envs\tf\lib\site-packages\tensorflow_core\python\lib\io\file_io.py", line 363 in get_matching_files
File "E:\mxz\CipherGAN-master\CipherGAN-master\data\cipher_reader.py", line 26 in _input_fn
File "E:\envi\anaconda3\envs\tf\lib\site-packages\tensorflow_core\contrib\learn\python\learn\estimators\estimator.py", line 1038 in _train_model
File "E:\envi\anaconda3\envs\tf\lib\site-packages\tensorflow_core\contrib\learn\python\learn\estimators\estimator.py", line 524 in fit
File "E:\envi\anaconda3\envs\tf\lib\site-packages\tensorflow_core\python\util\deprecation.py", line 507 in new_func
File "E:\envi\anaconda3\envs\tf\lib\site-packages\tensorflow_core\contrib\learn\python\learn\experiment.py", line 886 in _call_train
File "E:\envi\anaconda3\envs\tf\lib\site-packages\tensorflow_core\contrib\learn\python\learn\experiment.py", line 389 in train
File "E:\envi\anaconda3\envs\tf\lib\site-packages\tensorflow_core\contrib\learn\python\learn\experiment.py", line 672 in train_and_evaluate
File "E:\mxz\CipherGAN-master\CipherGAN-master\train.py", line 84 in _run_locally
File "E:\mxz\CipherGAN-master\CipherGAN-master\train.py", line 88 in main
File "E:\envi\anaconda3\envs\tf\lib\site-packages\absl\app.py", line 254 in _run_main
File "E:\envi\anaconda3\envs\tf\lib\site-packages\absl\app.py", line 308 in run
File "E:\envi\anaconda3\envs\tf\lib\site-packages\tensorflow_core\python\platform\app.py", line 40 in run
File "E:\mxz\CipherGAN-master\CipherGAN-master\train.py", line 92 in <module>
File "E:\envi\anaconda3\envs\tf\lib\runpy.py", line 85 in _run_code
File "E:\envi\anaconda3\envs\tf\lib\runpy.py", line 193 in _run_module_as_main
解决:
首先将flag的默认参数中dir的’/’改为’\\’
然后将代码中的训练集和测试集的路径打印出来,如下图所示
发现文件层次出现错误(就是按照当前的路径找不到)
所以直接将生成的数据集tmp\data整体移到项目路径下(省事儿)
1.3 AttributeError: 'HParams' object has no attribute 'sample_length'
详细报错信息如下:即在 HParams 对象中找不到名为 'sample_length' 的属性。
File "C:\Users\admin\Downloads\CipherGAN-master\CipherGAN-master\data\cipher_reader.py", line 63, in _input_fn
X = tf.pad(X, [[0, 0], [0, params.sample_length - tf.shape(X)[1]]])
AttributeError: 'HParams' object has no attribute 'sample_length'
解决:
首先打印超参数如下,发现确实没有sample_length
属性╮(╯▽╰)╭
然后去看代码,发现应该是因为采用了default的超参数集合,所以导致了没有设置sample_length
而我们需要使用的超参数合集应该是如下所示的:
根据超参数的设置,我们在输入的命令中加入超参数集的选定 ,即:
--hparam_sets=vigenere_brown_vocab_200
最终得到的完整输入命令如下所示:
python -m CipherGAN-master.train --output_dir=runs\vig345 --test_name="vigenere345-brown200-eval*" --train_name="vigenere345-brown-train*" --hparam_sets=vigenere_brown_vocab_200 --hparam_sets=vigenere_brown_vocab_200
然后程序终于跑通了,泪目/(ㄒoㄒ)/~~