Going Faraway

渡辺遼遠の雑記帳

映画評:『デトロイト』(キャスリン・ビグロー監督)

普段、私は映画の感想はあまり書かないんだけど、すごく強く印象に残ったので書き残しておきたいと思う。

監督は『ハート・ロッカー』、『ゼロ・ダーク・サーティ』のキャスリン・ビグロー。この映画の舞台は1967年のアメリカ、デトロイトでの暴動事件 (12番街暴動) 。ただし、暴動そのものはメインのテーマではなく、暴動の最中に発生した「アルジェ・モーテル事件」を取り上げたサスペンス映画です。

--

白人優位の社会において黒人が差別的扱いを受けていたデトロイトで、黒人が暴動を起こした最中、とあるモーテルで黒人の青年が玩具のピストル (徒競走のスタートの合図で使うようなやつ) を発射した。単に、白人警官を怖がらせ、抑圧された日頃の鬱憤を晴らすだけの悪ふざけのつもりだった。しかし、白人警官は狙撃を受けたと勘違いし、モーテルへと突入する。逃げようとしたその黒人青年を射殺し、モーテルに残っていた黒人男性6人と白人女性2人に対して、銃と狙撃者の所在について、自白を強要するため暴力的な尋問をエスカレートさせていく…

延々と映画全体の半分くらいの時間続く暴力的な尋問シーンはかなりの恐怖を感じたし、安直で安っぽいヒューマニズムや勧善懲悪めいた物語に持ち込まないドキュメンタリー風の構成も強い臨場感を生んでいます。事件の後日譚として、白人警官の裁判のシーンも描かれますが、裁判過程も判決にも理不尽さを感じました。

万人にお勧めできる映画ではないし、少なくともデートで見るような映画でないことは確かですが、私が最近半年見た映画の中では一番印象的だったし、今なおアメリカで続く黒人に対する白人警官の暴行を考える上での大きな問題提起の映画だと思うので、見る価値のある映画だと思います。

書評:『破綻するアメリカ』(会田弘継)

破綻するアメリカ (岩波現代全書)

破綻するアメリカ (岩波現代全書)

アメリカの左右両派の思想的な混乱状況が描き出されており、読んでいる間、部屋の壁が迫ってくるような圧迫感と混乱を感じる本でした。

著者の会田氏は、共同通信の元ワシントン支局長のジャーナリストで、現在は大学でアメリカの社会思想について研究されている方です。前作『トランプ現象とアメリカ保守思想』は、ドナルド・トランプ氏の大統領当選を受けて急いで出版されたジャーナリスティックな本といった趣きで、トランプ現象の保守思想における歴史的な位置付けを、やや荒削りな状態で提示したものだったように記憶しています。トランプ当選から約1年経過後に出版された本書では、イデオロギーによって市民が分断され、政治的に行き詰まったアメリカの政治と社会情勢が詳細に、より広い視野と歴史的な視座から描き出されています。

-- 

2016年の大統領選挙の選挙運動中に、「デキウス」というラテン語ペンネームを使った、匿名の論説がオンラインで発行されました。そのデキウスは、アメリカ市民は「フライト93」の乗客のようなものだと言います。

 2001年9月11日の同時多発テロ事件の際、ユナイテッド航空93便では、乗客が外部と連絡を取り、既に発生した他のテロの情報を得たため、乗客がテロリストに抵抗を試みました。結果、飛行機は墜落してしまったものの4件目のテロは未然に防がれ、乗員乗客以外の犠牲者を出すことはありませんでした。

 デキウスは、今やアメリカ市民は皆フライト93の乗客であるのだと言います。国家の操縦桿はテロリスト同然のエリートに支配されており、このままであれば確実に衝突を迎えることになる。ならば、我々もフライト93の乗客のように抵抗し、ドナルド・トランプを大統領にするために賭けてみるべきではないか、と言うのです。

-- 

ここには、日本社会についてよく言われるような「閉塞感」や「停滞感」といった生温い感情ではなく、より危急な切迫感を伴った絶望があります。背景には、アメリカ社会の強烈なまでの貧富の格差拡大、中年白人男性の死亡率の上昇などの問題が存在しています。黒人やヒスパニックなど差別を受けている民族集団でも死亡率は低下傾向にあるにもかかわらず、白人男性だけは死亡率が上昇しています。 (原因として医療用鎮痛剤の乱用があると言われています)

 アメリカ社会の混沌とした状況を受けて、トランプ現象を引き起こした左右両派の思想的な混乱状態を描き出そうとしているのですが、状況そのものが混乱しているだけにその描写も込み入っており、情報量も多くなかなか難解です。

