我目前正在使用numpy .npz文件修改this gist以保存神经网络的状态。有问题的代码使用变量:
Wxh = np.random.randn(hidden_size, vocab_size) * 0.01 # input to hidden
Whh = np.random.randn(hidden_size, hidden_size) * 0.01 # hidden to hidden
Why = np.random.randn(vocab_size, hidden_size) * 0.01 # hidden to output
bh = np.zeros((hidden_size, 1)) # hidden bias
by = np.zeros((vocab_size, 1)) # output bias
当然,在运行网络时,它们已被更改。现在通过以下方式保存了它们:
memFile = open(memoryFileName, "w")
np.savez(memFile, Wxh, Whh, Why, bh, by)
memFile.close()
我试图通过以下方式测试它们:
loaded = np.load(getfile_local(memoryFileName))
Wxh, Whh, Why, bh, by = 0,0,0,0,0
varList = [Wxh, Whh, Why, bh, by]
for index, name in enumerate(loaded.files):
print loaded[name]
运行此操作会引发以下异常:
Traceback (most recent call last):
File "D:/Python27/projects/poemGen/charRNN/char_rnn.py", line 58, in <module>
testDict.update(loaded)
File "D:\Python27\lib\site-packages\numpy\lib\npyio.py", line 224, in __getitem__
pickle_kwargs=self.pickle_kwargs)
File "D:\Python27\lib\site-packages\numpy\lib\format.py", line 664, in read_array
data = _read_bytes(fp, read_size, "array data")
File "D:\Python27\lib\site-packages\numpy\lib\format.py", line 803, in _read_bytes
r = fp.read(size - len(data))
File "D:\Python27\lib\zipfile.py", line 632, in read
data = self.read1(n - len(buf))
File "D:\Python27\lib\zipfile.py", line 672, in read1
self._update_crc(data, eof=(self._compress_left==0))
File "D:\Python27\lib\zipfile.py", line 647, in _update_crc
raise BadZipfile("Bad CRC-32 for file %r" % self.name)
zipfile.BadZipfile: Bad CRC-32 for file 'arr_1.npy'
据我了解,似乎这是numpy或zipfile中的一个问题,但我很高兴听到这是我的错误。^^
答案 0 :(得分:0)
通过这样做:
memFile = open(memoryFileName, "w")
您正在将文本模式句柄传递给写入二进制数据的方法。由于Python 2不关心二进制文件或文本,并且您正在运行Windows,因此写操作会“破坏”文件:
当遇到换行符(ASCII:10)时,文本模式会自动添加回车符(ASCII:13),从而更改文件的二进制内容。使用正确的加载方法时,文件以二进制模式打开,回车符更改校验和。
在类似unix的系统上,问题不会出现,因为文本等于二进制(没有在行后完成行尾转换)
修正:
memFile = open(memoryFileName, "wb")
请注意,python 3在文本和文本之间有所不同。二进制流可以更容易地检测到问题。