ボンジニアの備忘録

凡人エンジニア、通称ボンジニアによる備忘録です。勉強した内容を書いていきます。ジャンル問わずです!間違っていたら指摘をお願いします!

便利だと思ったPythonのコード ※随時更新

内容

色々なPythonの本を読んで、感心した書き方をつらつらと書いていきます。必ずしもPython特有とは限りません。(というか他の言語はそんなに詳しくない)

数字の計算について

整数(切り捨て)

/が2つで整数(切り捨て)になる

>>> 9//5
>>> 1

文字列の操作について

文字列を末尾から表示する

>>> text='abcdefghijklmnopqrstuvwxyz'
>>> text[::-1]
>>> 'zyxwvutsrqponmlkjihgfedcba'

先頭の文字だけを大文字にする

>>> text = 'i am yujikawa'
>>> text.capitalize()
>>> 'I am yujikawa'

タイトル風に文字列を表現する

>>> text.title()
>>> 'I Am Yujikawa'

変数の入れ方について

リストの欲しいところとそうでないところに分ける

>>> data = ['I','am','yujikawa','!']
>>> a, *b = data
>>> a
'I'
>>> b
['am', 'yujikawa', '!']

>>> *a, b = data
>>> a
['I', 'am', 'yujikawa']
>>> b
'!'

>>> a,*b,c = data
>>> a
'I'
>>> b
['am', 'yujikawa']
>>> c
'!'

ifを使って変数に入れる場合、1行でかく方法

>>> x = 1
>>> y = 2 if x==1 else 3
>>> y
2
>>> x = 2
>>> y = 2 if x==1 else 3
>>> y
3

条件式について

変数が一つの場合の条件式の特殊な書き方

>>> x = 1
>>> 0 < x < 2
True

辞書(dict型)について

キーはイミュータブルのためタプルが使える

>>> gps = {(123,444,666): 'yujikawa house'}
>>> gps
{(123, 444, 666): 'yujikawa house'}

反復処理について

zipを使った反復処理(サイズが小さい方に合わせる)

>>> list1 = ['a','b','c']
>>> list2 = ['c','d']
>>> for x, y in zip(list1, list2):
...     print(x,y)
... 
a c
b d

zip_longest(itertools)を使った反復処理(サイズが大きい方に合わせる)

>>> from itertools import zip_longest
>>> for x,y in zip_longest(list1,list2):
...     print(x,y)
... 
a c
b d
c None

collentionsライブラリーについて

Counter()を使ってリストの要素数を数える

Counter同士であればdictの足し算や引き算ができます。

>>> from collections import Counter
>>> list1 = ['a','b','b','c']
>>> list1_counter = Counter(list1)
>>> list1_counter
Counter({'b': 2, 'a': 1, 'c': 1})

>>> list2 = ['a','c','c','c']
>>> list2_counter = Counter(list2)
>>> list2_counter
Counter({'c': 3, 'a': 1})
>>> list1_counter + list2_counter
Counter({'c': 4, 'a': 2, 'b': 2})

プログラマのための数学勉強会@福岡 #6で登壇しました!

プログラマのための数学勉強会@福岡 について