本当に乱暴にまとめるなら、もともと王政や封建制の歴史を持たないアメリカでは、保守思想が「守り保つ」べき伝統が何であるかは明確ではなく、「何度も建て増しされた温泉旅館」のように、保守思想も複雑な経緯を辿ってきました。直近の右派主流派であったいわゆる「ネオコン」は、イラク戦争の復興の泥沼化により影響力を失いました。一方、左派はソビエト解体後に共産主義の影響力が衰退し、代わって女性、LGBT、被差別民族などのアイデンティティを強調する「アイデンティティポリティクス」が主流となりました。しかし、アイデンティティポリティクスは、社会をまとめるよりは個人を対立させ、むしろ社会をバラバラに解体する力として働くようになってしまいました。「リベラル」を自認する学生が考え方の異なる大学教授を吊るし上げる描写には絶望感を感じますし、このアイデンティティポリティクスの帰結については左派内部からすら批判があります。

 右派左派ともに混沌とした状況にあって理想を語れず、特に経済情勢の変化による中間層への影響を捉えきれていなかったところ、伏流のように流れていたもう一つの右派=オルト・ライトが政治的に無視できない影響を持つようになった、という流れが描き出されています。オルト・ライトは白人至上主義や排外主義と同一視して語られることも多いですが、決してそれだけで語れるものでもありません。一つ興味深かったのは、オルト・ライトの思想的な背景に、西洋の没落・衰退史観があるという指摘です。

 本書は現状分析と思想史に関する本であるため、「将来どうなっていくのか」「今後どうすれば良いのか」といった予測・提言はありません。しかし、私が感じるのは、以前私が紹介したジョン・マイケル・グリアも予測していた通り、左派の側でも巨大な地殻変動が近づいているという予兆です。そしてその変化は、アメリカ国内政治だけではなく、アメリカの対外政策、そして日本の国際関係にも極めて巨大な影響をもたらすのだろうと思います。

【Deep Learning with Python】 IMDBのレビュー分類

フランソワ・ショレ氏の「Deep Learning with Python」のサンプルコードの2つ目。

この問題は、映画のレビューの文章を入力して、そのレビューが肯定的なものか否定的なものかを判定するもの。問題の種類としては二値分類 (binary classification) に属する。データセットは、IMDB (Internet Movie Database) というサイトに投稿された映画のレビュー5万件であり、肯定的レビューと否定的レビューが半数ずつ含まれている。

3.4. 映画レビューの分類

前回のMNISTデータセットと同様、対象のデータセットに対するインターフェースはKerasに付属しているので、それを使ってロードする。こちらも初回実行時はデータをダウンロードするので多少時間を要する。

from keras import models
from keras import layers
from keras.datasets import imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

load_data() 時に指定している引数「num_words」は、レビューの文章中に出現する単語の種類を制限するためのものである。ここでは10000を指定しているので、頻度順の上位10000語のみが使用され、頻度の低い語は「?」(unknown)として表記される。対象データは、単語を数値でエンコードしたリストである。それぞれの数値が、単語の出現頻度における順位を表す。

以下の関数で、エンコードされたレビューを英語の文章へとデコードすることができる。なお、単語のインデックスは3から始まっている。これは、0, 1, 2がそれぞれ、「パディング」、「開始位置」、「不明語」を表すため。

def decode_review(num):
    word_index = imdb.get_word_index()
    reversed_word_index = dict(
        [value, key] for (key, value) in word_index.items())

    decoded_review = ' '.join([reversed_word_index.get(i-3, '?') for i in train_data[num]])
    
    return decoded_review

試しに1件レビューを表示してみる。"one of the worst films…" みたいな表現があるので、当然これは否定的なもの。

? this has to be one of the worst films of the 1990s when my friends i were watching this film being the target audience
it was aimed at we just sat watched the first half an hour with our jaws touching the floor at how bad it really was the rest of the time everyone else in the theatre just started talking to each other leaving or generally crying into their popcorn that they actually paid money they had ? working to watch this feeble excuse for a film it must have looked like a great idea on paper but on film it looks like no one in the film has a clue what is going on crap acting crap costumes i can't get across how ? this is to watch save yourself an hour a bit of your life

