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() ...