はじめに
TensorFlowを使用していて、以下のエラーが発生した際の解決ログをまとめました。このエラーはTensorFlowに限らず、他のライブラリでも同様の問題が発生する可能性があるため、記事にまとめました。
AttributeError: module 'numpy' has no attribute 'object'.
`np.object` was a deprecated alias for the builtin `object`. To avoid this error in existing code, use `object` by itself. Doing this will not modify any behavior and is safe.
The aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:
https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
上記のエラーが出た環境
- conda 23.10.0
- tensorflow 2.4.1
- numpy 1.26.0
筆者がこのエラーに遭遇したのは、Anaconda仮想環境でconda install tensorflow-gpu
を使用しTensorFlowをインストールし、Pythonでimport tenosrflow as tf
を実行した時でした。
エラーの原因
このエラーは、エラーメッセージに記載されたnumpy v1.20のリリースノートを確認すると、np.int
が組み込み型int
のエイリアスであり、混乱を招いていたため、そのような書き方が非推奨となったことが原因です。
さらに、numpy v1.24のリリースノートで非推奨期限が切れが公表され、このバージョンを境に徐々に廃止が進み、エラーが発生するようになりました。
解決策
基本的にnp.int
のような書き方をしなければ問題ないです。np.int
の代わりにint
を使うといった具合です。
しかし、実際のケースではライブラリの中で使われていることもあり、なかなかソースコードを直接手で変更することが困難な場合が多いです。
その場合の解決策として3種類の方法を紹介します。
解決策1. numpyをダウングレード
このエラーはnumpyのバージョン1.24で廃止が開始されたため、それ以前のバージョンを利用すれば問題ありません。
例えば、numpyの1.24.0以下で最新のバージョンが1.23.5なので、このバージョンを指定してインストールし直すと良いと思います。
解決策2. numpyの依存関係のあるライブラリをアップグレード
このnumpyの変更を受け、numpyと依存関係にあるライブラリもnp.int
などを使わずに開発されている場合があります。最新のものにアップグレードすることで解決する可能性があります。
解決策3. 組込み型のint
をnp.int
にエイリアスを貼る(非推奨)
こちらは、廃止となったnp.intをエイリアスで復活させる方法ですが、非推奨です。numpy以外のライブラリでエラーが出ている場合は、先にnumpyをインポートしてエイリアスを貼ることで、エラーを回避することはできると思います。
例えば、tensorflow 2.4.1、numpy 1.26.0を使っているとして、この方法を取るには以下のように書きます。
import numpy as np
# 廃止となったエイリアスを書く(この例はtensorflow v2.4.1で使われている最低限の変更。ライブラリに応じて適宜修正が必要。)
np.object = object
np.bool = bool
np.int = int
np.float = float
np.typeDict = {k: v for k, v in np.sctypeDict.items() if isinstance(v, type)}
# その後にインポート
import tensorflow as tf
ただし、この手法は非推奨であり、互換性の問題を引き起こす可能性があるため、慎重に検討すると良いと思います。
まとめ
conda insatll tensorflow-gpu
でこの問題に遭遇し、解決に時間を溶かしていたので、この解決ログが同様の問題に悩む方々の助けになれば幸いです。
参考資料