我尝试在代码. keras.io/building-powerful-image-classification-models-using-very-little-data.html"rel =" noreferrer> keras博客文章.
I tried running the code in a keras blog post.
该代码将写入.npy文件,如下所示:
The code writes to a .npy file as follows:
bottleneck_features_train = model.predict_generator(generator, nb_train_samples // batch_size) np.save(open('bottleneck_features_train.npy', 'w'),bottleneck_features_train)然后从该文件读取:
def train_top_model(): train_data = np.load(open('bottleneck_features_train.npy'))现在我收到一条错误消息:
Now I get an error saying:
Found 2000 images belonging to 2 classes. Traceback (most recent call last): File "kerasbottleneck.py", line 103, in <module> save_bottlebeck_features() File "kerasbottleneck.py", line 69, in save_bottlebeck_features np.save(open('bottleneck_features_train.npy', 'w'),bottleneck_features_train) File "/opt/anaconda3/lib/python3.6/site-packages/numpy/lib/npyio.py", line 511, in save pickle_kwargs=pickle_kwargs) File "/opt/anaconda3/lib/python3.6/site-packages/numpy/lib/format.py", line 565, in write_array version) File "/opt/anaconda3/lib/python3.6/site-packages/numpy/lib/format.py", line 335, in _write_array_header fp.write(header_prefix) TypeError: write() argument must be str, not bytes此后,我尝试将文件模式从"w"更改为"wb".导致在读取文件时出错:
After this, I tried changing the file mode from 'w' to 'wb'. This resulted in an error while reading the file:
Found 2000 images belonging to 2 classes. Found 800 images belonging to 2 classes. Traceback (most recent call last): File "kerasbottleneck.py", line 104, in <module> train_top_model() File "kerasbottleneck.py", line 82, in train_top_model train_data = np.load(open('bottleneck_features_train.npy')) File "/opt/anaconda3/lib/python3.6/site-packages/numpy/lib/npyio.py", line 404, in load magic = fid.read(N) File "/opt/anaconda3/lib/python3.6/codecs.py", line 321, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 0: invalid start byte如何解决此错误?
推荐答案博客文章中的代码针对Python 2,在Python 2中,使用字节串对文件进行读写.在Python 3中,您需要以二进制模式打开文件,以进行写入,然后再次读取:
The code in the blog post is aimed at Python 2, where writing to and reading from a file works with bytestrings. In Python 3, you need to open the file in binary mode, both for writing and then reading again:
np.save( open('bottleneck_features_train.npy', 'wb'), bottleneck_features_train)阅读时:
train_data = np.load(open('bottleneck_features_train.npy', 'rb'))请注意那里的模式参数中的b字符.
Note the b character in the mode arguments there.
我将使用该文件作为上下文管理器,以确保将其完全关闭:
I'd use the file as a context manager to ensure it is cleanly closed:
with open('bottleneck_features_train.npy', 'wb') as features_train_file np.save(features_train_file, bottleneck_features_train)和
with open('bottleneck_features_train.npy', 'wb') as features_train_file: train_data = np.load(features_train_file)无论如何,博客文章中的代码应同时使用这两项更改,因为在Python 2中,模式下没有b标志的文本文件具有特定于平台的换行符约定,并且Windows中,流中的某些字符将具有特定的含义(包括使文件显示得比出现EOF特征时实际显示的要短).使用二进制数据可能是一个真正的问题.
The code in the blog post should use both of these changes anyway, because in Python 2, without the b flag in the mode text files have platform-specific newline conventions translated, and on Windows certain characters in the stream will have specific meaning (including causing the file to appear shorter than it really is if a EOF characte appears). With binary data that could be a real problem.
更多推荐
TypeError:保存.npy文件时,write()参数必须为str,而不是字节
发布评论