ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

PythonとKerasによるディープラーニング

PythonとKerasによるディープラーニング

PythonとKerasによるディープラーニングを読みました。Kerasの作者が書いた本だけあって、非常に分かりやすく書かれています。Kerasの楽できる関数群をフルに使って、短い記述で定番のニューラルネットワークを動かすことができます。単にニューラルネットワークの説明だけでなく、データの内容を確認したり、学習結果をグラフにプロットしたり、もう半歩先まではコード付きで解説があります。

本のレベルとしては、最初の一歩の次に進める本です。CNNを使った識別や、LSTMを使った未来予測など、やりたいことがはっきりしているのであれば、ショートカットとしてとても役に立ちます。Pythonこれからという人には、ちょっと厳しいと思います。

この本を読んで手を動かしていけば、例えばニューラルネットワークがどこを見て猫と判断しているのかをわかりやすくするヒートマップも、Kerasを使って簡単にできるようになります。

f:id:natsutan:20190105225346j:plain
heatmap

こんな感じですね。識別の部分も含めて、これくらいのコードで実装できます。

model = VGG16(weights='imagenet')

preds = model.predict(x)
print('Predicted:', decode_predictions(preds, top=3))

last_conv_layer = model.get_layer('block5_conv3')
cat_output = model.output[:,386]
grads = K.gradients(cat_output, last_conv_layer.output)[0]

pooled_grads = K.mean(grads, axis=(0,1,2))
grads = K.function([model.input], [pooled_grads, last_conv_layer.output[0]])

iterate = K.function([model.input], [pooled_grads, last_conv_layer.output[0]])

pooled_grads_value, conv_layer_value = iterate([x])

for i in range(512):
    conv_layer_value[:, :, 1] *= pooled_grads_value[i]

heatmap = np.mean(conv_layer_value, axis=-1)
heetmap = np.maximum(heatmap, 0)
heatmap /= np.max(heatmap)

一方、Kerasの弱点として、型から外れると使いにくいというのもあり、ちょっと難しいことをするとこの一冊だけではきついです。

ちょうど昨年末にQiitaに闇のkerasに対する防衛術という記事が上がってました。Kerasが想定していることと違う事をしようとすると、まだまだ情報が足りなかったり、見つけた情報も更新が速すぎて古かったりします。何か新しいことをするというレベルではなく、まず手持ちのデータで識別から始めたいという人におすすめします。

TensorFlowのAPI Level

TensorFlowが良くわからないので勉強しています。 Hands-On Convolutional Neural Networks with TensorFlow を読んでいたら、TensorFlow API levelsというセクションで、High-Level TensorFlow API、Mid-level TensorFlow API, Low-Level TensorFlow APIという表現が出てきました。気になったので、公式ドキュメントを調べてみました。

TensorFlow GuideにAPIの説明がありました。

High Level APIs

これは明確に記載があります。

  • Keras
  • Eager Execution
  • Importting Data
  • Estimators

の4系統です。

Low Level APIs

TensorFlowで使う VariableとかSessionとかがこの辺ですね。

それ以外

High-Level API以外は全部Low-Level APIかとも思ったのですが、TensorBoardはどちらでもなさそうです。また、Mid Level APIは、この本の作者の用語っぽいですね。あと、tf.contribなんかもどちらでもないです。

2018年の思い出

2018年を振り返ってみた。

Coursera

有名どころのCourseraのマシンラーニングコースを終えた。 https://www.coursera.org/learn/machine-learning

人生を少し変えたコースです。このコースの知識でなんとかデータサイエンティストとしての一歩を踏み出しました。今年の方向性も左右しそうです。Deep Learningのオンラインコースは他にもいっぱいありますが、機械学習全般という観点からはこれが最初の一歩として一番良いと自信も持って言えます。

他にもいろんなコースを受けて、それぞれとても勉強になりました。Coursera一本という訳にはいかないですが、本を読みつつがっつり勉強したいときはCourseraでコースを探すという習慣はついたかなと思います。勉強する時間が欲しい。

プリキュア

改めてプリキュアが好きだなと認識した一年でした。特に元気のプリキュア キュアエールには毎週元気をもらってました。 映画も最高でした。初代の二人も良いですね。そろそろHUGっとプリキュアも終わりなのですでにさみしくなってます。プリキュアをゆっくり見る時間が欲しい。ハピネスチャージと魔法つかいプリキュアを最初から全部見たい。

読書

老眼が入ってきて読書量は激減しました。その中からいくつか面白かった本を紹介

君と時計と嘘の塔シリーズ

