我认为这是一个简单的问题,但我有点被困在这里。
我正在尝试在 Flask 中部署 keras 模型。我的主要建议是练习 API。
但是每当我尝试打开给定的本地主机 ID 时,我都会不断收到此错误。
未找到
在服务器上找不到请求的 URL。如果您手动输入 URL,请检查拼写并重试。
我的代码中遗漏了什么吗?
这是我的代码:
from numpy.lib.twodim_base import tri
import pandas as pd
import numpy as np
import flask
from tensorflow.keras.models import load_model
import joblib
import csv
import codecs
import warnings
def warn(*arg, **kwargs):
pass
warnings.warn = warn
#initialize the flask application
app = flask.Flask(__name__)
#load the pre-trained model
def define_model():
global model
model = load_model('./model/anomaly_model.h5')
return print("Model is loaded")
limit = 10
@app.route("/submit", methods=["POST"])
def submit():
#initialize the data dictionary that will be returned in the response
data_out = {}
#load the data file from our endpoint
if flask.request.method == "POST":
#read the data file
file = flask.request.files['data_file']
if not file:
return "No file submitted"
data = []
stream, = codecs.iterdecode(file.stream, 'utf-8')
for row in csv.reader(stream, dialect=csv.excel):
if row:
data.append(row)
#convert input data to pandas dataframe
df = pd.DataFrame(data)
df.set_index(df.iloc[:, 0], inplace=True)
df2 = df.drop(df.columns[0], axis=1)
df2 = df2.astype(np.float64)
#normalize the data
scaler = joblib.load('./data/combined.csv')
X = scaler.transform(df2)
X = X.reshape(X.shape[0], 1, X.shape[1])
data_out['Analysis'] = []
preds = model.predict(X)
preds = preds.reshape(preds.shape[0], preds.shape[2])
preds = pd.DataFrame(preds, columns=df2.columns)
preds.index = df2.index
scored = pd.DataFrame(index=df2.index)
yhat = X.reshape(X.shape[0], X.reshape[2])
scored['Loss_mae'] = np.mean(np.abs(yhat - preds), axis=1)
scored['Threshold'] = limit
scored['Anomaly'] = scored['Loss_mae'] > scored['threshold']
print(scored)
#determine of an anomaly was detected
triggered = []
for i in range(len(scored)):
temp = scored.iloc[i]
if temp.iloc[2]:
triggered.append(temp)
print(len(triggered))
if len(triggered) > 0:
for j in range(len(triggered)):
out = triggered[j]
result = {"Anomaly": True, "Value":out[0], "filename":out.name}
data_out["Analysis"].append(result)
else:
result = {"Anomaly":"No Anomalies Detected"}
data_out["Analysis"].append(result)
print(data_out)
return flask.jsonify(data_out)
if __name__ == "__main__":
print(("* Loading the Keras model and starting the server ...."
"Please wait until the server has fully started before submitting"))
define_model()
app.run(debug=True)
实际上我是 Flask 的新手。 这是我的第一次尝试。 我还尝试提供 app.run(host='0.0.0.0') 但对我不起作用。我可以寻求帮助吗???
这是来自终端的日志:
* Loading the Keras model and starting the server ....Please wait until the server has fully started before submitting
2021-12-27 16:29:45.158086: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
Model is loaded
* Serving Flask app 'implementation' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Loading the Keras model and starting the server ....Please wait until the server has fully started before submitting
2021-12-27 16:29:49.283527: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
Model is loaded
Model is loaded
* Debugger is active!
* Debugger PIN: 114-980-010
127.0.0.1 - - [27/Dec/2021 16:05:37] "GET / HTTP/1.1" 404 -
127.0.0.1 - - [27/Dec/2021 16:05:38] "GET / HTTP/1.1" 404 -
127.0.0.1 - - [27/Dec/2021 16:05:53] "GET / HTTP/1.1" 404 -
127.0.0.1 - - [27/Dec/2021 16:05:56] "GET / HTTP/1.1" 404 -
希望得到一些帮助
谢谢
您应该尝试将
@app.route("/submit", methods=["POST"])
更改为 @app.route("/", methods=["POST"])
。即删除submit
。当您运行程序时,默认位置是 http://127.0.0.1:5000/,但您尝试访问 http://127.0.0.1:5000/submit。
每次都访问 http://127.0.0.1:5000/submit,或者从 url 中删除提交,这样更容易,并且每次访问默认位置。
这个答案非常相似。
这取决于你想要什么。
您唯一的路线是
/submit
POST 路线。
您收到该错误是因为您正在点击
/
(GET) 路线而不是 /submit
(POST)
添加一条新路由来查看服务器的启动和运行情况
@app.route("/")
def home():
return 'home'
或使用邮递员等工具,以 POST 请求的形式点击
/submit
路由。
另请记住端口是 5000。
/submit 端点不是您可以通过输入 http://localhost:5000/submit 来命中的常规 GET 请求。
它显然正在等待文件上传。使用上传文件按钮制作一个虚拟前端,或者使用 Postman 创建带有必要标志的 Post 请求来上传文件,当然,请提供文件路径