ゲームAI備忘録

ゲームAIに使えそうな知識を備忘録として書き留める

人助けと思って何卒インストールをば! 詰碁/ アルコネ/ 五目並べ

slackbot経由でkerasを利用しようとした際にバグってしまう問題の回避策

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
from slackbot.bot import Bot, listen_to
from keras.layers import Dense, Activation
from keras.models import Sequential

# 適当なモデル
model = Sequential()
model.add(Dense(output_dim=64, input_dim=100))
model.add(Activation("relu"))
model.add(Dense(output_dim=10))
model.add(Activation("softmax"))
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])

@listen_to('Hi')
def hello(message):
    X = np.random.random((10, 100))
    y_pred = model.predict_proba(X, batch_size=32)
    message.reply('Hi!')

def run():
    bot = Bot()
    bot.run()

if __name__ == "__main__":
    run()

"Hi"と送ると下記エラーが発生し上手く返答してくれない.

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/slackbot/dispatcher.py", line 55, in _dispatch_msg_handler
    func(Message(self._client, msg), *args)
  File "run.py", line 20, in hello
    y_pred = model.predict_proba(X, batch_size=32)
  File "/usr/local/lib/python2.7/site-packages/keras/models.py", line 546, in predict_proba
    preds = self.predict(x, batch_size, verbose)
  File "/usr/local/lib/python2.7/site-packages/keras/models.py", line 459, in predict
    return self.model.predict(x, batch_size=batch_size, verbose=verbose)
  File "/usr/local/lib/python2.7/site-packages/keras/engine/training.py", line 1123, in predict
    self._make_predict_function()
  File "/usr/local/lib/python2.7/site-packages/keras/engine/training.py", line 702, in _make_predict_function
    **kwargs)
  File "/usr/local/lib/python2.7/site-packages/keras/backend/tensorflow_backend.py", line 677, in function
    return Function(inputs, outputs, updates=updates)
  File "/usr/local/lib/python2.7/site-packages/keras/backend/tensorflow_backend.py", line 651, in __init__
    with tf.control_dependencies(self.outputs):
  File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 3342, in control_dependencies
    return get_default_graph().control_dependencies(control_inputs)
  File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 3132, in control_dependencies
    c = self.as_graph_element(c)
  File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2322, in as_graph_element
    return self._as_graph_element_locked(obj, allow_tensor, allow_operation)
  File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2401, in _as_graph_element_locked
    raise ValueError("Tensor %s is not an element of this graph." % obj)
ValueError: Tensor Tensor("Softmax:0", shape=(?, 10), dtype=float32) is not an element of this graph.

おそらくtensorflowのpredictを呼び出すアプリケーション部分が立ち上がっていない事が原因で,事前に無理やり呼び出してあげれば解決する.
下記例では,run()関数部分で事前に呼び出しています.これなら,Hiと返答してくれます.
nginxとかならlazy-appsオプションを設定することで事前に呼び出さなくても回避できます.

...

def run():
    # 事前に適当に呼び出しておく
    X = np.zeros((10, 100))
    model.predict_proba(X, batch_size=32)

    bot = Bot()
    bot.run()

...