TMVAのDNNを使ってみる。(2018年8月17日)

https://root.cern/tmva

がTMVAのサイト。そこのDNNをクリックすると

https://swan.web.cern.ch/content/machine-learning

に飛ぶ。TutorialsのDNNをクリックすると、

http://nbviewer.jupyter.org/github/iml-wg/tmvatutorials/blob/master/TMVA_DNN.ipynb

に飛ぶ。Jupyter notebookらしいが、使ったことがないので、コマンドラインで実行する。

BLAS込みでROOTをコンパイル必要があるらしい。

https://root-forum.cern.ch/t/dnn-multi-target-regression/24724/5

を見ると、CentOS7用のROOTはBLAS込みでコンパイルされているようだ。

簡単のため、CentOS7を使っているのlxplus7.cern.chにログインする。

ssh -X username@lxplus7.cern.ch

最新のCentOS7用のROOT6を設定する。

ROOTDIR=/cvmfs/sft.cern.ch/lcg/app/releases/ROOT/6.14.02/x86_64-centos7-gcc48-opt
. $ROOTDIR/root/bin/thisroot.sh

http://nbviewer.jupyter.org/github/iml-wg/tmvatutorials/blob/master/TMVA_DNN.ipynb
の内容を test.py というファイルにコピペする。ただし

%jsroot on

というのだけはコメントアウトして、ROCカーブをPNGファイルに保存するために最後の行を追加した。

# Declare Factory
from ROOT import TMVA, TFile, TTree, TCut, TString

# Declare Variables in DataLoader
TMVA.Tools.Instance()

inputFile = TFile.Open("https://raw.githubusercontent.com/iml-wg/tmvatutorials/master/inputdata.root")
outputFile = TFile.Open("TMVAOutputDNN.root", "RECREATE")

factory = TMVA.Factory("TMVAClassification", outputFile,
                       "!V:!Silent:Color:!DrawProgressBar:AnalysisType=Classification" )

# Declare Variables in DataLoader
loader = TMVA.DataLoader("dataset_dnn")

loader.AddVariable("var1")
loader.AddVariable("var2")
loader.AddVariable("var3")
loader.AddVariable("var4")
loader.AddVariable("var5 := var1-var3")
loader.AddVariable("var6 := var1+var2")

# Setup Dataset(s)
tsignal = inputFile.Get("Sig")
tbackground = inputFile.Get("Bkg")

loader.AddSignalTree(tsignal)
loader.AddBackgroundTree(tbackground) 
loader.PrepareTrainingAndTestTree(TCut(""),
                                  "nTrain_Signal=1000:nTrain_Background=1000:SplitMode=Random:NormMode=NumEvents:!V")

# Configure Network Layout

# General layout
layoutString = TString("Layout=TANH|128,TANH|128,TANH|128,LINEAR");

# Training strategies
training0 = TString("LearningRate=1e-1,Momentum=0.9,Repetitions=1,"
                        "ConvergenceSteps=2,BatchSize=256,TestRepetitions=10,"
                        "WeightDecay=1e-4,Regularization=L2,"
                        "DropConfig=0.0+0.5+0.5+0.5, Multithreading=True")
training1 = TString("LearningRate=1e-2,Momentum=0.9,Repetitions=1,"
                        "ConvergenceSteps=2,BatchSize=256,TestRepetitions=10,"
                        "WeightDecay=1e-4,Regularization=L2,"
                        "DropConfig=0.0+0.0+0.0+0.0, Multithreading=True")
trainingStrategyString = TString("TrainingStrategy=")
trainingStrategyString += training0 + TString("|") + training1

# General Options
dnnOptions = TString("!H:!V:ErrorStrategy=CROSSENTROPY:VarTransform=N:"
        "WeightInitialization=XAVIERUNIFORM")
dnnOptions.Append(":")
dnnOptions.Append(layoutString)
dnnOptions.Append(":")
dnnOptions.Append(trainingStrategyString)

# Booking Methods
# Standard implementation, no dependencies.
stdOptions =  dnnOptions + ":Architecture=CPU"
factory.BookMethod(loader, TMVA.Types.kDNN, "DNN", stdOptions)

# CPU implementation, using BLAS
# cpuOptions = dnnOptions + ":Architecture=CPU"
# factory.BookMethod(loader, TMVA.Types.kDNN, "DNN CPU", cpuOptions)

# Train Methods
factory.TrainAllMethods()

# Test and Evaluate Methods
factory.TestAllMethods()
factory.EvaluateAllMethods()

# Plot ROC Curve
# %jsroot on
c = factory.GetROCCurve(loader)
c.Draw()
c.Print("result.png") # added 

このファイルを実行する。

python test.py
display result.png

で保存したPNGファイルが見える。

result.png

ここまでなら、BDTを使うのと同じような印象。


Binary classificationでなく、regressionをするなら

http://nbviewer.jupyter.org/github/iml-wg/tmvatutorials/blob/master/TMVA_Regression.ipynb

が良さそう。

コマンドをコピペして、

ssh lxplus.cern.ch
setupATLAS
lsetup root
root -l -b -q reg.C

で、うまく行った。

reg.png

もっと一般的なことをするにはやはりTMVA以外が必要? (2018年8月18日)

https://twiki.cern.ch/twiki/bin/view/AtlasComputing/SoftwareTutorialDeepLearning

