今天跑一個tensorflow代碼,由於最後結果需要導出爲json的文件,所以採用了json.dumps直接寫文件,但是一直報錯:
Traceback (most recent call last):
File "predict_test.py", line 62, in <module>
json.dump(submit, fw)
File "/home/tensorflow/.pyenv/versions/3.5.3/lib/python3.5/json/__init__.py", line 178, in dump
for chunk in iterable:
File "/home/tensorflow/.pyenv/versions/3.5.3/lib/python3.5/json/encoder.py", line 427, in _iterencode
yield from _iterencode_list(o, _current_indent_level)
File "/home/tensorflow/.pyenv/versions/3.5.3/lib/python3.5/json/encoder.py", line 324, in _iterencode_list
yield from chunks
File "/home/tensorflow/.pyenv/versions/3.5.3/lib/python3.5/json/encoder.py", line 403, in _iterencode_dict
yield from chunks
File "/home/tensorflow/.pyenv/versions/3.5.3/lib/python3.5/json/encoder.py", line 324, in _iterencode_list
yield from chunks
File "/home/tensorflow/.pyenv/versions/3.5.3/lib/python3.5/json/encoder.py", line 436, in _iterencode
o = _default(o)
File "/home/tensorflow/.pyenv/versions/3.5.3/lib/python3.5/json/encoder.py", line 179, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: 26 is not JSON serializable
矇蔽了很久,怎麼26這個數字不可以serializable??
定位到報錯代碼位置,報錯代碼如下:
top_indices = []
submit = []
for i in range(n):
diction = {}
diction["label_id"] = list(preds[i].argsort()[-3:][::-1])
diction["image_id"] = id_list[i]
submit.append(diction)
with open('submit.plk','w') as fw:
json.dump(submit, fw)
好像沒有什麼問題呀~??
做了個小測試:
In [2]: a = submit[1]
In [3]: a
Out[3]:
{'image_id': 'c532ed79f6c54fb3cf8c45004656e385079a5284.jpg',
'label_id': [25, 13, 15]}
In [4]: b = {'image_id': 'c532ed79f6c54fb3cf8c45004656e385079a5284.jpg',
...: 'label_id': [25, 13, 15]}
In [5]: json.dumps(b)
Out[5]: '{"image_id": "c532ed79f6c54fb3cf8c45004656e385079a5284.jpg", "label_id": [25, 13, 15]}'
In [6]: a == b
Out[6]: True
In [7]: json.dumps(a)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-9-373a2a7edfd2> in <module>()
...
TypeError: 25 is not JSON serializable
明明a 的值 和b 相等,爲什麼b就可以json.dumps,而 a json.dumps報錯,懵逼一會,想想要不查看下25這個對象,原來對於a來說 25 是一個<type 'numpy.int64'>!!!
被狠狠地坑了半個小時~~由於平時做數據處理大家會經常用到numpy的array,所以大家也要注意,雖然都是整形,但numpy.int64和python的整數是不一樣的,解決方案,可以用astype('in32t')或者直接用python的int()方法。