AWS に Anaconda + Python3 + jupyter notebook + keras/tensorflow環境導入

概要

そもそもjupyter をAWSに入れればいいんじゃねと思った時の備忘録です。

環境は以下

ホスト

 ・macOS High Sierra 10.13.4
 ・VirtualBox 5.2.1
 ・Vagrant 2.0.4

ゲスト

 ・CentOS7
 ・Anaconda3-5.2.0
 ・Python3.6.5(Anaconda経由でインストール)

機械学習ライブラリ

 ・tensorflow-1.8.0
 ・keras 2.2.0

AWSアカウントとEC2インスタンスの作成

もともとAWSアカウントは持っていたので割愛。

AWS EC2でWebサーバーを構築してみる

こちらとか参考になります。 注意点としてjupyter notebookを立ち上げる際に、ポート8888を解放して繋げるので、セキュリティグループのルールを新しく作成する必要があります。 こんな感じ f:id:mashi-prog:20180611234809p:plain

SSHの設定

Host deep-dev(エイリアスの作成、任意のホスト名)
hostname ec2------.us-west-2.compute.amazonaws.com(EC2)
identityfile ~/.ssh/----.pem (AWSで発行した鍵)
user cents(ログインユーザー)
# SSH接続
$ ssh deep-dev

これを~/.ssh/configに記述することで、SSH接続が簡単にできるようになります。

ソフトウェアインストール

# yumのアップデート
$ sudo yum update
# 色々インストール
$ sudo yum -y install git vim gcc gcc-c++ python-setuptools python-devel postgresql-devel

Anacondaのインストール

# anacondaのバージョン確認
$ pyenv install -l | grep anaconda
# 最新版インストール
$ pyenv install anaconda3-5.2.0
$ pyenv rehash
# anacondaをpythonのデフォルトに設定
$ pyenv global anaconda3-5.2.0
$ echo 'export PATH="$PYENV_ROOT/versions/anaconda3-5.2.0/bin/:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
# condaの更新(これしないとたまにダメ)
$ conda update setuptools

jupuyter notebookの設定

$ jupyter notebook --generate-config
$ ipython
In [1]: from notebook.auth import passwd

In [2]: passwd()
Enter password: ○○○○
Verify password: ○○○○

Out[2]: 'sha1:○○○○○○○○○○'

出力された'sha1:○○○○'を

$ vim ~/.jupyter/jupyter_notebook_config.py
...
c.NotebookApp.ip = '*'
...
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888
# パスワードをコピー
c.NotebookApp.password = 'sha1:○○○○'

これでパスワードログインが可能になります。

# jupyter notebookサーバを起動する。  
# nohupとつけるとターミナルを閉じてもコマンドを実行してくれる。
$ nohup jupyter notebook $

ブラウザからEC2ダッシュボードのパブリックDNSの名前:ポート番号(8888)でアクセス f:id:mashi-prog:20180612000623p:plain パスワードログイン! これで完了!

参考

qiita.com

$

KerasのMNISTサンプル解説

概要

前回記事でインストールした、深層学習用ライブラリKerasでMNISTのサンプルプログラムを動かしました。 今回はサンプルプログラムには何が書かれているのかを見てみます。

前回記事

mashi-prog.hatenablog.com

環境は以下

ホスト

 ・macOS High Sierra 10.13.4
 ・VirtualBox 5.2.1
 ・Vagrant 2.0.4

ゲスト

 ・CentOS7
 ・Anaconda3-5.2.0
 ・Python3.6.5(Anaconda経由でインストール)

機械学習ライブラリ

 ・tensorflow-1.8.0
 ・keras 2.2.0

Kerasのサンプルコードはこちら

github.com

MNISTとは

MNISTは「Mixed National Institute of Standards and Technology」の略のことだそうです。 手書き文字や数字の正解の例が超たくさんあるデータセットのことをさします。
機械学習では非常によく使われるデータセットの1つで、 28*28ピクセルの手書き文字が画像で与えられています。

サンプルコード

ではサンプルコードの実際の順を追いながらみてみます。

使用ライブラリのインポート

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop

一番最初にライブラリのインポートを行います。

データの加工

