I think this is a simple problem but I am kind of stuck here.
I am trying to deploy keras model in Flask. My main propose is to practice api.
But I am getting this error continuously whenever I tried to open given local host id.
Not Found
The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.
Did I miss anything in my code?
I have mentioned my code below:
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)
Actually I am new in Flask. This is my first attempt. I also tried to give app.run(host='0.0.0.0') but didn't work for me. Can I get some help???
This is the log from terminal:
* 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 'implimentation' (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 -
Hoping for some help
Thanks
CodePudding user response:
You should try change @app.route("/submit", methods=["POST"])
to @app.route("/", methods=["POST"])
. That is, remove the submit
. When you run the program, the default location is http://127.0.0.1:5000/, but you are attempting to access http://127.0.0.1:5000/submit.
Either access http://127.0.0.1:5000/submit each time, or remove the submit from the url, which is easier, and access the default location each time.
This answer is fairly similar.
CodePudding user response:
It depends on what you want.
The only route you have is the /submit
POST route.
You are getting that error because you are hitting a /
(GET) route instead of /submit
(POST)
Either add a new route to see your server up and running like so
@app.route("/")
def home():
return 'home'
or using a tool such as postman, hit the /submit
route as a POST request.
Remember also that the port is 5000.
CodePudding user response:
the /submit endpoint is not a regular GET request that you can hit by typing http://localhost:5000/submit.
Its clearly expecting a file upload. Make a dummy frontend with a upload file button, or use Postman to create a Post request with necessary flags to upload a file, and ofcourse, do provide the file path