こちらは@tkengoさんが主催で行われている数学の勉強会です。
数学に興味がある方々が続々と参加する面白いイベントです。今回@tkengoさんにお誘いいただき登壇することになりました。数学勉強会には初登壇でしたので、緊張しました(*´Д`*)

maths4pg-fuk.connpass.com

自分の発表内容

僕の発表というと最適化数学の線形計画問題についてお話させていただきました。
発表スライドは下記になります。

speakerdeck.com


今回数学勉強会では、今流行りの機械学習に関わるような部分の発表があったりして、機械学習熱はまだまだありそうでした。
そんな流行りに流行っている機械学習なんですが、数学がすごくわかりやすく載っている本が発売されました。



実はこの本、この数学勉強会主催の@tkengoさんが書かれた本なのです!(わー:歓声)

内容というと、2人のキャラクターが対話形式で進めていく形で、先生と生徒のやりとりのような感じで話が続いていきます。
僕も色々と機械学習関連の本を読んできましたが、この本は一番最初に出会いたかった本でした。というのも、数式とそれを理解するためのイメージがとても分かりやすく、入門書としてまた機械学習の数学部分の復習としてベストな本だと思います。
2人のキャラクターのやりとりもユーモアがあり、どんどん読み進められます。

本の対象者としては(個人的な意見です)・・・

  • 機械学習を知らないけどビジネスでやるぞとか言ってる経営者層(切実)

@tkengoさん素敵な本の出版ありがとうございます!そしておめでとうございます!

Windowsでのdocker-composeのエラー対策メモ

エラー内容

$ docker-compose up

ERROR: for web  Cannot create container for service web: Invalid bind mount spec "C:\\Users\\user\\work\\docker\\django\\web:/usr/src/app:rw": Invalid volume specification: 'C:\Users\user\work\docker\django\web:/usr/src/app:rw'
[31mERROR[0m: Encountered errors while bringing up the project.

どうやらフォルダパスがwindows依存でおかしい模様。

解決策

COMPOSE_CONVERT_WINDOWS_PATHS=1

を使えばいいらしい。環境変数として読み込んでも良いというところもあったんですが、以下のようにコマンド時に書くのもあり。

$ COMPOSE_CONVERT_WINDOWS_PATHS=1 docker-compose up

OK!

機械学習のためのnvidia-dockerを使ったGPU環境構築

環境

Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-72-generic x86_64)
NVIDIA Corporation GM204GL [Tesla M60] (rev a1)

nvidia driverのインストール

下記から必要なインストーラをインストールする。
https://developer.nvidia.com/cuda-downloads
f:id:yujikawa11:20170409080005p:plain

$ wget https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda-repo-ubuntu-deb
$ sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb
$ sudo apt-get update
$ sudo apt-get -y install cuda
$ sudo shutdown -r now

Dockerのインストール

必要な依存パッケージをインストールする。

$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

APT の認証鍵をインストールする。

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Docker エンジンをインストールするための公式リポジトリを登録する。

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

リポジトリの内容を更新する。

$ sudo apt-get update

Docker エンジン (Community Edition) をインストールする。

$ sudo apt-get -y install docker-ce

動作確認

$ sudo docker version
Client:
Version:      17.03.1-ce
API version:  1.27
Go version:   go1.7.5
Git commit:   c6d412e
Built:        Mon Mar 27 17:14:09 2017
OS/Arch:      linux/amd64

Server:
Version:      17.03.1-ce
API version:  1.27 (minimum version 1.12)
Go version:   go1.7.5
Git commit:   c6d412e
Built:        Mon Mar 27 17:14:09 2017
OS/Arch:      linux/amd64
Experimental: false

dockerを一般ユーザでも使用する設定

dockerグループを作成(dockerを入れたらたぶん自動でできてる)

$ sudo groupadd docker

dockerグループに所属させたいユーザを指定(例:hogehoge)

$ sudo usermod -g docker hogehoge

dockerの再起動

$ sudo /bin/systemctl restart docker.service

再起動ができたら一旦ログアウトしないと反映されない(一度接続しなおす必要あり)

nvidia-dockerを導入する

任意の作業フォルダに移動して作業を行う。

wget https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb

取得したファイルをインストールする。

$ sudo dpkg -i nvidia-docker_1.0.1-1_amd64.deb

サービスの起動確認

$ systemctl list-units --type=service | grep -i nvidia-docker
nvidia-docker.service                                 loaded active running NVIDIA Docker plugin

動作確認

$ docker pull nvidia/cuda:8.0-cudnn5-runtime
$ nvidia-docker run --rm nvidia/cuda nvidia-smi

Sat Apr  8 22:59:24 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.51                 Driver Version: 375.51                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla M60           Off  | 8BEA:00:00.0     Off |                  Off |
| N/A   27C    P8    14W / 150W |      0MiB /  8123MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

GPUの情報が表示されたらOK!

Dockerで動かす。

Dockerfileを作成する。

例えば下記のようなDockerfileを作成します。

FROM nvidia/cuda:8.0-cudnn5-runtime

LABEL maintainer "hogehoge@exmaple.com"

RUN apt-get update
RUN apt-get -y install python3-pip curl vim less
RUN pip3 install keras tensorflow-gpu sklearn chainer pillow h5py

Dockerfileからbuildを行う。

$ docker build -t nvidia_gpu .
  • vオプションでホスト側とコンテナ側の共有フォルダを設定します。この場合は~/hogehoge/sampleにしています。
$ nvidia-docker run --rm -i -v ~/hogehoge/sample:/share:rw -t nvidia_gpu /bin/bash

コマンド実行後コンテナの中に入るので、/shareフォルダに移動すると~/hogehoge/sampleの中にあるプログラムたちがいます。
あとはプログラムを実行するだけです。

$ python3 sample.py

顔認識付き受付アプリを作りました

何か作りたい!
何か作りたい!

そう思って、Pythonを使って顔認識付きの受付アプリをつくりました。

仕組みとしては、Kivyを使ってデスクトップアプリを作成し、OpenCVを使って顔認識を行い、画像と文章をslackに送信するという単純なものです。


f:id:yujikawa11:20170408203936p:plain

呼び鈴がボタンとなって、クリックすると下記のようにslackで画像付きで送信する感じです。

f:id:yujikawa11:20170408204045p:plain


会社の玄関にでも勝手に置こうかなぁ・・・w

Githubにソースおいています。好きに使ってください!

github.com

機械学習勉強会に参加しました!

こんにちは!

今回Oisixさんの機械学習勉強に登壇者の一人として参加しました。

oi-study.connpass.com


その時に使ったスライドを公開しておきます。

大したことはしてないですw

Kerasを使った画像分類というのが主な内容です。

色々あって突然参加することになったので、何をしようか色々考えた末、Oisixさんといえば新鮮な野菜→野菜の分類という安易な発想により葉物野菜の分類を始めました。
実際には1日ぐらいで実装や学習を行い、Fine-tuningを試したりもしたんですが、なぜかFine-tuningではうまくいかず(実装ミス?)、発表に間に合いませんでした。

東京でのLTも初めてで、さすが東京。人が集まりますね。福岡でイベントを行ってもなかなか集まらないですもんね。
勉強会も豊富なので、非常にうらやましいです。勉強会を福岡で増やすには自分から動くしかなさそうです。

なので今年もちょこちょこ勉強会できたらいいなぁ。(Pythonのコミュニティを作りたい・・)


発表スライド置いておきます↓

Kerasで画像分類を試してみる

実験内容

今回は下記のワンちゃんの画像を使ってImageNetの学習済みモデルで実験をしてみたいと思います。コード量は少なく、簡単にできるのでみなさん色々遊んでみてください!
f:id:yujikawa11:20170109152856j:plain:w200

Kerasをインストール

$ pip install keras

プログラム実装

from keras.applications.vgg16 import VGG16, preprocess_input, decode_predictions
from keras.preprocessing import image
import numpy as np
import sys

"""
ImageNetで学習済みのVGG16モデルを使って入力画像を予測
"""
# モデルの読み込み
model = VGG16(weights='imagenet')
# 入力画像のロード
filename = "./dog.jpg"
img = image.load_img(filename, target_size=(224, 224))
# 入力画像の行列化
x = image.img_to_array(img)
# 4次元テンソル
x = np.expand_dims(x, axis=0)
# 予測
preds = model.predict(preprocess_input(x))
results = decode_predictions(preds, top=5)[0]
# 結果出力
for result in results:
    print(result)

出力結果

('n02110806', 'basenji', 0.25577912)
('n02113023', 'Pembroke', 0.087493889)
('n02115641', 'dingo', 0.077256948)
('n02085620', 'Chihuahua', 0.062823117)
('n02113186', 'Cardigan', 0.0560412)

一番似ているのはバセンジー?
f:id:yujikawa11:20170109153218j:plain

写真の状態でだいぶ変わりますが、他の画像とかで遊んでみたらほとんど正解していましたよー!面白いですね。

このような画像分類を学ぶ際に参考にしたら良い本はこちらの本です。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

ゼロから作るDeep Learning [ 斎藤 康毅 ]
価格:3672円(税込、送料無料) (2017/1/9時点)