我在一个项目中与Keras合作,Keras不知何故不起作用。
这就是为什么我想用官方项目来测试它,看看会发生什么。官方项目的代码是this
我有一个用于服务项目的烧瓶应用程序,因为它将在EC2实例上。端点看起来如此:
@app.route('/ocr/test_keras', methods=['GET'])
def test_keras():
Thread(target=continue_test_keras, args=()).start()
return jsonify('Success')
def continue_test_keras():
tk.run()
print('tests done')
和tk
看起来如此:
from __future__ import print_function
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop
import tensorflow as tf
GRAPH = tf.get_default_graph()
def run():
with GRAPH.as_default():
...
(我得使用图表,因为我正在使用tensorflow和多线程,请参阅this)
现在奇怪的行为。当它在docker容器内时,最后发生的事情就是这样:
Total params: 669,706
Trainable params: 669,706
Non-trainable params: 0
_________________________________________________________________
before compiling
after compiling
Train on 60000 samples, validate on 10000 samples
Epoch 1/4
代码在这里:
print('before compiling')
model.compile(loss='categorical_crossentropy',
optimizer=RMSprop(),
metrics=['accuracy'])
print('after compiling')
history = model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))
print('after training')
这意味着,它在model.fit
以某种方式与我的项目完全相同,但它不会引发任何错误。它永远不会打印after training
但是,如果我在容器外尝试相同的代码,但使用相同的virtualenv和相同的实例,它会产生:
Total params: 669,706
Trainable params: 669,706
Non-trainable params: 0
_________________________________________________________________
before compiling
after compiling
Train on 60000 samples, validate on 10000 samples
Epoch 1/4
2018-02-27 10:21:46.917107: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
60000/60000 [==============================] - 11s 179us/step - loss: 0.2501 - acc: 0.9235 - val_loss: 0.1126 - val_acc: 0.9653
Epoch 2/4
60000/60000 [==============================] - 11s 178us/step - loss: 0.1032 - acc: 0.9687 - val_loss: 0.1010 - val_acc: 0.9682
Epoch 3/4
60000/60000 [==============================] - 11s 178us/step - loss: 0.0749 - acc: 0.9774 - val_loss: 0.0823 - val_acc: 0.9762
Epoch 4/4
60000/60000 [==============================] - 11s 179us/step - loss: 0.0622 - acc: 0.9818 - val_loss: 0.0799 - val_acc: 0.9784
after training
这就是容器内应该发生的事情。 (我将时期数减少到4,只是为了知道它是否正在处理合适而不是等待那么久)
model.evaluate
也会出现同样的行为。没有错误,但它没有做任何其他事情。
我不知道会发生什么。
我正在关闭这个错误,因为我发现它与docker容器没有关系。我进入了docker容器并在那里执行代码,并且它工作正常。所以,我想这与烧瓶,uwsgi或主管有关。
我从这里尝试了一切:issue 2397(debug=False
,graph as default with tensorflow as well as Keras Backend
,daemon in thread to true
等等),它仍然没有使用tensorflow作为后端。该项目实际上是在uswgi和主管之外使用烧瓶。
编辑
好吧,我会在这里写下答案,因为它更容易。
问题出在uwsgi上。凯拉斯不知何故在那里工作。
我只是按照指示of this github repo,现在它正在工作。