ssh lxplus.cern.ch
wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
sh Miniconda3-latest-Linux-x86_64.sh
ssh lxplus.cern.ch
conda config --add channels https://conda.anaconda.org/NLeSC
conda create --name=testenv root=6 python=2 mkl jupyter numpy scipy matplotlib scikit-learn h5py rootpy root-numpy pandas
source activate testenv
pip install PyHamcrest # added
pip install cython # added
pip install Theano
pip install Keras
ssh lxplus.cern.ch
source activate testenv
cd /afs/cern.ch/work/o/oda/private/miniconda3/pkgs/root-6.04-py2.7_gcc4.8.2/
. bin/thisroot.sh
cd -
root -l -b

/afs/cern.ch/work/o/oda/private/miniconda3/pkgs/root-6.04-py2.7_gcc4.8.2/bin/root.exe: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory

が出てしまう。

cd /afs/cern.ch/work/o/oda/private/miniconda3/pkgs/root-6.04-py2.7_gcc4.8.2/lib
ln -s /lib64/libpcre.so.0 libpcre.so.1
ln -s /usr/lib64/liblzma.so.0 liblzma.so.5

としても、

root -l -b -q
/afs/cern.ch/work/o/oda/private/miniconda3/pkgs/root-6.04-py2.7_gcc4.8.2/bin/root.exe: 
/afs/cern.ch/work/o/oda/private/miniconda3/pkgs/root-6.04-py2.7_gcc4.8.2/bin/../lib/./liblzma.so.5: no version information available (required by /afs/cern.ch/work/o/oda/private/miniconda3/pkgs/root-6.04-py2.7_gcc4.8.2/bin/../lib/libCore.so)
input_line_1:1:10: fatal error: file '/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/new' modified since it was first processed
#include <new>

となってうまく行かない。

https://qiita.com/icoxfog417/items/beffb263a7ffb8e5bcad

Windows 10にTensorFlowをインストール

https://qiita.com/samacoba/items/207f2650ee60fe1de25a

に従って

https://repo.continuum.io/archive/.winzip/

Anaconda3-4.2.0-Windows-x86_64.zip

っをダウンロードして、解凍し、実行したら、簡単にAnacondaをインストールできた。Jupyterも、python3.5も自動的に入った。

Anaconda Promptで

pip install tensorflow

でTensorFlowをインストールできた。

Jupyter Notebook上で

https://qiita.com/samacoba/items/c3291addba06ea6206c1

#TensorFlow Deep MNIST for Experts
#https://www.tensorflow.org/get_started/mnist/pros

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

import tensorflow as tf
sess = tf.InteractiveSession()

x = tf.placeholder(tf.float32, shape=[None, 784])
y_ = tf.placeholder(tf.float32, shape=[None, 10])
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
sess.run(tf.global_variables_initializer())
y = tf.matmul(x,W) + b
cross_entropy = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

for _ in range(1000):
  batch = mnist.train.next_batch(100)
  train_step.run(feed_dict={x: batch[0], y_: batch[1]})

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

def weight_variable(shape):
  initial = tf.truncated_normal(shape, stddev=0.1)
  return tf.Variable(initial)

def bias_variable(shape):
  initial = tf.constant(0.1, shape=shape)
  return tf.Variable(initial)

def conv2d(x, W):
  return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

def max_pool_2x2(x):
  return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
                        strides=[1, 2, 2, 1], padding='SAME')

W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])
x_image = tf.reshape(x, [-1,28,28,1])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)
W_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)
W_fc1 = weight_variable([7 * 7 * 64, 1024])
b_fc1 = bias_variable([1024])
h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])

y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2

cross_entropy = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
sess.run(tf.global_variables_initializer())

for i in range(20000):
  batch = mnist.train.next_batch(50)
  if i%100 == 0:
    train_accuracy = accuracy.eval(feed_dict={
        x:batch[0], y_: batch[1], keep_prob: 1.0})
    print("step %d, training accuracy %g"%(i, train_accuracy))
  train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

print("test accuracy %g"%accuracy.eval(feed_dict={
    x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

のコマンドを実行して、MNIST動作確認をしようとしたが、20,000回中、1000回で30分くらい掛かったのでやめた。

pip install keras

https://codezine.jp/article/detail/10917


https://qiita.com/t2y/items/2a3eb58103e85d8064b6

https://www.anaconda.com/download/#linux

wget https://repo.anaconda.com/archive/Anaconda3-5.2.0-Linux-x86_64.sh
sh Anaconda3-5.2.0-Linux-x86_64.sh
pip install msgpack
pip install Theano
pip install TensorFlow
pip install keras
jupyter-notebook

https://nlesc.gitbooks.io/cern-root-conda-recipes/content/installing_root_via_anaconda.html

conda config --add channels https://conda.anaconda.org/NLeSC
conda create --name=testenv root=6 python=3
source activate testenv
root 
.q
source deactivate

大規模に使おうと思うと面倒だから、

https://www.cc.kyushu-u.ac.jp/scp/software/

https://twiki.cern.ch/twiki/bin/view/IT/TechLab

など計算機センターやクラウドに頼るのが良いのかな?


添付ファイル: filereg.C 51件 [詳細] filereg.png 46件 [詳細] filelog1.txt 282件 [詳細] fileresult.png 51件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-08-21 (火) 13:54:23 (278d)