Comet.mlとは?
Comet.mlは機械学習の実験支援ツールの一つです.
詳しい内容については公式ドキュメントで説明されています.
Comet.ml
また,今回はComet.mlのPython APIの使い方をまとめています.
Comet.mlでパラメータやメトリックのログをとりたい場合は以下の記事を参照してください.
なぜPython APIを使うのか
Cometでデータをダウンロードする際,experimentのパネルからデータをexportします.
しかし,ダウンロードしたいデータが何個もある場合,毎回ファイル名を変えてダウンロードするのは手間になります.
そこで,簡単にデータを持ってくることが可能なPython APIを使ってデータを取得しグラフを作成します.
Comet.mlのPython APIの公式ドキュメント
流れ
- 自身のAPIキーで個人用ワークスペースを取得
- ワークスペースから条件を選んでexperimentを取得
- boxplotの作成
自身のAPIキーで個人用ワークスペースを取得
追加で必要なライブラリをインポートします.
from comet_ml import API
そしてAPIキーで個人用ワークスペースを取得します
api = API(api_key="API_KEY")
API_KEYの部分は自身のマイページから確認し,そのキーを代入してください.
ワークスペース内から条件を選んでexperimentを取得
まず初めに,シンプルなexperimentの取得方法を示します.
experiment = api.get_experiment("WORKSPACE", "PROJECT_NAME", "EXPERIMENT_KEY")
これでは毎回,取得したいexperimentのEXPERIMENT_KEY
を入力しなければならく面倒である.
そこで,タグやパラメータを指定してexperimentを取得する方法を示します.
まず,タグとパラメータで条件を指定するので必要なライブラリをインポートします.
from comet_ml.query import Tag
from comet_ml.query import Parameter
MetricやMetadataなどもありますが,今回は使わないので,インポートしていません.
必要に応じて同様にインポートしてください.
ここで,score
というタグとcompression_rate
というパラメータを持ち,compression_rate
が100である時をqueryに定義します.
定義したqueryを条件にexperiments
を取得します.
出力結果より,得られたexperiments
はリストの形をしていることが分かります.
tagged = Tag("score")
compression_rate_params = Parameter('compression_rate')
query = ((compression_rate_params == 100) & tagged)
experiments = api.query("WORKSPACE", "PROJECT_NAME", query)
print(experiments)
# 出力
[<APIExperiment 'WORKSPACE/PROJECT_NAME/EXPERIMENT_KEY(例:3fb027ebdcc....)'>]
ここで,score
というタグとcompression_rate
というパラメータを持ち,その値が100である時をqueryに定義する.
定義したqueryを条件にexperiments
を取得する.
出力結果より,得られたexperiments
はリストの形をしています.
boxplotの作成
今回は,metricとしてログを残したssimのboxplotを作成したいと思います.
experiments
内のssim
を取得します.
ssim_list = experiments[0].get_metrics("ssim")
print(ssim_list)
# 出力
[{'epoch': None,
'metricName': 'ssim',
'metricValue': '0.9977576459186188',
'offset': 92,
'runContext': None,
'step': 0,
'timestamp': 1635487567854},
{'epoch': None,
'metricName': 'ssim',
'metricValue': '0.9976428612529257',
'offset': 107,
'runContext': None,
'step': 3,
'timestamp': 1635487568711},
{'epoch': None,
.
.
.
このようにssim
で指定すると,ssim値やstep値がdict形式のリストで返されるので,1個ずつ値を取得していきます.
ssim_score = ssim_list[0].get("metricValue")
print(ssim_score)
type(ssim_score)
# 出力
0.9977576459186188
str
このようにして得られた値を1つずつリストに追加していき,boxplotを作成します.
その前にここで得られる値は文字列となっているので,今回はfloatに変換し,boxplotを作成します.
実行するコード (notebookの場合)を以下に示します.
import comet_ml
import matplotlib.pyplot as plt
from comet_ml.query import Tag
from comet_ml.query import Parameter
from comet_ml import API
%matplotlib inline
api = API(api_key="API_KEY")
ssim_0_100_list = []
for i in range(11):
compression_rate = i * 10
print(compression_rate)
tagged = Tag("score")
compression_rate_params = Parameter('compression_rate')
query = ((compression_rate_params == compression_rate) & tagged)
experiments = api.query("WORKSPACE", "PROJECT_NAME", query)
ssim_list = experiments[0].get_metrics("ssim")
exec_command_ssim_list = 'ssim_' + str(compression_rate) + '= []'
exec(exec_command_ssim_list)
for j in range(len(ssim_list)):
ssim_score = ssim_list[j].get("metricValue")
exec_command_ssim_append = 'ssim_' + str(compression_rate) + '.append(ssim_score)'
exec(exec_command_ssim_append)
exec_command_ssim = 'ssim_0_100_list.append(ssim_' + str(compression_rate) + ')'
exec(exec_command_ssim)
# boxplot作成
labels = list(range(0, 110, 10))
colors = ["red", "green", "blue", "black" , "yellow" , "violet", "cyan", "gray", "coral", "indianred", "lime", "magenta"]
boxplt = plt.boxplot(ssim_0_100_list, labels=labels, showfliers=False, patch_artist=True)
plt.xlabel('compression_rate')
plt.ylabel('ssim')
plt.title('ssim')
for b, c in zip(boxplt['boxes'], colors):
b.set(color=c, linewidth=1) # boxの外枠の色
b.set_facecolor(c)
plt.show()
これで必要なデータをダウンロードすることなく,コードを実行することでboxplotが作成できました.