TensorFlowのインストールから簡単な計算までやってみる。

先日書店にて入門書向けの深層学習の導入本を購入したので
TensorFlowの導入メモを残してみる。

深層学習とはなにか

今更このような事を説明するのは無粋だと思う。
何しろこの手の情報はネットや書籍がごまんと転がっているからだ。
それでも私のアウトプットとして役だって貰うため説明させていただく。

深層学習 ディープラーニングについて

深層学習とは、多層構造のニューラルネットワークを用いた機械学習のことである。
今でこそ人気の分野であると世間に知れ渡っているが、その火付け役となったのは
2012年に開催された画像認識コンテストだと言われている。
この大会は大規模な画像認識・分析をソフトウェアで行わせる。
具体的にはImageNetで公開されている飛行機やピアノなどの
様々なものが写っている写真データを学習させ、
写真に何が写っているか認識させ、その精度を競うものだ。
そして、この年にカナダ・トロント大学チームが深層学習を利用して
2位のチームを大きく引き離して優勝したのだ。

深層学習の特徴(手法)について

深層学習の手法は、それ以外のものを比べて大きく異なる点がる。
それは特徴量の抽出だ。
従来の手法だと人間が特徴量を指定する必要があったが、
深層学習では学習データから気概が自動的に特徴量を抽出する。

TensorFlowについて

TensorFlowはGoogleオープンソースで公開している機械学習ライブライアである。
深層学習を始め、いろいろな機械学習に利用できる。
機械学習ではこのライブライの人気がとても高いので資料も充実している。
機械学習の導入としては打って付けだろう。

TensorFlowのインストールを行う

ここまで話が長くなったが早速TensorFlowをインストールしていく。
ちなみにTensorFlowはWindowsにはインストールが出来ない。
もしWindowsでTensorFlowを利用したいのであればDockerやWMware上で
Linuxを動かし、そこにインストールする事をオススメする。

今回はmacを使ってインストールを行う。
その前にPyenvを使ってAnacondaをインストールしておく。

$ pyenv install anaconda3-4.1.1
$ pyenv global anaconda3-4.1.1
$ pyenv rehash

ここからTensorFlowのインスール

$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.10.0-py3-none-any.whl
$ pip install --upgrade $TF_BINARY_URL

それでは無事にTensorFlowがインストール出来たか確認してみよう。
以下のように「hello」が表示されていれば問題ない。

$ python
>>> import tensorflow as tf
>>> sess=tf.Session()
>>> hello=tf.constant("hello")
>>> sess.run(hello)
b'hello'
>>> 

TensorFlowで簡単な計算をさせてみる

とりあえずサンプルコードを実行してみる。
うまく動作すれば「6234」と値が返ってくるはずだ。

$ cat calc1.py 
# Tensorflowを取り込む
import tensorflow as tf

# 変数a,bに数字を代入
a = tf.constant(1234)
b = tf.constant(5000)

# 計算式を定義
add_op = a + b

# セッションを開始
sess = tf.Session()
res = sess.run(add_op) # 式を評価
print(res)

実行結果

$ python calc1.py 
6234

Tornadoを使ってHTMLページを表示させる

前回の記事の続きでTornadoを使ってHTMLページを表示させたいと思います。
ただ今回は前回と違って、ヒアドキュメントを使ったHTMLの表示ではなく
TornadoからHTMLファイルを呼び出す事で表示させます。

Tornadoファイルの用意

それでは前回記事で使ったTornadoファイルのヒアドキュメント部分を
削除したものを用意します。
このプログラムは実行するとブラウザに”hello world”の文字列を返えします。

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello,world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

HTMLファイルの用意

HTMLファイルはネットで適当に転がっているサンプルを使用します。

<!DOCTYPE html>
 <html>
   <head>
   </head>
    <body>
     <p>hello,world</p>
    </body>
 </html>

Tornadoのstaticpathを使って静的ファイル(HTMLファイル)を指定する

参考URL:https://sites.google.com/site/tornadowebja/documentation/overview
上記URLを参考にしてTornadoファイルを変更していきます。
まず、def make_app():を下記コードのように変更します。

def make_app():
    settings = {
    "static_path": os.path.join(os.path.dirname(__file__), "static"),
}
    return tornado.web.Application([
    (r"/", MainHandler),
], **settings)

これでstaticpathの設定は完了です。

次にlocalhost:8888にアクセスした際にHTMLファイルを見に行く設定を行います。
MainHandler内を下記コードのように変更します。

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("static/E4.html")

