Colaboratoryを使ってみた

GoogleColaboratoryを使ってみた。

自宅でDeep Learningのお勉強などをしたりしていると、GPU欲しいなと思うことがしばしばある。Colaboratoryなら、あります。GPUどころか、TPUも使えます。

AutoEncoderを書いてみる

以前にQiitaで書いたAutoEncoderを、Colaboratoryの環境上で、kerasの部分をtensorflowkerasに置き換えて書いてみた。

で、この50epochs回すヤツをハードウェアアクセラレーションなし、GPU、TPUで実行してみた。で、autoencoder.fit()の時間を測定してみた。

import time
start_time = time.time()
autoencoder.fit(x_train,
                epochs=epochs,
                batch_size=batch_size,
                validation_data = (x_valid, None))
print('{:.2f}[sec]'.format(time.time()-start_time))

結果は、次のとおり。

時間[sec]
None619.32
GPU81.56
TPU650.02

あれ?TPU遅い?というか、TPUが生きるネットワークになってないってことかな?

今後のAI関連のお勉強は

もう自前で環境を用意する必要はない。みんな、Colaboratoryを使えばイイ。そして、Colaboratoryを使うということは、Tensorflowを使うということで、PyTorchとかChainerとかは今後どうなっちゃうの?って感じでもある。

はてダをインポートした

もともとは、なんか別のサイトの日記サービスを使ってたような気がするので、インポートによる引っ越しは2度目だ。 正直、そうやって引き継いで残しておくべきコンテンツなんて無いんだけれど、なんとなく「消す」という決断ができなくて、そのままインポートして引き継いでいる。

[デルアンバサダー] XPS13が届いた

デル アンバサダープログラムというのがあって、今回11月27日までという期間限定ではあるけれど、XPSという13インチのノートPCを借りられることになった。

XPS13 基本スペック

機種:
DELL XPS 13 9360
CPU:
Intel Core i7-7560U 2.40GHz
モリー:
8.0GB
ストレージ:
SSD 256GB
グラフィックス:
Intel Iris Plus Graphics 640 (8079MB)
解像度: 3200x1800
タッチディスプレイ
ネットワーク
IEEE 802.11ac
Bluetooth 4.1
その他
USB 3.0ポート × 2
SDカードスロット
Thunderboltポート

基本スペック高いです。

XPS13の良いところ

13インチモデルなのに、とにかくコンパクトです。11インチのMacBook Airとほぼ同じサイズ、幅と奥行きが5mmくらいXPS 13の方が大きいけれど、13インチのMacBook Proよりも2cmくらいずつ小さい。
それなのに、3200x1800という解像度です。100%表示すると、老眼の始まった46歳の目にはちょっとキツいくらいすごい解像度。その気になると、画面をめちゃくちゃ広く使えます。

次に、コンパクトなACアダプターも良いと思います。

会社にDELLの古いInspironがあったんですけれど、ACアダプターが巨大で絶対に持ち歩きたくない代物だったのですが、こんなにコンパクトになりました。地味にコストがかかる部分だと思いますが、妥協されていない感があります。

とにかく、コンパクトで高性能です。早速、Virtualboxをインストールして、その上でUbuntu 17を動かしたりしていますが、仮想マシンで高負荷がかかる状態になっても、パフォーマンスの低下はほとんどありません。これは、すごくイイ。

XPS13の残念なところ

あんまり、残念に感じているポイントは無いのだけれど、敢えていうなら、まず最初に「画面の開きにくさ」を挙げたい。

写真では分かりづらいんだけれど、ディスプレイを閉じるとパームレスト部分と隙間なくピッタリ閉じてしまうので、指がひっかからなくて、「机等の上においたままディスプレイを開く」のがやりづらい。結局、持ち上げて両手で上と下を持って開くような感じになる。これが、少し残念。

もう一つの残念ポイントがキーボード。

写真で見て分かるとおり、右端のキーが小さくなってて、Enterキーとかちょっと叩きにくい。見た目のバランスも悪い。

ということで、性能的な問題があるわけではないんだけれど、敢えて言うとしたら、という観点で気がついた残念な点。

逆に言うと、このくらいしか、文句ないとも言える。

総じていうと

普段は自宅ではMacしか使ってなくて、会社でもWindows7を使っていることもあって、そもそもWindows10に驚いているというのも事実なんだけれど、ハードウェア的な観点でDELL XPS 13のレビューをすると、今のところ、上記のような印象を持っている。

とりあえず、アンバサダーとして試用させてもらっているという立場は置いておくとしても、Windowsの動作するノートPCが必要な場合、予算等が許せば、これを選んでおけば問題ないかなと思った。

エンジンが吹けなくなってきている

前々回の車検のときに、「高速の合流で加速しなくなったし、登坂中に急に失速することがある」ってハナシをしてたら、「多分、エアマスセンサーの故障だけれど、高い部品だし、街乗りで影響がないようだったら、そのままにしよう」ってことになった。
最近、街乗りにもちょっと影響が出始めた。近いうちに、走れなくなるかもしれない。

