Keras возвращает разные результаты на удаленном сервере - PullRequest
0 голосов
/ 21 марта 2019

Я обучил модель keras и сохранил ее в файле h5. Когда я обычно предсказываю только с помощью load_weights и генератора предсказания, он возвращает высокий auc и различные прогнозы.

import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.convolutional import Conv2D, SeparableConv2D
from keras.layers.pooling import MaxPooling2D, GlobalAveragePooling2D
from keras import backend as K
from keras.layers import Input
from keras.models import Model
import keras
from keras.layers.normalization import BatchNormalization
from keras.optimizers import Adam
import tensorflow as tf
valid_datagen = ImageDataGenerator(rescale=1./255.)
test_datagen = ImageDataGenerator(rescale=1./255.)

valid_generator = valid_datagen.flow_from_directory(
    directory="./valid/",
    target_size=(50, 50),
    color_mode="rgb",
    batch_size=32,
    class_mode="binary",
    shuffle=True,
    seed=42
)
test_generator = test_datagen.flow_from_directory(
    directory="./test/",
    target_size=(50, 50),
    color_mode="rgb",
    batch_size=1,
    class_mode=None,
    shuffle=False,
    seed=42
)

K.clear_session()
K.set_image_dim_ordering('tf')
reg = keras.regularizers.l1_l2(1e-5, 0.0)
def conv_layer(channels, kernel_size, input):
    output = SeparableConv2D(channels, kernel_size, padding='same',kernel_regularizer=reg)(input)
    output = BatchNormalization()(output)
    output = Activation('relu')(output)
    output = Dropout(0)(output)
    return output

input1 = Input(shape=(50, 50, 3))
output = conv_layer(32, (3,  3), input1)
output = MaxPooling2D(pool_size=(2, 2))(output)
output = conv_layer(64, (3,  3), output)
output = MaxPooling2D(pool_size=(2, 2))(output)
output = conv_layer(128, (5,  5), output)
output = MaxPooling2D(pool_size=(2, 2))(output)
output = conv_layer(256, (5,  5), output)
output = MaxPooling2D(pool_size=(2, 2))(output)
output = conv_layer(512, (7,  7), output)
output = MaxPooling2D(pool_size=(2, 2))(output)
output = conv_layer(1024, (7,  7), output)
output = GlobalAveragePooling2D()(output)
output = Dense(1)(output)
output = Activation('sigmoid')(output)

model = Model(inputs=input1, outputs=output)


def auc(y_true, y_pred):
    auc = tf.metrics.auc(y_true, y_pred)[1]
    K.get_session().run(tf.local_variables_initializer())
    return auc

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


STEP_SIZE_VALID=valid_generator.n/valid_generator.batch_size
STEP_SIZE_TEST=test_generator.n/test_generator.batch_size

model.load_weights('model.h5')
model.evaluate_generator(generator=valid_generator, steps = STEP_SIZE_VALID
)

test_generator.reset()
model._make_predict_function()
pred=model.predict_generator(test_generator,steps = STEP_SIZE_TEST, verbose=1)
np.set_printoptions(threshold=np.nan)
print(pred)
print(test_generator.filenames)
f = open("demofile.txt", "a")
f.write(str(pred))
f.write(str(test_generator.filenames))

Однако, когда я сохраняю этот файл h5 на удаленном сервере и пытаюсь получить прогнозы, все запросы возвращаются как 1.0.

import flask
import pandas as pd
import tensorflow as tf
import keras
from keras.models import load_model
from keras.preprocessing.image import img_to_array
from keras.applications import imagenet_utils
from PIL import Image
import numpy as np
import flask
import io
import sys

# instantiate flask
app = flask.Flask(__name__)
def prepare_image(image, target):
    # if the image mode is not RGB, convert it
    if image.mode != "RGB":
        image = image.convert("RGB")

    # resize the input image and preprocess it
    image = image.resize(target)
    image = img_to_array(image)
    image = np.expand_dims(image, axis=0)
    image = imagenet_utils.preprocess_input(image)

    # return the processed image
    return image
# we need to redefine our metric function in order
# to use it when loading the model
def auc(y_true, y_pred):
   auc = tf.metrics.auc(y_true, y_pred)[1]
   keras.backend.get_session().run(tf.local_variables_initializer())
   return auc

# load the model, and pass in the custom metric function

global graph
graph = tf.get_default_graph()
model = load_model('new.h5', custom_objects={'auc': auc})

# define a predict function as an endpoint
@app.route("/predict", methods=["GET","POST"])
def predict():
    data = {"success": False}
    params = flask.request.files["image"].read()
    if (params == None):
        params = flask.request.args

    # if parameters are found, return a prediction
    if (params != None):
        image = params
        image = Image.open(io.BytesIO(image))

        # preprocess the image and prepare it for classification
        image = prepare_image(image, target=(50, 50))

        # classify the input image and then initialize the list
        # of predictions to return to the client
        print(image)

        with graph.as_default():
            preds = model.predict(image)
            data["prediction"] = str(preds[0][0])
            data["success"] = True

    # return a response in json format
    return flask.jsonify(data)

# start the flask app, allow remote connections
app.debug=True
app.run(host='0.0.0.0')

У вас есть идеи, почему это происходит?

...