部署机器学习模型 Flask 和 REST API

时间:2020-12-29 16:00:32

标签: python numpy tensorflow keras

首先,我是机器学习的新手。 我正在尝试创建一个 REST API,它利用带有 Flask 的机器学习模型。

应用程序 当用户在文本框中输入速度值并按下按钮时,他们将获得由风速产生的预测功率。 我已经创建了模型并将其导入到网络服务中。

问题 当我输入一个值并按下按钮时,我收到以下错误“索引 0 超出了轴 0 的范围,大小为 0”。

我用谷歌搜索了 NumPy.amax() 并找不到任何有用的东西我也在互联网上搜索了几个小时寻找答案,但找不到任何东西。

请参阅下面的模型代码和下面的网络服务代码:

提前感谢您的帮助。

型号代码

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.python.keras import utils
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split

COLUMN_NAMES = ['Speed', 'Power']
df = pd.read_csv(
    "https:///powerproduction.csv",
    names = COLUMN_NAMES, header = 0 )

X = dataset[:,0:1]
Y = dataset[:,1]

min_max_scaler = preprocessing.MinMaxScaler()
X_scale = min_max_scaler.fit_transform(X)

X_train, X_val_and_test, Y_train, Y_val_and_test = train_test_split(X_scale, Y, test_size=0.3)
X_val, X_test, Y_val, Y_test = train_test_split(X_val_and_test, Y_val_and_test, test_size=0.5)

print(X_train.shape, X_val.shape, X_test.shape, Y_train.shape, Y_val.shape, Y_test.shape)

model = Sequential([   
Dense(32, activation='relu', input_shape=(1,)),    
Dense(32, activation='relu'),    
Dense(1, activation='sigmoid'),])

model.compile(optimizer='sgd', 
loss='binary_crossentropy',              
metrics=['accuracy'])

hist = model.fit(X_train, Y_train,        
batch_size=32, epochs=200,          
validation_data=(X_val, Y_val))


scores = model.evaluate(X_test, Y_test)[1]
model.save('model.h5')
print("Saved model" )

网络服务

# adapted from: https://flask.palletsprojects.com/en/1.1.x/quickstart/#a-minimal-application

from flask import Flask, request, jsonify, render_template
import tensorflow as tf
import numpy as np
from tensorflow.keras import backend
from tensorflow.keras.models import load_model

app = Flask(__name__)


@app.before_first_request
def load_model_to_app():
    app.predictor = load_model('model.h5')


@app.route('/')
def index():
    return render_template('index.html', pred=0)


@app.route('/predict', methods=['POST'])
def predict():
    data = [request.form['speed']]

    data = np.array([np.asarray(data, dtype=float)])

    predictions = app.predictor.predict(data)
    print('INFO Predictions: {}'.format(predictions))

    class_ = np.where(predictions == np.amax(predictions, axis=1))[1][0]

    return render_template('index.html', pred=class_)


def main():
    """Run the app."""
    app.run(host='0.0.0.0', port=8000, debug=False)  # nosec


if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:1)

我建议检查您的数据结构。 Numpy 索引错误的根源在于数据矩阵结构问题。

您可以查看此 blog post。它解释了 Keras 部署案例。