今、妻が運転すると「スピードが出ないことに驚いてアクセルをベタ踏みして、ノッキングするばっかりで加速しない」という状態になるので、オレにしか運転できない状態。
クリープでそろそろと前進を始めてから、じわりじわりとペダルをゆっくり踏み込むと、最終的にはちゃんと周囲のクルマの速度と同じくらいのスピードは出せる。高速道路だって走れる。ただ、東名下りだと大井松田から御殿場にかけての上り坂とか、関越下りの高崎を過ぎたあたりとかの上り坂とかは、登坂車線を60km/hくらいで走ることになる。

そろそろ自動車税を払う時期だし、オイル交換も最近サボってるし、フロントガラスは飛び石で傷がついてるし、なんかボロボロなんだけれど、走れないのはやっぱり困るから、直さないとな。

Courseraのmachine-learningの受講を始めてみた

Coursera のMachine Learningを始めてみた。Stanford UniversityのAndrew Ng先生のヤツ。有名なヤツだな。
今日、4週目の課題の提出が終わった。

会社ではすっかりお荷物社員扱いで暇になり帰宅時間が早くなったので、45の手習いというヤツだ。

Courseraの前には、CodeacademyPythonのコースを受講した。最近、Python3を少し独習してたので意外とすんなり終了した。課金して有償コースも受講しようかと考えたけれど、文法など基本をおさえることはできたから、仕事がらみで実践することで、勉強をすすめていければ良いかな、ということで。

次は、Udemyでもと思ったんだけれど、いきなり1800円取られるコースで、途中から受講できなくなってもつまらないし、と思ってるところに、たまたまCourseraのことを知って、機械学習について有名なコースが受講できる、ということで、とりあえずやれるだけやってみようということで始めてみたワケだ。

4週を終えて感じたこと

同じコースを受講した人のblog等でよく「分かりやすい・教えるのが上手い」と書かれているけれど、ソレはその通りかなと思いつつ、実は分かった気分にさせられているだけで、よく理解できていないことがオレの場合に限っては多いと思う。

ビデオの途中に入るQuizとか、コース終了時のQuizとかには苦戦するし、コースの途中で式を使って解説される手法をOctaveのコードにするのは本当に難しい。このペースだと、11週でコース修了できないどころか脱落しそう。

それでも、なんとか頑張っているのは、ネット上でのこのコースの高い評判を受けて「あの分かりやすく素晴らしいコースすら受講できないポンコツ」呼ばわりされたくない一心だ。

5週目以降に向けて

週ごとの課題をこなしつつ、もう少しロジスティック回帰、線形回帰、ニューラルネットに関する日本語で説明した文章を読んで正しく理解できるようにしておかないといけないなと感じている。

正直なところ、続けるモチベーションが意地だけになってる気もする(コース修了したところで、お荷物社員から脱却できる身分になれるワケでなし、って思っちゃう)んだけれど、まあ意地が続く限りは受講を続けようと思っている。

小さな不満

通勤途中に、iPhoneのCourseraアプリでビデオを視聴しているんだけれど、「ビデオ講義の受講修了」のステータスにならない。地味に不便。会社への往路に視聴したビデオが未視聴のステータスのまま変わってないので、帰宅時に続きから視聴再開のつもりでResumeすると、朝の電車の中で視たビデオがまた最初っから再生されたりする。
理解のために復習が必要だってことは分かってるんだけれど、そういう意図じゃなくて、たんなるバグだよね?

それから英語のListeningがほとんどできないので、字幕に頼っているんだけれど、iOSアプリで縦表示した時には、翻訳された字幕が今話しているところを文字に起こしたものが縦スクロールで表示される仕様になっている。これ、今話していることの前後関係を見返しやすいのでとても便利だと思っているんだけれど、しょっちゅうスクロール位置が前後にジャンプしちゃって、現在位置を見失ってしまう。そうなると、スクロール位置が動くのばっかり気になってビデオの画面を全然見られなくなってしまって、何か重要なことを見落としてしまっているのではないか?という気分にすらなる。

どっちも、帰宅後にPCから見直すことで復習にもなるので、そういった意味ではあまり問題にはならないのかもしれないけれど。

PythonでSVMをやってみる

Python機械学習」って、流行語過ぎるので、乗っかる。irisの分類をSVMでやるっていう、Rの例題でよく見るヤツ。

RでSVM

## irisデータの読み込み
data(iris)
## 半分をトレーニングセットにするために、ランダムに選択する
train_ids <- sample(nrow(iris), nrow(iris)*0.5)
## トレーニングセットの作成
iris.train <- iris[train_ids,]
## 残り半分をテストセットに
iris.test  <- iris[-train_ids,]
### SVM実行
library(kernlab)
iris.svm <- ksvm(Species~., data=iris.train)
svm.predict <- predict(iris.svm, iris.test)
### 結果表示
table(svm.predict, iris.test$Species)

