EnsekiTT Blog

EnsekiTTが書くブログです。

ChainerのExtensionを作って途中経過をツイートするようにした話。

つまりなにしたの?

学習している間、自宅にいるとは限らないので途中経過を適宜ツイート(なんかしらのAPIたたいてレポート飛ばしたい)したいって
思ったのでExtensionを作ってみた。

f:id:ensekitt:20171110020013j:plain


*1

ChainerのExtensionとは?

ChainerのTrainerを実行している途中に適宜実行してくれる素敵な拡張機能
Trainer extensions — Chainer 3.0.0 documentation

Chainerで用意されているものについては昔一通り動かしてみた。
ensekitt.hatenablog.com

自分のExtensionがほしい!

というわけで、Twitterに学習状況をツイートするExtensionを作ってみた。

Twitterの設定部分

import os
import twitter
TOKEN = os.environ["DTA_TWITTER_TOKEN"]
TOKEN_SECRET = os.environ["DTA_TWITTER_TOKEN_SECRET"]
CONSUMER_KEY = os.environ["DTA_TWITTER_CONSUMER_KEY"]
CONSUMER_SECRET = os.environ["DTA_TWITTER_CONSUMER_SECRET"]

twi = Twitter(
  auth = OAuth(TOKEN, TOKEN_SECRET, CONSUMER_KEY, CONSUMER_SECRET))

環境変数TwitterアプリのTokenとかコンシューマキーとかを登録してある。
exportして対応する。

Extensionの部分

def myTweetExtension(target_epoch, _log_report='LogReport'):
    @training.make_extension()
    def tweet(trainer):
        print("My Extension!!") #これはテキストを標準出力する
        log_report = trainer.get_extension(_log_report) #Log Reportの情報を拾ってくる
        if len(log_report.log) > 0:
            plog = log_report.log[len(log_report.log)-1] # 最新のログをひろう
            e = plog['epoch']
            te = target_epoch
            ls = round(plog['main/loss'], 6)
            t = round(plog['elapsed_time'],2)
            status = "インテリジェントなスーパーAI「えぽっく:{0}/{1}, ろす:{2}, じかん:{3}[s]」".format(e,te,ls,t) #整形する
            res = twi.statuses.update(status=status) # ツイートする
    return tweet

Trainerに追加する部分

# 自分で作ったエクステンション
interval = (50, 'epoch') # インターバルを50Epochに1回に設定
trainer.extend(myTweetExtension(epoch), trigger=interval)

その他のコード(Jupyter Notebook)

github.com

ツイート出来ました