# データを1次元に変形
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
# float型に変換
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
# 数値の範囲を0〜255から0〜1までに
x_train /= 255
x_test /= 255

 MNISTには60000個の画像が、28*28ピクセルで収録されています。2次元で収録されたデータを1次元にするために、変形させています。
 また色情報が0〜255までの数値で収録されており、0が白、255が黒となります。機械学習では0〜1の範囲にいた方が使い勝手がいいため、データ型をfloat型にした上で255で割っています。

テストデータとトレーニングデータ

 機械学習では、データセットをトレーニングデータとテストデータの2つに分割しておきます。 トレーニングデータとはモデルの学習を行い、テストデータで学習の結果を評価します。
 MNISTに関して言えば、60000個のトレーニングデータを使って学習を行い、10000個のテストデータで検証を行うといったイメージです。
 ただ、テストデータは本来、検証データとテストデータで分けるべきであり・・・(この辺のお話はまた今度)

one-hot表現

y_train = keras.utils.to_categorical(y_train, 10)
y_test  = keras.utils.to_categorical(y_test, 10)

 x_train(x_test)に対してy_train(y_test)とは正解のことを表します。
 MNISTは0〜9の手書き文字のことなので、それぞれ0〜9といった数字が正解データとして収録されています。
 最終的に、「この数字が3である確率は86%、8である確率が12%・・・」といった風に出力するので、それぞれの数字がただ格納されているだけでは非常に使いづらいです。
 そこで、「6」であれば「0,0,0,0,0,0,1,0,0,0」といった風にコンピュータが使いやすい形に変換を行います。(OneHot表現と言います)

# load したばかりの時のy_testの一番め
print(y_test[0])
# one-hot表現に
y_test = keras.utils.to_categorical(y_test, num_classes)
# one-hot表現した後のy_testの一番め
print(y_test[0])
7
[0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]

こんな感じで出力されます。
ちなみにjupyter notebookを使ってる方は、変数名だけを入力してShift+Enterを押すと中身が見られるので、これなんだっけというときはすぐ確認してみるといいかも。

ここまででデータの加工は終了です。 次回はついに学習モデルに入っていきます。

参考

employment.en-japan.com

Keras で MNIST データの学習を試してみよう

CentOS7 に Keras/tensorflow導入

概要

Vagrantで立ち上げたCentOS7にKerasを導入して、サンプルを動かすまでです。

前回記事 mashi-prog.hatenablog.com

環境は以下

ホスト

 ・macOS High Sierra 10.13.4
 ・VirtualBox 5.2.1
 ・Vagrant 2.0.4

ゲスト

 ・CentOS7
 ・Anaconda3-5.2.0
 ・Python3.6.5(Anaconda経由でインストール)

機械学習ライブラリ

 ・tensorflow-1.8.0
 ・keras 2.2.0

関連ライブラリのインストール

多分必要となるであろう、ライブラリなどをインストールします。

$ sudo yum group install "Development Tools"
$ sudo yum install openssl-devel readline-devel zlib-devel bzip2-devel

tensorflow/kerasの設定

作業ディレクトリの作成、anacondaでの環境の作成を行います。

# 作業ディレクトリの作成
$ mkdir ~/tensorflow-test && cd $_
# condaで環境の作成
$ conda create -n tensorflow
$ source activate tensorflow
$ pyenv local anaconda3-5.2.0 (set by /home/vagrant/.pyenv/version)
# version指定の確認
$ pyenv versions
  system
  anaconda3-5.2.0
* anaconda3-5.2.0/envs/tensorflow (set by /home/vagrant/tensorflow-test/.python-version)

tensorflowとkerasをインストールします。

$ conda install -c condo-forge tensorflow
$ pip install keras

サンプルコードの実行

前回紹介したjupyter notebook でサンプルコードを実行してみましょう。

# env tensorflowにはjupyter がないため、インストール
$ conda install jupyter
# jupyter 起動
$ jupyter notebook --no-browser --ip=0.0.0.0

前回と同じように、ホストのブラウザからアクセスしてみます。

http://192.168.33.10:8888/(環境によってアドレスは異なります。)

New -> Python3からノートブックを作成して、MNISTのサンプルコードを実行してみましょう。

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop

batch_size = 128
num_classes = 10
epochs = 20

# the data, shuffled and split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer=RMSprop(),
              metrics=['accuracy'])

history = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    epochs=epochs,
                    verbose=1,
                    validation_data=(x_test, y_test))

score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

