2017-06-13 334 views
1

我目前正在修改this要點以使用numpy .npz文件保存神經網絡的狀態。有問題的代碼使用變量:Python numpy在嘗試讀取未壓縮的npz文件時引發BadZipfile錯誤

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() 

我試圖測試通過打開他們:

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' 

據我瞭解,它:

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] 
運行此提出以下異常

似乎這是numpy或zipfile中的問題,但我很樂意聽到這是我的錯誤。^^

+0

你爲什麼不給'savez'文件名?爲什麼先打開它? – hpaulj

回答

0

通過這樣做:

memFile = open(memoryFileName, "w") 

你傳遞一個文本模式的句柄寫入二進制數據的方法。由於Python 2不關心二進制或文本,而且您正在運行Windows,所以寫入操作「損壞」文件:

當遇到換行符(ASCII:10)時,文本模式會自動預先設置回車(ASCII:13),從而改變文件的二進制內容。當您使用適當的加載方法時,文件以二進制模式打開,並且回車符改變校驗和。

在類Unix系統上不會出現問題,因爲文本等於二進制的(結束行沒有轉換在後臺進行)

修復:

memFile = open(memoryFileName, "wb") 

注意,蟒蛇3對文本&二進制流進行區分並且可以更容易地檢測到問題。

+0

非常感謝!這有幫助。現在我要回去產生更多的錯誤。 –

+0

@TheLie如果它適合你,然後考慮接受答案 –

相關問題