一年振り返って面白かった本を強いて一冊上げるとすると君と時計と嘘の塔シリーズです。 https://www.amazon.co.jp/dp/B017XHTJTK/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1 謎解き物なのでストーリーなどの解説は無し。ネタバレ無しでどうぞ。

ソード・ワールド2.5ショートストーリーズ 呪いと祝福の大地

https://www.amazon.co.jp/dp/B07JGR1HBZ/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1 この本も良かったです。ソードワールド2.5の新しい世界観を説明するような短編集です。読んでいると冒険したくなってきました。

ラブクラフトの「宇宙からの色」

https://www.amazon.co.jp/dp/4488523048 学生の頃読んだときは具体的な怪物とか出てこなかったり、秘境に行くわけでもなく、正直面白く無かった。今読むと、めちゃ怖くて面白かったです。結婚して子供が大きくなって、「日常」というものが大事に感じているからだと思う。

ゲームブック

ゲームブックを大量に集め始めたが、これまたやる時間がない。出張先に持って行ってやりたい。

2019年にむけて

やりたいことはいっぱいあるので、今年も楽しい一年になりそうです。 皆さんよろしくお願いします。

GCPでTPUを動かしたメモ

GCPでTPU動いたのでメモ

準備

ここ読みながらTPUを起動する。ctpu upの前に、ブラウザのコンソールからSTARTさせないと動かなかった。(TPUにチェックを入れて緑色になっただけだと動いていなかった。)

https://cloud.google.com/tpu/docs/quickstart?hl=ja

途中でshellが変わって補完が効かなくなったのがつらい。まだよくわからない仕組みで動いている。

ちなみに、TPU使うだけならGPUインスタンスの契約は不要。GPU無しのVMとTPUだけ契約すればOK。TPUをプリエンプティブにするとそんなにお金はかからない。12月中はそこそこ遊んだけど、まだ10ドルもかかってないです。

ソース

TensorFlowが良くわからないのでKerasで。

import os
import tensorflow as tf
from tensorflow.contrib import tpu
from tensorflow.keras.datasets import mnist
from tensorflow.keras import layers
from tensorflow.keras import models
from tensorflow.keras.utils import to_categorical

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

# (60000, 28, 28)
#print(train_images.shape)

# (10000, 28, 28)
#print(test_images.shape)

network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28*28,)))
network.add(layers.Dense(10, activation='softmax'))

# loss function
# optimizer
# metrics

network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

# normalization
train_images = train_images.reshape((60000, 28*28))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28*28))
test_images = test_images.astype('float32') / 255

# one hot encoding
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

tpu_grpc_url = tf.contrib.cluster_resolver.TPUClusterResolver(tpu=[os.environ['TPU_NAME']])

strategy = tf.contrib.tpu.TPUDistributionStrategy(tpu_grpc_url)

tpu_model = tf.contrib.tpu.keras_to_tpu_model(
    network,
    strategy=strategy
)

tpu_model.fit(train_images, train_labels, epochs=5, batch_size=128)
test_loss, test_acc = tpu_model.evaluate(test_images, test_labels)

tpu.shutdown_system()


# test_acc: , 0.9786
print("test_acc: ,", test_acc)

結果

natsutan0@emiru:~/myproj/keras_book/chap2$ python3 mnist_tpu.py
WARNING:tensorflow:From /home/natsutan0/.local/lib/python3.5/site-packages/tensorflow/python/ops/resource_variable_ops.py:434: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be rem\
oved in a future version.
Instructions for updating:
Colocations handled automatically by placer.
2018-12-25 02:02:07.817964: W tensorflow/core/distributed_runtime/rpc/grpc_session.cc:354] GrpcSession::ListDevices will initialize the session with an empty graph and other defaults because the session has no\
t yet been created.
WARNING:tensorflow:tpu_model (from tensorflow.contrib.tpu.python.tpu.keras_support) is experimental and may change or be removed at any time, and without warning.
2018-12-25 02:02:07.834462: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2500000000 Hz
2018-12-25 02:02:07.834760: I tensorflow/compiler/xla/service/service.cc:150] XLA service 0x55f1d962b4d0 executing computations on platform Host. Devices:
2018-12-25 02:02:07.834798: I tensorflow/compiler/xla/service/service.cc:158]   StreamExecutor device (0): <undefined>, <undefined>
Epoch 1/5
WARNING:tensorflow:From /home/natsutan0/.local/lib/python3.5/site-packages/tensorflow/contrib/tpu/python/tpu/keras_support.py:302: to_float (from tensorflow.python.ops.math_ops) is deprecated and will be remov\
ed in a future version.
Instructions for updating:
Use tf.cast instead.
WARNING:tensorflow:From /home/natsutan0/.local/lib/python3.5/site-packages/tensorflow/python/ops/math_ops.py:3064: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future v\
ersion.
Instructions for updating:
Use tf.cast instead.
WARNING:tensorflow:Cannot update non-variable config: epsilon
60000/60000 [==============================] - 8s 140us/sample - loss: 0.2546 - acc: 0.9275
Epoch 2/5
60000/60000 [==============================] - 4s 69us/sample - loss: 0.1038 - acc: 0.9697
Epoch 3/5
60000/60000 [==============================] - 4s 71us/sample - loss: 0.0680 - acc: 0.9797
Epoch 4/5
60000/60000 [==============================] - 4s 71us/sample - loss: 0.0486 - acc: 0.9853
Epoch 5/5
60000/60000 [==============================] - 4s 71us/sample - loss: 0.0365 - acc: 0.9890
10000/10000 [==============================] - 4s 355us/sample - loss: 0.0795 - acc: 0.9751
test_acc: , 0.9751
natsutan0@emiru:~/myproj/keras_book/chap2$