これでTornadoファイルを保存して実行してみます。
問題なければ正常にHTMLファイルが表示されます。

Python3でfizz buzz問題やってみた

fizz buzz問題は私が本格的にPythonの勉強をし始めた頃に
一番最初に取り組んだ課題です。
なので今回は備忘録ではなく、ただの日記です。(笑)

Python3でfizz buzz問題をやってみる!

プログラミングの勉強をしていてよく耳にする「FizzBuzz問題」ってのをやってみました。
ここで一言、勘違いしてもらっては困りますので言っておきますが、
FizzBuzz」とは元は長距離ドライブ中や飲み会の時に行われる言葉遊びなのです。
その遊びをプログラムの問題としたのが「FizzBuzz問題」と言うわけですね。

そもそもFizzBuzzって??

wikiによると下記のような遊びのようです。
プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。
次のプレイヤーは直前のプレイヤーの次の数字を発言していく。
ただし、3で割り切れる場合は「Fizz」(Bizz Buzzの場合は「Bizz」)、
5で割り切れる場合は「Buzz」、両者で割り切れる場合
(すなわち15で割り切れる場合)は
Fizz Buzz」(Bizz Buzzの場合は「Bizz Buzz」)を
数の代わりに発言しなければならない。
発言を間違えた者や、ためらった者は脱落となる。

実際にFizzBuzz問題に挑戦!!

先ほどご紹介した通り、3で割り切れる場合は「Fizz」、
5で割り切れる場合は「Buzz」、両者で割り切れる場合(すなわち15で割り切れる場合)は
Fizz Buzz」と表示されるようにプログラムを組めばいいわけです。

1から100までやると表示が長くなるので20までにしておきます。
下記にプログラムコードと実行結果を紹介します。

for i in range(1,21):
    if i % 15 == 0:
        print("fizzbuzz")
    elif i % 3 == 0:
        print("fizz")
    elif i % 5 == 0:
        print("buzz")
    else: 
        print(i)

で下記が出力結果ですね。

1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
16
17
fizz
19
buzz

とまぁこんな感じでしょうか。
もっとスマートにプログラムを書けるよって方は是非ともコメントで
教えて欲しいですね!!

それでは今日はこの辺で!
昨日に引き続きブログ1記事更新完了!!
さて、いつまで続くやら。。

Python3でTornadoを動かしてみる

久しぶりの更新ですね。やっぱり習慣化してないとブログ書くのも大変ですね。。。
なので頑張って習慣化する為、1記事書きます!
内容は今勉強中のTornadoについてです。

Tornadoとは?

そもそもTornadoってなんでしょう?
Webフレームワークの一つですね。公式サイトは以下からどうぞ

http://www.tornadoweb.org/en/stable/#

公式サイトによると、

TornadoはFriendFeedで開発されたPythonのWebフレームワーク(非同期通信ライブラリ)です。
ノンブロッキングネットワークI / Oを使用することで、Tornadoは数万のオープン接続に拡張でき、
ロングポーリング、WebSocket、および各ユーザーへの長時間の接続が必要なその他のアプリケーションに最適です。

とあります。
つまりどゆこと??ってなりますよね。
とりあえず以下の特徴があるんだな程度の認識を持って頂ければよいかと。

FriendFeedが開発(Facebook社)
・Python2系, Python3系, PyPyで動作する
・シンプルだから高速に動作する
・テンプレートエンジンが同梱されている
・シングルプロセス、シングルスレッド

特にパフォーマンスに関しては目を見張るものがあります。
以下にベンチマーク結果を紹介しておきます。
Wiki参照です。
https://ja.wikipedia.org/wiki/Tornado_(Web%E3%82%B5%E3%83%BC%E3%83%90)

f:id:kyamisama:20180910181932p:plain

Tornadoのインストール

以下コマンドでTornadoをインストール

$ pip install tornado

Hello Worldを表示させる

公式サイトにサンプルソースコードが紹介されているのでそのままコピペして動かしてみる。

import tornado.ioloop
import tornado.web
 
	class MainHandler(tornado.web.RequestHandler):
    	def get(self):
        	self.write("Hello, world")
 
	def make_app():
    	return tornado.web.Application([
        	(r"/", MainHandler),
    ])
 
	if __name__ == "__main__":
    	app = make_app()
    	app.listen(8888)
    	tornado.ioloop.IOLoop.current().start()

簡単にコードを簡単に説明する。

