前半記事「Google AI Platform - Cloud ML Engineを初心者が動かして理解(前編)」では、print文だけのプログラムを動かしました。今回の記事はTensorFlowで簡単な機械学習をします。
公式チュートリアル実行に関しては、記事「Google Cloud ML EngineでTensorFlow機械学習訓練実行」を参照ください。
ファイルの読み書きをしたい場合には、記事「Google AI Platform - Cloud ML EngineとファイルI/O」を参照ください。
環境
前半記事と同じです。
種類 | バージョン | 内容 |
---|---|---|
OS | Ubuntu18.04.01 LTS | 仮想で動かしています |
Google Cloud SDK | 250.0.0 |
前提
前半記事と同じです。
- GCPのアカウントを持っていること
- GCPでプロジェクトを作成済でAPI有効化であること(今回は"aip-test02"というIDで作成しています)
- Google Cloud SDKがインストールされていること
手順
基本的にジョブ実行時のパラメータ以外は前半記事と同じです。今度はTensorFlowを動かすので、python-versionとruntime-versionを指定します。
※「注意すべきパラメータ」参照。
gcloud ai-platform jobs submit training $JOB_NAME \
--job-dir $OUTPUT_PATH \
--module-name trainer.task \
--package-path trainer/ \
--python-version 3.5 \
--runtime-version 1.13 \
実行プログラム
プログラム全体はGitHubに置いています。
推奨プロジェクト構成に準じたディレクトリ構成にしています。ディレクトリ"trainer"に訓練時に必要となる4つのpythonプログラムを入れています("__init__.py"の中身は空です)。
今回のプログラム解説については、別記事「【Keras入門(1)】単純なディープラーニングモデル定義」を参照ください。
.
└── trainer
├── __init__.py
├── model.py
├── task.py
└── util.py
task.py
メインとなるプログラム"task.py"です。"util.load_data"から訓練データ、"model.create_keras_model"からモデルを受け取りfit関数で実行しています。後で気づいたのですが、fit関数でverbose=2に指定した方がログが見やすくなります。
import tensorflow as tf
from . import model
from . import util
def train_and_evaluate():
train_x, train_y = util.load_data()
# Create the Keras Model
keras_model = model.create_keras_model()
keras_model.fit(train_x, train_y, epochs=300, validation_split=0.2)
if __name__ == '__main__':
tf.logging.set_verbosity("INFO")
train_and_evaluate()
util.py
訓練データを乱数で生成しています。通常はここで、Google Storageからデータを読み込んで編集します。
import numpy as np
NUM_TRAIN = 128
def load_data():
data = np.random.rand(NUM_TRAIN, 2)
labels = (np.sum(data, axis=1) > 1.0) * 1
labels = labels.reshape(NUM_TRAIN, 1)
return data, labels
model.py
TensorFlowに統合されたKerasを使ってモデルを定義しています。
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
def create_keras_model():
# Sequentialモデル使用(Sequentialモデルはレイヤを順に重ねたモデル)
model = Sequential()
# 結合層(2層->4層)
model.add(Dense(4, input_dim=2, activation="tanh"))
# 結合層(4層->1層):入力次元を省略すると自動的に前の層の出力次元数を引き継ぐ
model.add(Dense(1, activation="sigmoid"))
# モデルをコンパイル
model.compile(loss="binary_crossentropy", optimizer="sgd", metrics=["accuracy"])
model.summary()
return model