前回と同様、入力リストをベクトル化する。1万の要素を持つリストが文章中の単語の個数並んでいるもので、個々のリストは単語の出現頻度中の順位を表す。

# 入力データのベクトル化を行う関数
def vectorized_sequences(sequences, dimension=10000):
    results = np.zeros((len(sequences), dimension))
    for i, seq in enumerate(sequences):
        results[i, seq] = 1.
    return results

# 訓練データのワンホットベクトル化
x_train = vectorized_sequences(train_data)
x_test  = vectorized_sequences(test_data)

# ラベルの変換
y_train = np.asarray(train_labels).astype('float32')
y_test = np.asarray(test_labels).astype('float32')

# 訓練中の正解率を訓練データ以外のデータで評価するため、
# 1万件を訓練データから取り分けておく。
x_val = x_train[:10000]
partial_x_train = x_train[10000:]
y_val = y_train[:10000]
partial_y_train = y_train[10000:]

次に、ニューラルネットのモデル定義を行う。ここでは、入力は10000要素のベクトル、隠れ層が2層。それぞれの隠れ層のノードは16個、出力層は0から1の値を出力する1ノードのニューラルネットとなる。各層間の結合は全て密結合で、訓練は20回行う。modelのcompile関数に、先に分離した訓練データ1万件を与える。

from keras import losses, optimizers
from keras import metrics

model.compile(optimizer=optimizers.RMSprop(lr=0.001),
              loss=losses.binary_crossentropy,
              metrics=['accuracy'])

history = model.fit(partial_x_train, partial_y_train,
                   epochs=20, validation_data=(x_val, y_val),
                   batch_size=512)

訓練を実行し、検証データに対する損失関数の値と予測正解率のモニタリングを行う。ささいなミスではあるけど、書籍に掲載されたコードには誤植があるようだ。p.74で、訓練/検証時の損失関数の値をプロットしているが、x軸の範囲を求める際に、未定義の変数 accを使ってしまっている。

epochs = range(1, len(acc) + 1)
# => 正しくは len(loss_values) もしくは len(val_loss_values)

訓練時の正答率と損失関数の値をプロットしたものがこちら。2回目か3回目以降、悪化している (過学習に陥っている) ことが分かる。

f:id:liaoyuan:20180123225826p:plainf:id:liaoyuan:20180123225833p:plain

さて、訓練済みのモデルを使って、新しいデータに対する予測を行う。ここではmodelのpredict関数を使う。

model.predict(x_test)
array([[ 0.98006207]
       [ 0.99758697]
       [ 0.99975556]
       ...,
       [ 0.82167041]
       [ 0.02885115]
       [ 0.65371346]], dtype=float32)

元のデータセットにおいて、「1」が肯定的意見を、「0」が否定的意見を表す。出力も、1あるいは0に近ければ近いほど確信度の高さを表し、中間の0.5に近い値はどちらか判断できないことを表す。

更なる実験

モデルのレイヤー数、ノード数を変えてみたり、損失関数や活性化関数を変えて、結果の変化を確認してみましょう、という演習がある。ここでは、レイヤー数を増減させて学習し、テストデータに対する予測正解率がどう変化するかを見てみた。

上記のサンプルでは隠れ層が2層のモデルを使用したので、隠れ層が1層と3層のモデルを用いてみる。コードは省略するが結果は以下の通り。

f:id:liaoyuan:20180123225045p:plain

レイヤー数を増やすほど精度は向上する傾向があるわけではなく、むしろ1層のモデルの方が正答率は高い。深けりゃ良いってものでもなく、ナイーブな方法でパラメータを増やせば過学習が起こりやすくなるのだろうと思う。

今回は以上。ちなみに、次のサンプルプログラムである「ニュース記事のカテゴリ分類」は飛ばして、ボストンの住宅価格予測の回帰問題を取り上げる予定。

読書メモ:Deep Learning with Pythonを読む

以前、軽く流し読んだフランソワ・ショレ氏の「Deep Learning with Python」ですが、ちゃんとサンプルを動かしながら勉強していこうと思います。

なお、この記事は機械学習素人が勉強の過程をメモするためのであり、内容の正しさについては保証しません。(ちゃんと知りたい人は上掲書を読みましょう)

