Tensorflowを用いた手書き画像認識:MNISTを使ったテストコード(Windows,Anaconda,Python3.5)
記事の依存関係
以下の記事を元に環境などについては辿ってください。
ossyaritoori.hatenablog.com
Windows10でAnacondaに仮想環境を敷いた上で行っています。
Python3.5で行っておりCPUVersionです。
コードはJupyter notebookで記述しております。
MNISTについて
MNISTは0~9の手書き文字画像を7万枚集めたデータセットです。
これは標準のデータライブラリとして公開されているのでこれを用いて文字認識をしたいと思います。
以下公式?の説明の翻訳があります。
TensorFlow : ML 初心者向けの MNIST (コード解説) – TensorFlow
使用した学習モデルについて
いずれはディープラーニングとかに移行したいですが,今回は28×28の画像入力を単純に並列な入力として扱ったロジスティック回帰を行います。
- 入力層 768ノード
- 隠れ層 100ノード
- 出力層 10ノード
としました。
バイアスを加えた線形和に対して,活性化関数としてシグモイド曲線を用いています。
また,最終的なOutputはsoftmax関数で定義するものとします。
誤差関数にはクロスエントロピーを使っています。
一般的な分類問題に用いられる形です。
参考元との差異
上記のスライドの後半のコードを真似ていますが,Verが違うことに依る関数の違い等があります。
- Python2系と3系の違いによるPrint関数の変化。
- Softmax関数のCrossEntropyの記述方法が変わったことの反映
コード
例のごとくGISTで貼っておきます。
行毎にコピペして1つの.pyファイルに置いてもいいですし,
自分のnotebookに貼って試してみるのもいいでしょう。
学習の実行結果
学習に伴い,誤差関数が減少しているのがわかります。
なお,確率的再急降下はランダムなので急に上がったりします。
今回はよくできた方ですね。
WARNING:tensorflow:From <ipython-input-32-fa591c7fbded>:3: initialize_all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02. Instructions for updating: Use `tf.global_variables_initializer` instead. step = 1000, loss=2.13 step = 2000, loss=1.45 step = 3000, loss=0.96 step = 4000, loss=1.22 step = 5000, loss=0.82 step = 6000, loss=0.89 step = 7000, loss=0.80 step = 8000, loss=0.67 step = 9000, loss=0.59 step = 10000, loss=0.38
警告について
なんか警告が出ていますがどうやらinitialize_all_variablesというのは今後使うなということみたいです。
TensorFlowのinitialize_all_variablesがDeprecatedになった件 - Qiita
代わりに以下のglobal~~を使えとのことです。 verが古いtensorflowでは実装されていないらしいので注意!
tf.Session().run(tf.global_variables_initializer())
結果
さて,訓練用データで訓練した結果をTestデータで検証した結果は以下のとおりです。
Accuracy (test data): 0.80% True label: [7 2 1 0 4 1 4 9 5 9 0 6 9 0 1] Est Label: [7 6 1 0 4 1 4 9 9 9 0 6 9 0 1]
やはり実用的にはちょっと低すぎますね。
層の構造を変えたりするとまた変わってきそうです。
Convolutional networkになるとどうなるんでしょうね。
エディタに関すること
jupyter notebook勧められて使いましたが結構良さげですね。
matlabでCtrl+Enterでセッションごとに実行するのとほぼ同じ感覚なので結構はかどります。
でもシャットダウンでCtrl+Cが上手くいかないのは仕様か何か?
関連書籍
TensorFlowで学ぶディープラーニング入門?畳み込みニューラルネットワーク徹底解説
- 作者: 中井悦司
- 出版社/メーカー: マイナビ出版
- 発売日: 2016/09/28
- メディア: Kindle版
- この商品を含むブログを見る
Learning Tensorflow: A Guide to Building Deep Learning Systems
- 作者: Tom Hope,Yehezkel S. Resheff,Itay Lieder
- 出版社/メーカー: Oreilly & Associates Inc
- 発売日: 2017/07/25
- メディア: ペーパーバック
- この商品を含むブログを見る
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (15件) を見る
Anacondaの仮想環境上でのパッケージ確認と追加の方法について
背景
Anacondaで仮想環境を作って満足していたら新しい環境に足りていないPackageがあったので
いろいろと入れる話になったというアレです。
1.仮想環境の立ち上げ
ossyaritoori.hatenablog.com
2.エディタのインストール(どうやらこの過程で結構いろいろはいったらしい。)
ossyaritoori.hatenablog.com
仮想環境にPackageを入れる。
2,の記事で合ったように外から
conda installを行うことでも入れることは可能みたいですが,以下のブログを参考にした手法でやってみます。
Anacondaの使い方 その2 (環境構築コマンド&ライブラリインストール) - Python (Windows) 備忘録
入っているPackageの確認
まずは使う仮想環境へactivateで入ってください。
その後,以下のコマンドを行うことで現在の環境を確認することが出来ます。
pip freeze
どうでしょう?僕の環境ではmatplotlibがありませんでした。
入っているPackageの確認2
失礼,anacondaを使っている場合は
conda list
を実行した方が良さそうですね。
特定のパッケージ(matplotlib)を入れる
anaconda search -t conda matplotlib
と入力すると候補がた~くさん出てきます。
そのうち下段の方にこんなのが出てきますね。
このうち,win-64ってあるのが64bit版に対応するパッケージです。
この名前,今回は「ukoete/matplotlib」をよく覚えて置きましょう。
次にこれを用いて以下を実行します。
anaconda show ukoethe/matplotlib
すると,最後の方に
「To install this package with conda run:
conda install --channel https://conda.anaconda.org/ukoethe matplotlib」
と出ます。
なるほど。
最後にこのURLを用いてinstallとすることで完了です。
conda install --channel https://conda.anaconda.org/ukoethe matplotlib
最終的にnumpyとかも一緒に入れてくれました。
少し手間がめんどくさそうですが,
OS環境に対応したモジュールを入れられるので環境依存に謎エラーに苦しめられないための布石ってことですね。
手間を省くための手間を惜しまない精神,大事です。
疑問
結果をconda listで見た所,numpyが被ってるんですけどこれって大丈夫なのかな?
numpy 1.12.1 py35_0 numpy 1.12.1 <pip>
Python Anacondaの仮想環境上での開発環境
前の記事で仮想環境を立てましたが,エディタをデスクトップから起動するとメインの環境で立ち上がるという問題があります。
Spyderを仮想環境上で呼ぶ。
Matlabコンソールぽくてとりあえず気に入ったspyderについて。
仮想環境から呼び出し
activate tf35
とした後に
spyder
と打つだけでした。楽ちんですね。
Jupyterの場合
正直はじめてまともに起動します。
起動
activate後に
jupyter notebook
とうって起動。
使い方はまた後ほど。
Windows上でTensorflow/Opencvの環境構築(Anaconda使用)
むかぁしTensorflowをUbuntuに入れてたことが合ったのですが引っ越しの際に全て消し飛ばしてしまったのでしばらく放置していました。
気がついたらWindowsでもTensorflowを出来るということなのでやってみました。
Anaconda で Python環境構築
これは既にやっているものとします。
ossyaritoori.hatenablog.com
そういやTwitterでJupyterを使おうと言われたので使用感を試しているところです。
Anaconda でTensorflowの環境構築(CPU版)
Anacondaって使う環境を分けることが出来るんですね。
上手く言えないけど開発毎にパッケージ群を分離して選択できるというかなんというか。
環境の構築
んで,今回は「tf35」と名前をつけた環境を作ります。
以下のように打ってください。
conda create -n tf35 python=3.5
これでtf35という名前の独立した環境が立ち上がります。
Anacondaを介してインストールする際の罠として「TensorflowはPython3.5しかサポートしていない」というのがあります。
Anacondaで最新版をインストールすると3.6系になるので私はこれでハマりました。
「No matching distribution found for tensorflow」ってエラーを見かけたらこれかもって思ってください。
したがって,後ろについている「python=3.5」とすることによってこの環境は3.5系を基準に動かすことが出来るようにセットアップされます。
Tensorflowのダウンロード
以下の公式?の通りにコマンドを打って最新版を手に入れてください(2017/5/25現在)
Installing TensorFlow on Windows | TensorFlow
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.1.0-cp35-cp35m-win_amd64.whl
アクティベーション結果のチェック
正直変なエラー出たら全部消してやり直すかStackflowみてください。
import tensorflow as tf hello = tf.constant('Hello, TensorFlow!') sess = tf.Session() print(sess.run(hello))
これで何もエラーが出なかったらOKです。
もう一度付けるときはくれぐれもactivateを忘れずに。
そういやTensorflowの英語版の教科書もあったんですね。
誰か勝手送ってくれ~(お金ない)
Learning Tensorflow: A Guide to Building Deep Learning Systems
- 作者: Tom Hope,Yehezkel S. Resheff,Itay Lieder
- 出版社/メーカー: Oreilly & Associates Inc
- 発売日: 2017/08/27
- メディア: ペーパーバック
- この商品を含むブログを見る
次は仮想環境上でのエディタ環境について。
2017年9月追記:anaconda 標準環境のセットアップ
どうも新しい環境(condaprompt)で試した所、いろいろとパッケージが入っていない現象にぶち当たりました。
以下のコマンドでPython3.5のanaconda標準環境をダウンロードできます。
conda install anaconda python=3.5
なお、いくつかのパッケージはダウングレードされるようなのですがまぁ問題なさそうではあります。
おまけ
折角tensorflowを入れるのでOpencvもついでに入れようと思います。
先程作ったtf35の環境上で
anaconda search -t conda opencv
ver228/opencv というところが3.2のwindows64bit版対応を公開しているようなので
anaconda show ver228/opencv3
として出てきたURLからダウンロードします。
conda install --channel https://conda.anaconda.org/ver228 opencv3
はい。pythonを起動して以下のように確認できたらOKです。(>>>はコマンドではない)
>>> import cv2 >>> cv2.__version__ '3.2.0-dev'
Python Figureの管理と動画作成についてメモ
Python覚えてたてマンなのでFigureの管理について。
使用するのはMatplotlibです。
使うパッケージ
matplotlibを主につかっていきます。
import matplotlib.pyplot as plt # for plotting data import matplotlib.animation as animation # for animation data
関数の定義と引数の返し方について
Pythonではdefのところで引数について書かないっぽいです。
代わりに一番下にreturnを書くことで引数を返せます。
1.plot関数からハンドルを出力させるようにする。
前の記事では以下のようなplot関数を書いていましたが,こいつが使いづらかった原因は出力を指定していなかったからですね。
plt.figureで出力した図のハンドルをreturnするようにするのが実用的でしょう。
def draw(i,observations): fig = plt.figure(i,figsize=(8, 8)) sp = fig.add_subplot(111, aspect='equal') sp.set_xlim(-1.0,1.0) sp.set_ylim(-0.5,1.5) robot.draw(sp,observations) actual_landmarks.draw() plt.legend() return fig
2.出力されたハンドルを配列で保持
次に,出力されたハンドルを配列へと格納します。
ims=[] みたいな感じで初期化して,.append()というのを使って要素を追加できます。
従って以下のような流れになります。
ims = [] #初期化 for i in range(0,18): im = draw(i,None) #描画関数 ims.append(im) #格納 robot.move(0.2,math.pi / 180.0 * 20) #ここはまぁ気にするな
3.まとめてplot
imsに配列で全ての図を保存したので,plt.show()に具体的なハンドルを与える事ができます。
まとめてやるなら配列ごと突っ込むのが良いでしょう。
plt.show(ims)
これで随分心が晴れました。
4.動画にする
結論から言うとうまく行っていません。
なんでも保存するのにまた別のパッケージがいるとかなんとか。
以下のような感じで行けるらしいです。
fig = plt.figure()
ani = animation.ArtistAnimation(fig, ims, interval=1000)
plt.show()
モンテカルロ自己位置推定のテストとmatplotlibの覚書
こないだ千葉工大の上田先生の講演を聞いてきました。
そうです。あの「確率ロボティクス」を翻訳した方です。
確率ロボティクス (Mynavi Advanced Library)
- 作者: Sebastian Thrun,Wolfram Burgard,Dieter Fox
- 出版社/メーカー: マイナビ出版
- 発売日: 2015/04/02
- メディア: Kindle版
- この商品を含むブログを見る
はじめてお会いしましたが,講演もフランクで親しみやすそうという印象でした。
Python環境のセットアップ
先日書いた記事はこれに相当します。
ossyaritoori.hatenablog.com
コピペで実行。
確率ロボティクスではロボットが自身の位置に対する信念を「制御」と「観測」の値から推定しながら動くわけですが,
その最たる例が今回のMCL(Monte Carlo Localization)というわけです。
パーティクルフィルタよろしく,確率分布から取った複数のサンプル点でもって自らの信念を表示するわけですね。
matplotlibについて
今回ほぼはじめてPythonでまともなコード走らせるんですが,matplotlibというのも当然はじめてでして…
Referenceは以下になります。
pyplot — Matplotlib 2.0.2 documentation
基本的な流れは以下のような感じ?(pltとしてimportしてます。)
①figureハンドルを作成する。
.figureで以下のように図番号iとfigureサイズを指定してハンドルを作成するのでしょう。
fig = plt.figure(i,figsize=(8, 8))
②その後 figからなんかいろいろする。
普通にplt.~~でlineやcircleなど書けるようですが以下のプログラムではハンドル渡して.quiverなんかで矢印書いていますね
③表示 plt.show()
ここが少し不思議だったんですが一度作ったhandleは外でも生きているらしく,for文を抜けた後にまとめて表示してくれます。
matlabみたいにworkspaceを確認する手法があればわかりやすいのですが…spyderを使おう!(なおfigureハンドルは見えない模様)
コード
ほぼ全て上田先生の所にあったのをコピペしています。
これに適当にmcl1.pyとでも名前をつけて保存した後に実行するのが良いでしょう。
綺麗に書かれているのでこれを参考にしていろいろ書いて見ようかと思います。
#matplotlib inline import numpy as np from copy import copy import math, random import matplotlib.pyplot as plt # for plotting data from matplotlib.patches import Ellipse # for drawing class Gaussian2D: # 共分散行列、中心の座標を属性に持つ def __init__(self,sigma_x = 1.0, sigma_y = 1.0, cov_xy = 0.0,mu_x = 0.0, mu_y = 0.0): self.cov = np.array([[sigma_x**2,cov_xy],[cov_xy,sigma_y**2]]) self.mean = np.array([mu_x,mu_y]).T # ガウス分布の移動 def shift(self,delta,angle): ca = math.cos(angle) sa = math.sin(angle) rot = np.array([[ca,sa],[-sa,ca]]) self.cov = rot.dot(self.cov).dot(rot.T) self.mean = self.mean + delta # 密度の算出 def value(self, pos): delta = pos - self.mean numerator = math.exp(-0.5 * (delta.T).dot(np.linalg.inv(self.cov)).dot(delta)) denominator = 2 * math.pi * math.sqrt(np.linalg.det(self.cov)) return numerator / denominator class Landmarks: def __init__(self,array): self.positions = array def draw(self): xs = [ e[0] for e in self.positions] ys = [ e[1] for e in self.positions] plt.scatter(xs,ys,s=300,marker="*",label="landmarks",color="orange") class Observation: def __init__(self,robot_pos, landmark,lid): # センサの有効範囲の設定 self.sensor_max_range = 1.0 self.sensor_min_range = 0.1 self.sensor_max_angle = math.pi / 2 self.sensor_min_angle = - math.pi /2 # ランドマークのIDを保存しておく属性。ランドマークがセンサの有効範囲にないとNoneのまま self.lid = None # 真の位置の情報をセットする。ロボットの真の姿勢はシミュレーション用でロボットは知らないという前提。 # 真のランドマークの位置は、ロボットは知っているのでこのインスタンスの属性として保存します。 rx,ry,rt = robot_pos self.true_lx,self.true_ly = landmark # ロボットからランドマークまでの距離の真値を算出 distance = math.sqrt((rx-self.true_lx)**2 + (ry-self.true_ly)**2) if distance > self.sensor_max_range or distance < self.sensor_min_range: return # ロボットからランドマークがどの方向に見えるか真値を算出 direction = math.atan2(self.true_ly-ry, self.true_lx-rx) - rt if direction > math.pi: direction -= 2*math.pi if direction < -math.pi: direction += 2*math.pi if direction > self.sensor_max_angle or direction < self.sensor_min_angle: return # 真値に混入する雑音の大きさ(標準偏差)を設定 sigma_distance = distance * 0.1 # 距離に対して10%の標準偏差 sigma_direction = math.pi * 3 / 180 # ランドマークの方向に対して3degの標準偏差 # 雑音を混ぜてセンサの値とする self.distance = random.gauss(distance, sigma_distance) self.direction = random.gauss(direction, sigma_direction) # ロボット座標系での共分散行列を作っておく。あとで尤度を計算するときに使用 # x方向が奥行きで、sigma_distanceを標準偏差に設定。y方向がロボットから見て横方向の誤差で、距離*sin(3[deg])となる。 self.error_ellipse = Gaussian2D(sigma_x = sigma_distance, sigma_y = self.distance * math.sin(sigma_direction) , cov_xy = 0.0) self.lid = lid # 尤度の計算(遅い実装です。) # パーティクルの姿勢とランドマークの計測値からランドマークの位置を推定し、その位置に誤差楕円を置き、 # ランドマークの真の位置が誤差楕円からどれだけ外れているかを確率密度関数の密度として返します。 # この計算はもっと簡略化できますが、描画の関係でこういう手順を踏んでいます。 # 簡略な方法: パーティクルの姿勢とランドマークの真の位置から、想定されるランドマークの距離・方向を算出し、 # 実際の距離・方向とそれぞれ比較する方法。距離の誤差の傾向、方向の誤差の傾向をそれぞれ1次元のガウス分布で表現し、 # それぞれを独立して計算して尤度を算出し、掛け算する。 def likelihood(self,particle_pos): # パーティクルの姿勢と、このインスタンスに保存されているセンサの値から、ランドマークの位置を求める rx, ry, rt = particle_pos proposed_lx = rx + self.distance * math.cos(rt + self.direction) proposed_ly = ry + self.distance * math.sin(rt + self.direction) # このインスタンスに保存されている共分散行列を、計算されたランドマークの位置に移し、パーティクルの向きに合わせて共分散行列を回転 e = copy(self.error_ellipse) e.shift(np.array([proposed_lx, proposed_ly]).T, rt + self.direction) # そのままガウス分布の計算式から密度(尤度)を返します。 return e.value(np.array([self.true_lx,self.true_ly]).T) # 描画用 def ellipse(self,robot_pos): rx, ry, rt = robot_pos[0], robot_pos[1], robot_pos[2] proposed_lx = rx + self.distance * math.cos(rt + self.direction) proposed_ly = ry + self.distance * math.sin(rt + self.direction) e = copy(self.error_ellipse) e.shift(np.array([proposed_lx, proposed_ly]).T, rt + self.direction) # 固有ベクトルを二つ求めて、それぞれの大きさを求めて楕円を作り、幅を計算した方の固有ベクトルの向きに楕円を回転すると誤差楕円になります。 eigen = np.linalg.eig(e.cov) v1 = eigen[0][0] * eigen[1][0] v2 = eigen[0][1] * eigen[1][1] v1_direction = math.atan2(v1[1],v1[0]) elli = Ellipse([proposed_lx, proposed_ly],width=math.sqrt(np.linalg.norm(v1)),height=math.sqrt(np.linalg.norm(v2)),angle=v1_direction/3.14*180) elli.set_alpha(0.2) return elli # 描画用 def draw(self,sp,robot_pos): sp.add_artist(self.ellipse(robot_pos)) actual_landmarks = Landmarks(np.array([[-0.5,0.0],[0.5,0.0],[0.0,0.5]])) actual_landmarks.draw() # パーティクルのクラス。単なる構造体 class Particle: def __init__(self,x,y,t,w): self.pos = np.array([x,y,t]) self.w = w # パーティクルフィルタのクラス class ParticleFilter: # この実装ではコンストラクタはパーティクルの個数だけを引数にとる def __init__(self,num): # 空のパーティクルのリストを作って一つずつ追加していく(実装がベタ) self.particles = [] for i in range(num): self.particles.append(Particle(0.0,0.0,0.0,1.0/num)) # パーティクルは重みを持つ。全パーティクルの重みの合計は1。1つのパーティクルの重みは1/個数 # ロボットが動いたときにパーティクルを動かすためのメソッド # 引数の「motion」はメソッドで、ロボットの移動を再現するためのもの。 # ロボットは自身がどのように動作するとどう姿勢が変化するかを知っており、このメソッドがその知識となる。 def moveParticles(self,fw,rot,motion): self.resampling() # このメソッドについては後述 # パーティクルごとに移動した後の姿勢を計算し、姿勢を更新する。 for p in self.particles: after = motion(p.pos,fw,rot) p.pos = after # リサンプリングのためのメソッド。 # リサンプリングは、重みがごく少数のパーティクルに偏ることを防ぐための措置で、近似していない理論上の数式では出現しない。 def resampling(self): num = len(self.particles) # numはパーティクルの個数 ws = [e.w for e in self.particles] # 重みのリストを作る print(sum(ws)) if sum(ws) < 1e-100: #重みの和がゼロに丸め込まれるとサンプリングできなくなるので小さな数を足しておく ws = [e + 1e-100 for e in ws] ps = random.choices(self.particles, weights=ws, k=num) # パーティクルのリストから、weightsのリストの重みに比例した確率で、num個選ぶ self.particles = [Particle(*e.pos,1.0/num) for e in ps] # 選んだリストからパーティクルを取り出し、パーティクルの姿勢から重み1/numの新しいパーティクルを作成 # 描画用 def draw(self,c="blue",lbl="particles"): xs = [p.pos[0] for p in self.particles] ys = [p.pos[1] for p in self.particles] vxs = [math.cos(p.pos[2]) for p in self.particles] vys = [math.sin(p.pos[2]) for p in self.particles] plt.quiver(xs,ys,vxs,vys,color=c,label=lbl,alpha=0.7) class Robot: def __init__(self,x,y,rad): random.seed() # actual_poses: ロボットの姿勢の真値を1ステップごとに記録したもの # (ロボットのクラス内にいるけどロボットはこの情報を使えない) self.actual_poses = [np.array([x,y,rad])] # パーティクルフィルタの準備(パーティクル数30個) self.pf = ParticleFilter(30) # ロボットの動作をシミュレートするメソッド。シミュレーションだけでなく、ロボットがパーティクルを移動するときにも用いる。 # つまり実機に実装する場合もこのメソッドが必要となる。雑音の度合いは事前に計測するか、 # ざっくり決めてフィルタのロバスト性に頼る。 def motion(self, pos, fw, rot): # fwだけ前進してその後rotだけ回転。雑音を混入させる actual_fw = random.gauss(fw,fw/10) #進む距離に対して標準偏差10%の雑音を混入 dir_error = random.gauss(0.0, math.pi / 180.0 * 3.0) # 前進方向がヨレる雑音を標準偏差3[deg]で混入 px, py, pt = pos # 移動後の位置を算出 x = px + actual_fw * math.cos(pt + dir_error) y = py + actual_fw * math.sin(pt + dir_error) # 雑音込みの回転各を算出。rotに対して標準偏差10%の雑音を混ぜる actual_rot = random.gauss(rot,rot/10) t = pt + dir_error + actual_rot # さらにヨレの分の角度を足す return np.array([x,y,t]) # ロボットが動くときに呼び出すメソッド。ロボットの位置の更新とパーティクルの位置の更新 def move(self,fw,rot): self.actual_poses.append(self.motion(self.actual_poses[-1],fw,rot)) self.pf.moveParticles(fw,rot,self.motion) # ロボットがランドマーク観測するときに呼び出すメソッド def observation(self,landmarks): obss = [] for i,landmark in enumerate(landmarks.positions): # 3つあるランドマークを1つずつ観測 obss.append(Observation(self.actual_poses[-1],landmark,i)) obss = list(filter(lambda e : e.lid != None, obss)) # 観測データのないものを除去 # 重みに尤度をかける for obs in obss: for p in self.pf.particles: p.w *= obs.likelihood(p.pos) # 描画用に観測のリストを返す return obss # 描画用 def draw(self,sp,observations): for obs in observations: for p in self.pf.particles: obs.draw(sp,p.pos) self.pf.draw() xs = [e[0] for e in self.actual_poses] ys = [e[1] for e in self.actual_poses] vxs = [math.cos(e[2]) for e in self.actual_poses] vys = [math.sin(e[2]) for e in self.actual_poses] plt.quiver(xs,ys,vxs,vys,color="red",label="actual robot motion") def draw(i,observations): fig = plt.figure(i,figsize=(8, 8)) sp = fig.add_subplot(111, aspect='equal') sp.set_xlim(-1.0,1.0) sp.set_ylim(-0.5,1.5) robot.draw(sp,observations) actual_landmarks.draw() plt.legend() robot = Robot(0,0,0) # ロボットを原点に # 観測、描画、移動の繰り返し for i in range(0,18): obss = robot.observation(actual_landmarks) draw(i,obss) robot.move(0.2,math.pi / 180.0 * 20) plt.show()
お言葉
最後に講演で先生がおっしゃった言葉で,
「便利なツールがあるなら使ってください。勉強以外の目的で自分で組むのはおすすめしません。」
というのが印象に残っています。
殊,Pythonに関しては情報にアクセスさえできればツールは使えますもんね。
情強になりたい…
Anacondaとspyderでwindows上にPython環境構築
Pythonは無料で使える上に有志がたくさんパッケージを作ってくれていて,
非常にPopularな手段になりつつあるのですが,依存関係やパッケージの管理が面倒です。
Anaconda
Anacondaが楽と聞いたので以下を参考にセットアップしました。
http://qiita.com/t2y/items/2a3eb58103e85d8064b6
Anaconda とは
「Anaconda はデータサイエンス向けに一連のパッケージ群を含むディストリビューションですが、一方で Python と conda のみを最小構成でインストールすることもできます。その最小構成のディストリビューションを Miniconda と呼んでいます。」
なるほど~。
インストール
公式サイトからAnacondaの3.x系の64bitインストーラーを入れます。
https://www.continuum.io/downloads
ここからexeをダウンロードして実行すれば完了です。
何やらいろいろ聞かれますが全部デフォルトで行くのが今のところ間違いがないです。
大体10分弱かかるかと思います。
なお、一連のファイルが占拠する容量は大体2G近いのでそこだけ要注意です。
動作確認
適当なところでコマンドプロンプトを起動して,以下のようにAnacondaについて説明が出れば完了です。
試しに"conda"などを打ち込むのが良いでしょう。何か説明が出たら成功です。
その後pythonとかを起動してanacondaに紐付けられているのを確認できたらHappy.
なんか32bitって出てるけどこれはいいのかしら?
追記
いつの間にかWindowsではanacondaのpathを自動で追加しないようになっていました。
したがってコマンドプロンプトではなくAnacondaプロンプトなるものを使う必要がありそうです。要はanacondaのpathが登録されたcmdってことですね。
ちょっと気持ち不便ですがこちらを使っていきましょう。
numpyの確認
試しに
import numpy
numpy.__file__
と実行してみてAnaconda以下のパッケージが参照されていれば完了です。
なんて簡単なんだ。
Matlab ライクなエディタ spyderを導入
Pythonを少し触って困ったのが定義した変数を簡単に確認できないこと。
matlabライクなコンソールを出してくれるspyderというのがあるということで導入しました。
こんな感じ。
おそらくanacondaを使えばデフォルトで入っているはずです。
私は以下のページからダウンロード&解凍をしちゃったんですが無いときはこちらで。
spyder-ide / spyderlib / Downloads — Bitbucket
pipなどでもダウンロード可なようです。
変数として定義したxやnumpyで作ったarray?も見えています。figureハンドルは見えなかったけどね…
発展編
TensorflowやOpencvを使いたい場合は次の記事へとどうぞ
ossyaritoori.hatenablog.com
参考文献
参考にさせていただいたサイトです。
親matlab派に向けたpythonでのデータ解析入門 | Advanced Technology Lab