Python と各種パッケージを利用した AI プログラミングを解説している。
サポートページには、本書のコードが置かれている。
https://github.com/oreilly-japan/artificial-intelligence-with-python-ja/
以下の実験は、Anaconda 環境のもと、base を中心に、いくつかは仮想環境で実施した。
base は以下のとおりである。
Python 3.8.5
numpy 1.19.2
gym 0.18.0
kanren 0.2.3
pyglet 1.5.0
scikit-learn 0.24.1
simpleai 0.8.2
sympy 1.7.1
tensorflow 2.2.0
p.18 で、(conda install ではインストールできず)
「pip install でインストールする必要があるパッケージは次のとおりです。」
とある。
pandas_datareader kanren simpleai deap easyai hmmlearn pystruct neurolab gym
その後、私が試したところでは、少なくとも次のパッケージが conda install でもインストールできる。
(base) $ conda install -c anaconda pandas-datareader (base) $ conda install -c conda-forge deap (base) $ conda install -c conda-forge hmmlearn
2.14 節 サポートベクター回帰を用いた住宅費の推定を行ってみた。有効数字4桁目以降が若干違うが、 同じ値が得られた。
3.3 節までは検証できた。
4.7 節で pandas_datareader パッケージを使うことになっている。
インストールはできて、Quandl の API を取得するところまでいったのだが、結局株価は取得できなかった。
https://scrapbox.io/PythonOsaka/pandas-datareader%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86
に例のある Yahoo Finance からアップル社の株価データのダウンロードは成功したので、
Quandl 社からデータの取得のどこかに問題があったのだろう。なお、上記の解説で、
[Quandl https://www.quandl.com/] 株式、投資信託、ETFの過去のデータを提供しています。 データの品質は必ずしも良いとは言えません。
とあった。
5.1 節の例題は動作した。
6.5 節の例題は動作した。
Base 環境で確認した。 7.5 節の最期、最小不一致のヒューリスティックの解は、
本書では次のようになっているが、:
Minimum conflicts: {'Anna': 1, 'John': 3, 'Patricia': 4, 'Tom': 2}
私が実施した環境ではこうなった:
Minimum conflicts: {'John': 1, 'Anna': 3, 'Tom': 4, 'Patricia': 4}
私が得た結果でも与えられた制約はすべて充足している。これも問題ないと思う。
DEAP という Python パッケージを用いる。pip でインストールするように本書では解説されているが、 私は conda で base 環境に入れることにした。
$ conda install -c conda-forge deap
無事インストールできた。
8.3 節は本書の通り動作した。
9.7 節は easyai パッケージを使う。このパッケージを使ったコイン取りゲームはうまく動いた。 なお、日本では「石取りゲーム」といっていたような気がする。
NLTK というパッケージは pip3 で入れるよう本文にはあるが、 わたしはすでに Anaconda を入れているため、conda でインストールした。
$ conda install -c anaconda nltk
無事に入ったようだ。そこで、NLTK を用いて 10.2 節のテキストデータのトークン化をやってみた。
$ print(sent_tokenize(input_text)) (中略) LookupError: ********************************************************************** Resource punkt not found. Please use the NLTK Downloader to obtain the resource: >>> import nltk >>> nltk.download('punkt') For more information see: https://www.nltk.org/data.html Attempted to load tokenizers/punkt/PY3/english.pickle (後略)
nltk.download('punkt')をせよといっている。こんなこと、やっていなかった、と思って前のページを見てみると、 p.228 に 次の記載があった:
すると、NLTK Downloader が起動します(図10-1)。ダウンロードするデータをここで選べます。 [all] を選んで [Download] ボタンを押してください。完了するまで時間がかかります。
データは ~/ntlk_data ディレクトリに入っていることを確認した。そこで改めて sent_tokenize をやり直すと、 正しく本書 pp.230-231 のとおりトークン分割された。あせってはいけませんね。
pandas, hmmlearn, pystruct, cvxopt のパッケージを pip3 でインストールするように本書では解説されている。
Anaconda の場合は、pandas は最初からインストールされていること、
cvxopt は次の conda コマンドでインストールできることが書かれている。
$ conda install pandas cvxopt
私は Anaconda を使っているので conda で入れることにする。pandas は 1.2.1 が入っているが、
hmmlearn, pystruct, cvxopt は入っていない。まず、cvxopt を入れてみよう。
次のコマンドに pandas が要るとは思えないが、ともかく、書いた通りにしてみる。
(base) $ conda install pandas cvxopt (中略) The environment is inconsistent, please check the package plan carefully The following packages are causing the inconsistency: - defaults/noarch::seaborn==0.11.1=pyhd3eb1b0_0 - defaults/linux-64::_anaconda_depends==2020.07=py38_0 - defaults/linux-64::scikit-image==0.17.2=py38hdf5156a_0 - defaults/linux-64::anaconda-navigator==1.10.0=py38_0 - defaults/noarch::imageio==2.9.0=py_0 - defaults/linux-64::matplotlib-base==3.3.4=py38h62a2d02_0 - defaults/noarch::dask==2021.2.0=pyhd3eb1b0_0 - defaults/linux-64::matplotlib==3.3.4=py38h06a4308_0 - defaults/linux-64::anaconda==custom=py38_1 - defaults/linux-64::bokeh==2.2.3=py38_0 done ## Package Plan ## environment location: /home/username/anaconda3 added / updated specs: - cvxopt - pandas The following packages will be downloaded: package | build ---------------------------|----------------- cvxopt-1.2.0 | py38ha87f1a5_0 483 KB glpk-4.65 | h3ceedfd_2 744 KB gsl-2.4 | h14c3975_4 1.8 MB metis-5.1.0 | hf484d3e_4 3.7 MB pandas-1.2.2 | py38ha9443f7_0 8.8 MB suitesparse-5.2.0 | h9e4a6bb_0 1.3 MB ------------------------------------------------------------ Total: 16.8 MB The following NEW packages will be INSTALLED: cvxopt pkgs/main/linux-64::cvxopt-1.2.0-py38ha87f1a5_0 glpk pkgs/main/linux-64::glpk-4.65-h3ceedfd_2 gsl pkgs/main/linux-64::gsl-2.4-h14c3975_4 metis pkgs/main/linux-64::metis-5.1.0-hf484d3e_4 pillow pkgs/main/linux-64::pillow-8.1.0-py38he98fc37_0 suitesparse pkgs/main/linux-64::suitesparse-5.2.0-h9e4a6bb_0 The following packages will be UPDATED: ca-certificates anaconda::ca-certificates-2020.10.14-0 --> pkgs/main::ca-certificates-2021.1.19-h06a4308_0 certifi anaconda::certifi-2020.6.20-py38_0 --> pkgs/main::certifi-2020.12.5-py38h06a4308_0 pandas 1.2.1-py38ha9443f7_0 --> 1.2.2-py38ha9443f7_0 Proceed ([y]/n)? y (後略)
次に hmmlearn だ。これは https://anaconda.org/omnia/hmmlearn に従い、次のコマンドで導入しようとした。
(base) $ conda install -c omnia hmmlearn (後略)
しかし 10 分以上たっても終わらない。ひょっとして、Python 3.8 だからだろうか。 Python 3.7 ではどうだろうか。
(py37) $ conda install -c omnia hmmlearn
これもうまくいかない。だとすると、Python のバージョンの問題ではなく、 チャネルの問題なのかもしれない。チャネルを変えてみた。
(base) $ conda install -c conda-forge hmmlearn
これはうまくいった。
次は pystruct だ。anaconda には登録されていないようだ。
https://pystruct.github.io/installation.html
に従い、次の手順をとった。 cvxopt は anaconda で既に導入したから、次のコマンドを実行すればいいはずだ。
(base) $ pip install --user --upgrade pystruct Collecting pystruct Downloading pystruct-0.3.2.tar.gz (5.6 MB) |████████████████████████████████| 5.6 MB 4.9 MB/s Collecting ad3 Downloading ad3-2.2.1.tar.gz (812 kB) |████████████████████████████████| 812 kB 8.7 MB/s Requirement already satisfied: numpy in /home/satosi/anaconda3/lib/python3.8/site-packages (from pystruct) (1.19.2) Building wheels for collected packages: pystruct, ad3 Building wheel for pystruct (setup.py) ... error ERROR: Command errored out with exit status 1 (中略) ERROR: Failed building wheel for pystruct Running setup.py clean for pystruct Building wheel for ad3 (setup.py) ... / (後略)
とにかく失敗した。おそらく、
https://github.com/oreilly-japan/artificial-intelligence-with-python-ja
に書いてあることを実行すればインストールできるのだろう。萎えた気持ちを奮い立たせて、
実行した。その結果、pystruct もインストールできた。
では、p.271 以降で説明されている、「11.7 CRF を用いたアルファベット列の識別」はできるのだろうか。 まず、p.272 の最初の5行を Jupyter Notebook に入れたところ、早速次のエラーが出た。
ModuleNotFoundError Traceback (most recent call last) (中略) ~/anaconda3/lib/python3.8/site-packages/pystruct-0.3.2-py3.8-linux-x86_64.egg/pystruct/utils/inference.py in1 import itertools ----> 2 from sklearn.externals.joblib import Parallel, delayed 3 4 import numpy as np 5 ModuleNotFoundError: No module named 'sklearn.externals.joblib'
この sklearn.externals.joblib というのは現在は使われていない。次の通り、 sklearn.externals.joblib を joblib に置き換えればよい。
# from sklearn.externals.joblib import Parallel, delayed # 変更前 from joblib import Parallel, delayed # 変更後
上記の置き換えは、pystruct 配下の下記のファイルに対して行う。
これによって、11.7 節のコードは無事動いた。
p.289 の python_speech_features を、本書のサポートページにあるフォルダをローカルに保存してインポートしようとしたら、 循環参照が起きてインポートに失敗した。
>>> from python_speech_features import mfcc Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/mnt/c/Users/username/python_speech_features/__init__.py", line 1, in <module> from .base import * File "/mnt/c/Users/username/python_speech_features/base.py", line 5, in <module> from python_speech_features import sigproc ImportError: cannot import name 'sigproc' from partially initialized module 'python_speech_features' → (most likely due to a circular import) (/mnt/c/Users/username/python_speech_features/__init__.py) >>>
どうせなら Anaconda でインストールしよう。しかし、
https://anaconda.org/contango/python_speech_features/files
を見ると、Python 3.6 までの対応のようだ。Python3.6 の仮想環境でインストールすることにしよう。
(py36) $ conda install -c contango python_speech_features
無事インストールできた。ではこの環境で Jupyter Notebook を起動してみよう。
(py36) $ jupyter notebook コマンド 'jupyter' が見つかりません。次の方法でインストールできます: sudo apt install jupyter-core
そうか。こちらには Jupyter Notebook がなかったのか。では入れるとするか。 いや、せっかく入れるのならば Jupyter Notebook の後継である JupyterLab がいいのかな。
(py36) $conda install -c conda-forge jupyterlab
成功した。こちらで JupyterLab も動き、12.6 節まで再現できた。12.7 節は hmmlearn が必要だ。
これはインストールに失敗したが、これは conda のチャンネルの問題だったようだ。
py36 の環境で、
(py36) $ conda install -c conda conda-forge hmmlearn
として解決した。
この環境で、12.7 節の内容も再現できた。
13.2 節まで検証した。ただし、カメラからのキャプチャはできなかった。
14.2 では、neurolab というライブラリを用いることになっている。
早速 Anaconda のインストールをもくろんだが、
https://anaconda.org/labfabulous/neurolab/files
を見てみると、名前が osx-64/neurolab-0.2.3-np17py27_0.tar.bz2 とある。
これは、合わないだろう。pip で入れることにする。base 環境に入るだろうか。
(base) $ pip3 install neurolab (中略) Successfully installed neurolab-0.3.5
14.2 節の内容を実施してみて、本書の通り動作することを確認した。
base 環境で実施した。
15.5 節の内容を追試した。p.360 のコード env.close() のあとで、次のような警告が出た。画面は問題なく出ている。 15.6 節以降は追って実施したい。
/home/satosi/anaconda3/lib/python3.8/site-packages/gym/logger.py:30: UserWarning: WARN: → You are calling 'step()' even though this environment has already returned done = True. → You should always call 'reset()' once you receive 'done = True' -- → any further steps are undefined behavior. warnings.warn(colorize('%s: %s'%('WARN', msg % args), 'yellow'))
base 環境で実施した。16.4 節まで実施した。
本文 p.391 のコードは次の通りである:
_, contours, _ = cv2.findContours(gray_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
しかし、このコードを実行すると次のエラーが出る:
ValueError Traceback (most recent call last) <ipython-input-3-4fbf1d056018> in <module> ----> 1 _, contours, _ = cv2.findContours(gray_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 2 3 for i, cnt in enumerate(contours): 4 gray_image = cv2.drawContours(gray_image, [cnt], 0, i+1, cv2.FILLED) 5 ValueError: not enough values to unpack (expected 3, got 2)
本書のサポートページによると、次のコードに直さなければならない。
contours, _ = cv2.findContours(gray_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2:]
他は変更なく、塗分けまで問題なく実施することができた。
https://github.com/oreilly-japan/artificial-intelligence-with-python-ja
にない誤植は下記の通り。
p.285 下から1段め、<generated_audo.wav というファイルが書き出されます。> とあるが、正しくは、<generated_audio.wav というファイルが書き出されます。>である。
書名 | Python による AI プログラミング入門 |
著者 | Prateek Joshi |
発行日 | 2018 年 8 月 8 日(初版第1刷) |
発行所 | オライリー・ジャパン |
発売元 | オーム社 |
定価 | 3400 円 |
サイズ | A5 判 |
ISBN | 978-4-87311-826-0 |
その他 | 越谷市立図書館で借りて読む |
まりんきょ学問所 > コンピュータの部屋 > コンピュータの本 > ニューロコンピューティング・人工知能 > Prateek Joshi:Python による AI プログラミング入門