2.1. はじめてのニューラルネット

最初は機械学習のサンプルとしてよくあるMNISTの分類を行う。MNISTは、0〜9までの手書き文字の画像で、訓練データが6万件、テストデータが1万件存在する。
f:id:liaoyuan:20180118211402p:plain
図:MNISTのサンプル

なお、MNISTのデータセットへのインターフェイスはKeras自体に付属しているので、以下のコードでデータセットを読み込める。(初回ロード時にはデータをダウンロードしに行くので、多少時間が必要。)

from keras.datasets import mnist

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

ニューラルネットにこのデータを入力して学習させる前に、まずはニューラルネット(tensorflow) が受け付けられる形式にデータを整形する必要がある。

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

train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

MNISTのデータは28x28ピクセルを表現した二次元配列であり、各ピクセルは0〜255 (グレースケール) の値を取る。各データを一次元の配列で0〜1までの実数(浮動小数点数) に変更する

データのラベルは0〜9までの整数で表現されているので、ワンホットベクトル形式に変更する。ワンホットベクトルとは、以下の形式の表現。

0 => [1,0,0,0,0,0,0,0,0,0] 
1 => [0,1,0,0,0,0,0,0,0,0]
2 => [0,0,1,0,0,0,0,0,0,0]
# 10個の要素を持つリストで、数字の「2」であれば3番目の要素だけが1で他は0

この変換をしてくれるkerasの関数がある。(keras.utils.to_categorical)

カテゴリをワンホットベクトル形式で表現する必要性については、このサイトの説明が分かりやすかった。(多分、線形演算でカテゴリの分類を扱うための技法ということらしい。) この程度の変換は良きにはからって勝手にやってくれと思わんでもない。

ニューラルネットのモデル定義

次から、ニューラルネットのモデルを定義する。

models.Sequencial は、その名の通り「順番に」 ニューラルネットの層を重ねるモデルである。Dense というレイヤーは、密結合(全結合)ネットワークで、前のノードとの間に全てエッジが引かれる。最初の引数はその層のノード数を表し、activationは活性関数を表す。

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

最初はニューラルネットのモデルがあまり分からなかったので図にしてみた。こんな感じだと思われる。

f:id:liaoyuan:20180118212624p:plain

Layerはその名の通り「層」を表すものだけど、むしろ層と層を繋ぐ方法を指定するものだとイメージしたほうが分かりやすいかもしれない。

学習させる前に、compile関数でモデルの準備を行う。このとき、最適化関数、損失関数、メトリクスを定義する。それぞれの役割と詳細はここでは省略する。

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

学習実行

訓練データに対して、学習を10回実行する。epochsで訓練回数を指定。batch_size は訓練バッチのサイズを指定するもので、ここで指定したサンプル数ごとに勾配の更新を行う。今回はCPUのみで学習を実行したが、この程度であれば数分もかからず学習が完了した。

network.fit(train_images, train_labels, epochs=10, batch_size=128)

そして、evaluate関数でテストデータを用いて訓練したモデルを評価する。テストデータに対する正答率は97.9%くらい。

test_loss, test_acc = network.evaluate(test_images, test_labels)
print(test_acc) # => 0.9793

 

予測と結果の表示

書籍のサンプルとしてはここまでだけど、単に学習させるだけで終わっても面白くないので、簡単に結果を確認してみたい。

まずは結果概要を確認するために混同行列を表示する。縦の列が本来の値で、横の行がニューラルネットによる推測値である。対角線上の値が正解数を意味する。

[[ 970    1    0    1    1    0    4    1    2    0]
 [   0 1123    4    1    0    1    3    1    2    0]
 [   1    0 1013    1    2    0    3    7    5    0]
 [   0    0    4  990    0    4    2    3    3    4]
 [   0    0    2    0  964    0    8    2    0    6]
 [   2    0    0    7    0  874    5    1    1    2]
 [   3    2    1    1    1    2  948    0    0    0]
 [   1    3    9    1    0    0    0 1003    3    8]
 [   1    0    3    3    3    2    2    2  953    5]
 [   0    2    0    1    8    3    1    5    3  986]]

厳密に統計的な分析をしたわけではないけど、6, 8, 9などの丸を含む数字は苦手なのだろうか、という印象。