TPUが起動していない時はTPU無いで~って怒られる。それがでなくなったのでなんか動いてると思う。 さすがにこの規模だとCPUに比べて気持ち速いレベルです。もうちょっと大きなモデルでやってみたい。

rustで細かいプログラムを一つのディレクトリに入れる

なんかタイトル何ってるかわかりにくいです。

rustでプログラムを作るときは、cargo newコマンドを使います。ただ、ちょっとしたプログラムを作る度にcargo newするのも面倒ですよね。ディレクトリもどんどん増えますし。本で勉強していて、練習問題がでてきたとき、問題一つ一つにディレクトリを作るよりは、chapter1みたいな形でまとめたい。

cargo newしたディレクトリで、複数のソースと実行環境をまぜる方法です。

まずは、cargo new します。

cargo new --bin chap1 

簡単に動作確認をします。

cd chap1
cargo run

これでhello worldが表示されます。

次にcargo newで作られたsrcの下にbinディレクトリを作ります。そこに例えばfirst.rsといったソースファイルを書きます。

fn main() {
    println!("Hello, world first!");
}

この状態で、cargo runにオプションを与えると、first.rsをコンパイルして実行します。

cargo run --bin first

こうすると自動で作られたmain.rsではなく、先ほど作ったfirst.rsがコンパイルされ実行されます。

以後、src/binの下にsecond.rs, third.rsを作り、cargo runのオプションでソース名を指定することで狙ったプログラムだけが動きます。

ちょっとしたプログラムを書くときは便利です。

The RISC-V Reader: An Open Architecture Atlas

パターソン先生の動画を見て、これは読まねばならぬと思い読んでみました。

https://www.amazon.com/RISC-V-Reader-Open-Architecture-Atlas/dp/0999249118/

Amazon.co.jpでは取り扱ってないけど、.comでは普通に買えます。不当に高いのをつかまないように。

プロセッサ大反省会の乗りで楽しく読めました。命令セットの説明も結構取ってあります。読むところのボリュームはそれほど多くないです。RISC-Vプログラマでも無い限り、細かい命令セットを覚えてもしょうが無いので、面白いところだけ読めば良いかと。

面白いのは設計上の判断するにあたって、どういう観点で判断したのかが明確になっています。

  • cost
  • simplicity
  • performance
  • isolation of architecture from implrementation
  • room for growth
  • program size
  • case of programming / compiling / linking

こういう話は開発者の中で閉じていて、外部にストレートに出てくることは少ないので勉強になりました。

20年くらいたったら、貴重な資料になりそうです。全てのプロセッサ好きにお勧めです。

GCPでTPUを使えるようにする

GCPでTPUを使いたくて試行錯誤した途中経過です。

コンソールからの登録

GCPコンソールの左上からTPUを登録しようとしても、なかなか上手く行かず挫折。 結局 ip address rangeに何を入れて良いのか分かりませんでした。

ctpuコマンドを使う

ctpuコマンドをCloud shellから使う方法で上手く行きました。最初はctpuコマンドが使えなかったのですが、TPUのチュートリアルをこなしたところ、いつの間にか使えるようになってました。

gcloud config set compute/zone asia-east1-c
gcloud config set compute/region asia-east1

ctpu up -name emiru -preemptible true

ctpuコマンドが使えるようになれば、ゾーンとリージョンを指定してctpu upでTPUノードが登録されました。