ところで、irisのsetosa,versicolor,virginicaって、こんな感じらしい。正直、花の形で区別がつけられる気がしない。っていうか、そもそもirisがアヤメなのかショウブなのかカキツバタなのか、区別がついてない。

PythonSVM

Python SVMとかで検索するとscikit-learnを使えと皆さんおっしゃるので、そうする。scikit-learnにdatasetsとして、irisも含まれているようだ。

from sklearn import svm, datasets
iris = datasets.load_iris()

Rではsample()を使って、トレーニングセットとテストセットを分割したけれど、scikit-learnには、ソレ専用のメソッド(train_test_split)が用意されてた。Rと同じように、トレーニングセットとテストセットを半分ずつで分割するように、test_size=0.5をオプションとして指定する。

from sklearn.cross_validation import train_test_split
iris_data_train, iris_data_test, iris_target_train, iris_target_test = train_test_split(iris.data, iris.target, test_size=0.5)

識別器を作って、トレーニングを実施する。とりあえず、kernelその他オプションは全部デフォルトのお任せ仕様だと、こんな感じ。

iris_predict = svm.SVC().fit(iris_data_train, iris_target_train).predict(iris_data_test)

このiris_predict(推定結果)と、iris_target_test(正解)を比較すればいい。ちょうど、Rでtable(svm.predict, iris.test$Species) のように表示するのは、scikit-learnではconfusion_matrixというメソッドで定義されている。

from sklearn.metrics import confusion_matrix, accuracy_score
cm = confusion_matrix(iris_target_test, iris_predict)

confusion_matrix()は、
sklearn.metrics.confusion_matrix — scikit-learn 0.19.2 documentation
によると、第一引数が真値で、第二引数が識別器による判別値になっているようだ。

というワケで、全体では、こんな感じ。

from sklearn import svm, datasets
from sklearn.cross_validation import train_test_split
from sklearn.metrics import confusion_matrix
import numpy as np

iris = datasets.load_iris()
iris_data_train, iris_data_test, iris_target_train, iris_target_test = \ train_test_split(iris.data, iris.target, test_size=0.5)
iris_predict = svm.SVC().fit(iris_data_train, iris_target_train).predict(iris_data_test)
cm = confusion_matrix(iris_target_test, iris_predict)

print(cm)
confusion_matrixのheatmap表示

Confusion matrix — scikit-learn 0.19.2 documentationによると、heatmap表示もできる。まずheatmapを他のデータと比較可能にするために、confusion_matrixを正規化する。

こんな式は、思いつかない。

cm_normalized = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]

そして、confusion_matrixを表示するための関数を定義する。

def plot_confusion_matrix(cm, title='Confusion matrix', cmap=plt.cm.Blues):
    ''' confusion_matrixをheatmap表示する関数
    Keyword arguments:
        cm -- confusion_matrix
        title -- 図の表題
        cmap -- 使用するカラーマップ
        
    '''
    plt.imshow(cm, interpolation='nearest', cmap=cmap)
    plt.title(title)
    plt.colorbar()
    tick_marks = np.arange(len(iris.target_names))
    plt.xticks(tick_marks, iris.target_names, rotation=45)
    plt.yticks(tick_marks, iris.target_names)
    plt.tight_layout()
    plt.ylabel('True label')
    plt.xlabel('Predicted label')

コレって、iris.target_namesとか埋め込まれているので、要注意だ。他のデータセットだったら、ちゃんとソレっぽく修正しないとダメだ。

というワケで、以下のようにして完成。

from sklearn.cross_validation import train_test_split
from sklearn.metrics import confusion_matrix, accuracy_score
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline

iris = datasets.load_iris()
iris_data_train, iris_data_test, iris_target_train, iris_target_test = train_test_split(iris.data, iris.target, test_size=0.5)

iris_predict = svm.SVC().fit(iris_data_train, iris_target_train).predict(iris_data_test)

def plot_confusion_matrix(cm, title='Confusion matrix', cmap=plt.cm.Blues):
        plt.imshow(cm, interpolation='nearest', cmap=cmap)
        plt.title(title)
        plt.colorbar()
        tick_marks = np.arange(len(iris.target_names))
        plt.xticks(tick_marks, iris.target_names, rotation=45)
        plt.yticks(tick_marks, iris.target_names)
        plt.tight_layout()
        plt.ylabel('True label')
        plt.xlabel('Predicted label')

cm = confusion_matrix(iris_target_test, iris_predict)
cm_normalized = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
print('Normalized confusion matrix')
print(cm_normalized)
plt.figure()
plot_confusion_matrix(cm_normalized, title='Normalized confusion matrix')
plt.show()

さて、irisっていうのは、アヤメなのかショウブなのかカキツバタなのか、その辺は謎のままですね。