class MainHandler(tornado.web.RequestHandler):
    	def get(self):
        	self.write("Hello, world")
    
RequestHandlerクラスのgetメソッドを継承し、HTTPリクエストGETが来た場合
self.writeにより”Hello World”を表示する。
    
def make_app():
    	return tornado.web.Application([
        	(r"/", MainHandler),
    ])

r"/"のrは正規表現を表す。"/"は現在の階層を差す。つまりカレントディレクトリである。
なのでlocalhost/にブラウザからアクセスするとMainHandkerクラスが呼ばれ、アクセスがGETであれば
Hello Worldをブラウザに表示する仕組みだ。

HTMLページをブラウザに表示させる

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('''
	<!DOCTYPE html>
	<html>
	<head>
	</head>
	<body>
	<p><font size="10" color="#00ff00">Test!</font></p>
	</body>
	</html>
''')

class MainHandler2(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, samurai")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
	(r"/test/", MainHandler2),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
tornado.ioloop.IOLoop.current().start()

サンプルコードにヒアドキュメント形式でHTMLをPythonプログラム内に埋め込んでいる。
実行して頂ければ分かると思うが、これでも一応HTNLを表示することは出来る。

おそらくこのような方法でHTMLを表示させたいんじゃないんだ!!って方が多いと思いますので
次回TornadoプログラムからHTMLファイルを呼び出す方法をご紹介したいと思います。

それでは今回ははここまでです。
閲覧しに来てくださった方ありがとうございました。

mac book proにPython3の実行環境を構築する

Pythonの勉強を始めて3ヶ月ちょっと経過したので新しいパソコンを購入しました。

なのでmacでのPython3環境を構築する際のメモ書きを残します。

pyenvのインストール

pyenvとは、簡単に言うとPythonのバージョンを管理することができます。バージョン管理もとても簡単でコマンド一つで3系にも2系にもバージョンを変更することができます。

では早速pyenvをインストールしてみます。

macのターミナルを開きpyenvをクローンします。

$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv

ただしmacXcodeがインストールされていないと下記のような応答が帰る。

xcode-select: note: no developer tools were found at '/Applications/	Xcode.app', requesting install. Choose an option in the dialog to download the command line developer tools.

そしてXcodeインストールポップアップが表示される。

f:id:kyamisama:20180814125744p:plain

特に気にする事もなくインストールを押します。
十数分ほど待つと以下のように完了の画面が出てきます。

f:id:kyamisama:20180814130426p:plain

pyenvにPATHを通す

mac.bash_profileにpyenvのPATHを通します。
その前にmacに.bash_profileが存在するか確認しましょう。
下記コマンドで.bash_profileが表示されれば存在しますが、
表示されなければtouchコマンドで用意しましょう。

$ ls -la|grep "profile"

表示されない場合は下記コマンドで.bash_profileを用意する。

$ cd
$ touch .bash_profile

.bash_profileを用意できたらいよいよPATHを通します。
何も考えず下記コマンドを実行

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

念のため確認。

$ cat ~/.bash_profile 
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

上記のように表示されればOK

pyenvでPython格バージョンをインストールする。

下記コマンドを実行することで任意のバージョンをインストールできる。
※PATHを通した後、一度ターミナルを閉じる必要があります。でないとpyenvコマンドが利用できません。

$ pyenv install 3.4.3
$ pyenv install 2.7.9

インストール後shimをリフレッシュしておく。

$ pyenv rehash

Pythonのバージョンを指定する

pyenvでPythonのバージョンを管理するコマンドは2種類あります。
pyenv global x.x.x もしくは pyenv local x.x.x です。
globalとlocalの違いは、globalだと全体に、localにするとカレントディレクトリのみがバージョンの対象となります。
なのでよくある使い方としては、localでフォルダごとにバージョンを設定します。

$ pyenv global 3.4.3
$ python -V
Python 3.4.3

技術ブログのような何か始めます。

はじめまして皆様kyamisamaです。

 

これから技術関係の備忘録や日常のアレコレをつらつらと書き連ねていこうと思っています。

 

以前にもブログ的なものを書いていましたが、なかなか続けられず止めてしまいました。

まぁ今回は執筆のメインが技術ブログという事なのでやっていけそうな気はしています。

技術の備忘録はプログラム言語からNW、サーバ系です。

特に今年の5月からPythonを勉強し始めましたので、その記事が多いと思います。

 

できる限り頻繁に更新したいと思っていますので、どうぞよろしくです。