+-

我尝试在 keras blog post.中运行 code
代码写入.npy文件,如下所示:
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'))
现在我收到一个错误说:
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”.这导致在读取文件时出错:
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 3中,您需要以二进制模式打开文件,既可以写入,也可以再次读取:
np.save(
open('bottleneck_features_train.npy', 'wb'),
bottleneck_features_train)
阅读时:
train_data = np.load(open('bottleneck_features_train.npy', 'rb'))
注意模式参数中的b字符.
我将该文件用作上下文管理器,以确保它完全关闭:
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特征,导致文件显得比实际更短).二进制数据可能是一个真正的问题.
点击查看更多相关文章
转载注明原文:python – TypeError:write()参数必须是str,而不是保存.npy文件时的字节 - 乐贴网