更に、誤った予測をされた数字の画像を出力させたいので、テストデータに対して予測を行う。ここで使うのは predict_classes メソッドで、テストイメージのNumpy配列を受け取り、クラス(カテゴリ)の予測結果、つまり0〜9の値が入った配列を返す。

predicted_classes = network.predict_classes(test_images)

ニューラルネットの予測のうち、誤答だったものを画像で100件出力してみる。左上の青文字が正解のラベルで、赤字がニューラルネットの予測値 (誤答)

f:id:liaoyuan:20180118214029p:plain

0と6の混同など、文字が乱雑すぎて人間でも同じ間違いをするだろうという感じの文字もあるし、2と8のように何故こんな不可解な間違いをするんだっていう予測もある。今回は2次元の画像データを1次元のベクトルに変換しており、縦方向の形状を活用できる処理をしていないからこうなるのでしょう。(ちなみに、本書ではCNNは5章で扱われる予定)

一応今回のコードは以下のgistに掲載した。
"Deep Learning with Python" のMNISTサンプル · GitHub

今回は以上です。

「危険な年」 ジョン・マイケル・グリアの2018年予測

ジョン・マイケル・グリアの2018年予測が面白かったのでメモしておきます。グリアは、米国の「ドルイド教」という古代ケルトの信仰の復興を目指すネオペイガニズムの宗教家ですが、極めて特異な視点を持った博学な歴史家としての一面があり、種々の文明批評的な著作があります。

グリアは、2016年1月に、未だスーパーチューズデー以前の段階で、2016年11月にドナルド・トランプが大統領選挙に当選することを予測していました。そのため、私は彼の予測に非常に信頼を置いています。また、米国のさして高い地位に居るわけではない市井の人の視点からの合衆国政治ウォッチとして、非常に興味深い予測であると考えるのでここで紹介します。

予測手法

…my method in making these predictions is at once simple, effective, and highly unpopular.  Put briefly, I pay attention to what happened when the same conditions occurred in previous historical epochs, and predict that the same consequences are going to follow.

(私訳) 私の予測手法は、一見シンプルで、効果的で、非常に不人気なものだ。簡潔に言えば、過去の歴史時代において同様の状況が発生したときに何が起きたのかに注意を払い、そして、同様の結果を生むと予測するものである。

人類には既に5000年もの歴史があり、また近年の人々は歴史の教えが自分自身に適用できると考えておらず歴史を軽視しており、結果的に歴史的事例と同じ状況に陥ることが多いので、この方法が有効であるのだと言います。

総合的予測

Some historical epochs are more dangerous than others, and the most dangerous of all are those in which a once-great empire is on the way toward history’s dustbin.

(私訳) いくつかの歴史時代には、他よりも危険な時代が存在する。そして、最も危険な時代は、かつての大帝国が歴史のゴミ箱へと向かう道程である。

  •  アメリカが超大国としての地位から落ちていくことが、米国の国内政治と国際情勢を形成する
  • これまで、誰も予測していなかったような「ブラックスワン」的事象が発生する

米国の国内政治

  • トランプ政権は、過去の大統領たちと同様の方法を取り、それに成功している
    すなわち、自身に敵対する人々を犠牲にして、自身の支持者にエサを与えることである
  • 民主党は、2016年の大統領選挙の敗北から教訓を学ぶことに失敗している
    ゆえに、2018年の中間選挙、2020年の次期大統領選挙でも共和党が勝つ見込みが高いと見ている
  • ただし、ここにもブラックスワンが存在する

While you’re watching domestic US politics, by the way, keep an eye out for a massive sea change that’s under way this year, though it probably won’t have an impact for a few years yet: the absurdity of Christians in America supporting a political agenda that directly contradicts the teachings of Christ has begun to sink in, in a big way, among young American Protestants.

(私訳) アメリカ国内政治を見る時には、今年進行する巨大な潮流の変化に眼を向けてほしい。しかし、この影響が明らかになるまでにはまだ数年を要するだろう:アメリカのキリスト教徒は、キリストの教えと真っ向から矛盾する [共和党の] 政治的アジェンダを支持することの馬鹿さ加減に気付き初めている。とりわけ、若いアメリカのプロテスタントにおいて。

Donald Trump, interestingly enough, seems to have been the bright orange straw that broke this particular camel’s back; a great many young evangelical Christians, watching their elders turn cheerleader for a man who’s a poster child for every one of the seven deadly sins, have had enough.