Shift + Enterで実行します。
画像みたいな感じで学習が進めば成功です! f:id:mashi-prog:20180609125116p:plain 次回はMNISTのサンプルコードを見てみたいと思います。

参考

qiita.com

takemikami.com

Vagrant + Anaconda + Python3 + jupyter notebook環境導入

概要

Macbook上にVagrantを用いて、Python3の環境導入を行います。

環境は以下

ホスト

 ・macOS High Sierra 10.13.4
 ・VirtualBox 5.2.1
 ・Vagrant 2.0.4

ゲスト

 ・CentOS7
 ・Anaconda3-5.2.0
 ・Python3.6.5(Anaconda経由でインストール)

Mac

MacへのVirtualBoxVagrantは適当にGUIでインストール

Vagrantfile

VagrantでVitual Machine(VM)を作成するには、設定ファイルであるVagrantfileが必要です。 VMを作成するためのディレクトリを作成して、コマンドを実行

$mkdir vagrant
$cd vagrant 
$vagrant init

これでVagrantfileが作成されます。 次にVagrantfileの編集。

$vim vagrant file

Vagrant.configure("2") do |config|
  # Box
  config.vm.box = "centos/7"
  # 仮想マシンのネットワーク環境設定
  # "private_network"を指定するとホストOSからのみアクセス可
config.vm.network "private_network", ip: "192.168.33.10", auto_config:true
 config.vm.network "forwarded_port", guest: 8888, host: 8888 
  # ホスト側とゲスト側で共有するフォルダ。この場合Vagrantfileが存在するフォルダが/var/www/shareになります。
  config.vm.synced_folder "./", "/var/www/share"

  # プロバイダの指定
  config.vm.provider "virtualbox" do |vb|
    # GUI今回は不使用
    vb.gui = false
    # 仮想マシンの名前
    vb.name = "CentOS"
    # メモリ(MB)
    vb.memory = "2048"
    # CPU
    vb.cpus = 2
  end
end

Boxのインストール

$vagrant box add bento/ubuntu-16.04

Vagrantの起動

起動します。次回からはこれ以降の手順がスタートです。

# 起動
$vagrant up
#仮想環境へ接続
$vagrant ssh

Vagrantのシャットダウン、休止

# シャットダウン
$vagrant halt
# 一時停止
$vagrant suspend

CentOS

ここからはゲストOSでの作業になります。

##firewall停止
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
$ sudo set enforce 0

gitのインストール

$sudo yum -y install git

pyenvのインストール

zshを使用している方は bashrcをzshrcで読み替えてください。

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv  
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc  
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc  
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc  
$ source ~/.bashrc  

anacondaのインストール

# anacondaのバージョン確認
$ pyenv install -l | grep anaconda
# 最新版インストール
$ pyenv install anaconda3-5.2.0
$ pyenv rehash
# anacondaをpythonのデフォルトに設定
$ pyenv global anaconda3-5.2.0
$ echo 'export PATH="$PYENV_ROOT/versions/anaconda3-5.2.0/bin/:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
# condaのアップデート
$ conda update conda

Jupyter notebook

jupyter notebookはノートブックと呼ばれる形式で作成したプログラムを実行し、結果を記録しながらデータの分析を行うことができます。

変数の中身を見たり、デバッグをしたりといったことも簡単に行えるので機械学習の際は超お世話になります。

Anacondaをインストールした段階で、勝手にインストールされているので起動してみましょう。

# --ip=0.0.0.0 はlocalhost以外でのアクセスをする場合に必要。
$ jupyter notebook --no-browser --ip=0.0.0.0
# 起動後はCtrl + c でサーバー停止出来ます。

PC上のブラウザからVagrant上のJupyterへアクセス

Vagrant上のIPアドレスでアクセス
http://192.168.33.10:8888
tokenが必要みたいなことを言われるので、ホストOSで

# Jupiter のlist表示
$ jupiter notebook list

を実行し、tokenを貼り付ける。

サンプルコードの実行

ブラウザの右上に表示されているプルダウンメニューから New -> Python3 を選んで下記のコードを実行

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-10, 10, 1)
y = np.sin(x)
plt.plot(x, y)

f:id:mashi-prog:20180609105713p:plain こんな感じの出力がされたらOKです。 次回は実際に機械学習をやっちゃいます。