2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Comet.mlからデータをいちいちダウンロードするのは面倒だからPython APIを使う

Last updated at Posted at 2021-11-04

Comet.mlとは?

Comet.mlは機械学習の実験支援ツールの一つです.
詳しい内容については公式ドキュメントで説明されています.

Comet.ml

また,今回はComet.mlのPython APIの使い方をまとめています.
Comet.mlでパラメータやメトリックのログをとりたい場合は以下の記事を参照してください.

なぜPython APIを使うのか

Cometでデータをダウンロードする際,experimentのパネルからデータをexportします.

スクリーンショット 2021-11-04 13.40.09.png

しかし,ダウンロードしたいデータが何個もある場合,毎回ファイル名を変えてダウンロードするのは手間になります.
そこで,簡単にデータを持ってくることが可能な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()

出力は以下の図のようになります.
スクリーンショット 2021-11-03 23.22.03.png

これで必要なデータをダウンロードすることなく,コードを実行することでboxplotが作成できました.

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?