(私訳) ドナルド・トランプは、興味深いことに、ラクダの背骨を折る最後の藁であったようだ。極めて多くの若い福音派クリスチャンは、老人たちが7つの大罪の全てを体現したような男の支援者となったのを見て、もう十分だと考えている。

  •  米民主党は、未だこの状況を活用することができていないが、数年以内に巨大な地殻変動が起きる可能性がある
  • それは、大西洋を挟んで英労働党ジェレミー・コービンが行なっていることと似た事象である
    すなわち、与党のクローンと化す以前の、政党の元の姿を取り戻すことである
  • これが2020年以前に発生すれば、次期大統領選挙において「左派福音派」が巨大な勢力となるだろう
    もし2020年に民主党が敗北することがあれば、その後に左派福音派の勃興が起こるはずだ

国際情勢

  • 前述の通り、アメリカの衰退が国際情勢を形成する
  • シリア、エジプト、トルコなど中東諸国でロシアの影響力が強まりつつあり、この傾向は続くだろう
  • 小国が地域的野心を抱き、局所的な紛争が発生する可能性はあるが、ロシア、中国、イランなどアメリカと対峙する国家との間での大規模な衝突は決して起こらないだろう
    彼らは、ただアメリカの衰退を待っていれば良いのだから
  • 国際情勢について議論する際には、特にサウジアラビアに注目するべきだ
  • 絶対王政国家が、経済改革を実行しなおも権力の座に留まり続けることは、極めて危険な政策である
    それは、フランスのルイ16世が1789年までに、1917年以前の何年もの間にロシアのニコライ皇帝が、1978年以前の数十年間にイランのシャーが試みたことであるが、サウジアラビアムハンマド・ビン・サルマーン皇太子は同じ政策を取っている

経済

  •  株高や仮想通貨の価格上昇は、続くかもしれないし続かないかもしれない
  • 「幻想の経済」が重力の法則に従うという理由はない
  • 注目するべきトレンドは、バブルではなく「官製経済」 と現実の経済問題との乖離である
What we’re seeing, in other words, is the transformation of the US economy into a Potemkin Village capitalism in which government largesse backed by Ponzi financing props up a thin imitation of prosperity over the top of spreading impoverishment. It’s not accidental that Elon Musk, one of the most highly touted of the new generation of capitalist grandees, runs all his businesses on government subsidies.

 つまりは、我々が眼にしているのは、アメリカ経済のポチョムキン村資本主義への変貌である。ネズミ講ファイナンスに裏付けられた政府の下賜金が、貧困の拡大を代償として繁栄の薄っぺらい模倣を支えている。新世代の資本主義の大公として最も賞賛されているイーロン・マスクが、全ての事業を政府補助金に頼っていることは、偶然ではない。 

環境問題

  • 環境問題は重大な問題ではあるが、実効性のある対策は (これまで通り) 何も取られないだろう (この主張は、例年通りの彼の予測)

Windows10でKeras/tensorflowがGPUを使用できない場合のチェックポイント

Deep Learningの勉強をしようと考えて、GPU搭載のマシンを購入して環境構築した際、多少ハマったのでメモを残しておく。とある事情によりWindowsを使いたいのと、Windows+Linuxデュアルブートにはあまり良い思い出がないので、Windows上で環境を構築した。

実行環境

2017年12月現在の環境構築ポイント

  • Windows環境の最新のcuDNNはCUDA 9.0に対応していないため、8.0をインストールする
  • CUDA 8.0のインストールには、Visual Studio 2015のVisual C++とWindows10 SDKが必要
  • Python側は、Anacondaを使ってちゃんと仮想環境を切ればあまりハマるポイントは無いと思われる

環境構築
Visual Studio 2015のインストール

https://my.visualstudio.com/downloads (要ユーザ登録)

次のCUDA Toolkit 8.0のインストールのために必要。CUDA のバージョンはVSのバージョンと密接に結びついているらしく、現行のCUDA 8.0はVS2017に対応していないため、2015を使用する必要がある。Visual C++Windows 10 SDKが必要らしいのでチェックを入れてインストールする。

CUDA Toolkit 8.0 のインストール

CUDA Toolkit 8.0 - Feb 2017 | NVIDIA Developer

CUDA Toolkit 8.0 - Feb 2017 を選択しインストールする。なお、前項のVisual Studio 2015が無くてもインストーラ自体は問題なく完了してしまうが、tensorflow-gpuがうまく動かないという問題がある。(私はこれでハマった)

f:id:liaoyuan:20171229234527j:plain

上記の画面が表示されたらVSのインストールがうまくいっていないので、そのまま進まずにVSのインストールからやり直し。

cuDNNのインストール

https://developer.nvidia.com/rdp/cudnn-download (要ユーザ登録)

cuDNN v6.0 (April 27, 2017), for CUDA 8.0を選択し、zipファイルをダウンロードする。ファイルを解凍すると、cuda/bin,include,libフォルダが展開されるので、CUDAのインストールフォルダ C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0 以下のフォルダを上書きコピーする。(もしくは、任意の場所に配置してパスを通す)

Anaconda 5.0 (Python3.6) のインストール

Downloads | Anaconda

Anaconda Python 3.6 versionをダウンロードしてインストール。特に注意点はなし。

Python環境構築

今回は問題が起こらなかったけど、numpyのインストールに失敗したりバージョン不整合が起こるケースがあるらしいので、ちゃんと仮想環境を切ってインストールしたほうが良さそう。Anaconda Promptを起動して仮想環境dlを作成する。

conda create -n dl 

コマンドで仮想環境に入る。

activate dl

以下のコマンドで、必要なpythonのパッケージをインストールする。

conda install -n dl tensorflow-gpu
conda install -n dl keras

今回の環境では、なぜかAnaconda デフォルトのjupyterではpython kernelの切り替えができなかったので、仮想環境側にもjupyterをインストールした。

conda install -n dl jupyter 

最後に、jupyterのnotebookを起動してkerasをimport。
"Using TensorFlow backend." と表示されることを確認する。

import tensorflow
print(tensorflow.test.is_built_with_cuda())

True であれば、tensorflowのインストールは問題なく完了してGPUが使用できるはず。

トラブルシュート時のチェックポイント

CUDA Toolkit

CUDA Toolkitのインストール後、コマンドプロンプトから以下のコマンドを実行する。(nvccはnVidia製のGPU用のコンパイラ)

> nvcc
"nvcc fatal : No input files specified; use option --help for more information"

と表示されれば、CUDAのインストールには問題がないと思われる。nvccを認識できなければCUDAのインストールに失敗している。

cuDNN

tensorflow 1.3以降のバージョンでは、cuDNN 6 (cudnn64_6.dll) が必要となる。cuDNNがロードできないと怒られる場合は、cuDNNのインストールに失敗している (もしくはパスが通っていない) と考えられる。

tensorflowインストールチェックスクリプト

TensorFlow on Windows self-check · GitHub

Windowsでtensorflow構築時の問題切り分けに有用なスクリプトを発見したので共有しておく。VSのライブラリ、cuDNN、CUDA Toolkitのインストール状況と、tensorflowがCUDAを認識しているかを確認してくれる。

動作確認

keras付属のMNISTのサンプルを動作させて、GPUで計算されることを確認した。

f:id:liaoyuan:20171229235314j:plain

所感

やっぱりGPUは爆速で良い。(ちゃんと計測してないけど、CPUのみと比較して10〜20倍くらい速いと思う)

一番面倒くさいのはMicrosoftNVIDIAの開発者アカウント登録だった。

参考

Windows10:KerasでGPUを使用する環境構築のTip's(TensorFlow) - Qiita

[Python]Windows10にTensorflow-GPU+Kerasをインストールする[2017/10/5] - Qiita

はてなブログでAmazon商品を貼り付けると空行が入ってしまう

はてなブログの問題について書きます。私も解決方法が分からなかったので、誰か解決策をご存知であれば教えてください。

 

f:id:liaoyuan:20170829182138p:plain

 

はてなブログの「見たまま編集モード」から、Amazonの商品を「詳細」形式で貼り付けると、上記のスクリーンショットの通り、商品の下に空行が入ってしまいます。見た目の問題だけで、特に実害は無いのですが微妙に気になります。

記事の投稿前には編集できず、投稿後に改めて記事を編集して空行を削除すれば良いのですが一手間が増えてしまいます。

 

あまり有用性の無いエントリですが、とりあえず微妙に不便だなぁと感じているということを書き残しておきます。