【问题标题】:How to simply load a ML model without retraining it?如何在不重新训练的情况下简单地加载 ML 模型?
【发布时间】:2020-09-13 18:02:10
【问题描述】:

我在 30,000 张图像上训练了一个 CNN,并希望加载该模型。该模型被命名为“emotion_recognition_model.h5”。每次我尝试调用模型时,它都会开始重新训练。如何在不重新训练的情况下加载它?下面是训练模型的代码:

from __future__ import print_function
import keras
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten, BatchNormalization
from keras.layers import Conv2D, MaxPooling2D
from keras.preprocessing.image import ImageDataGenerator
import os
from keras.models import Sequential
from keras.layers.normalization import BatchNormalization
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.layers.advanced_activations import ELU
from keras.layers.core import Activation, Flatten, Dropout, Dense
from keras.optimizers import RMSprop, SGD, Adam
from keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau
from keras import regularizers
from keras.regularizers import l1

num_classes = 7
img_rows, img_cols = 48, 48
batch_size = 512

train_data_dir = "/Users/../Behavior/images/train"
validation_data_dir = "/Users/../Behavior/images/validation"


val_datagen = ImageDataGenerator(rescale=1./255)
train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=30,
    shear_range=0.3,
    zoom_range=0.3,
    horizontal_flip=True,
    fill_mode='nearest'
)
train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(48, 48),
    batch_size=batch_size,
    color_mode="grayscale",
    class_mode="categorical"
)
validation_generator = val_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(48, 48),
    batch_size=batch_size,
    color_mode="grayscale",
    class_mode="categorical"
)

print(validation_generator.class_indices)

class_labels = validation_generator.class_indices
class_labels = {v: k for k, v in class_labels.items()}
classes = list(class_labels.values())
print(class_labels)

model = Sequential()

model.add(Conv2D(32, kernel_size=(3, 3), activation='relu',kernel_regularizer=regularizers.l2(0.0001),input_shape=(48,48,1)))
model.add(BatchNormalization())

model.add(Conv2D(64, kernel_size=(3, 3), activation='relu',kernel_regularizer=regularizers.l2(0.0001)))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, kernel_size=(3, 3), activation='relu', kernel_regularizer=regularizers.l2(0.0001)))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, kernel_size=(3, 3), activation='relu', kernel_regularizer=regularizers.l2(0.0001)))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))


model.add(Conv2D(7, kernel_size=(1, 1), activation='relu', kernel_regularizer=regularizers.l2(0.0001)))
model.add(BatchNormalization())

model.add(Conv2D(7, kernel_size=(4, 4), activation='relu', kernel_regularizer=regularizers.l2(0.0001)))
model.add(BatchNormalization())

model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(7, activation='softmax'))

model.add(Activation("softmax"))

filepath = os.path.join("./emotion_detector_models/model_v6_{epoch}.hdf5")

checkpoint = keras.callbacks.ModelCheckpoint("best_model.hdf5",
                                             monitor='val_accuracy',
                                             verbose=1,
                                             save_best_only=True,
                                             mode='max')
callbacks = [checkpoint]
model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.0001, decay=1e-6), metrics=['accuracy'])
nb_train_samples = 28709
nb_validation_samples = 3589
epochs = 150
model_info = model.fit(
            train_generator,
            steps_per_epoch=nb_train_samples // batch_size,
            epochs=epochs,
            callbacks=callbacks,
            validation_data=validation_generator,
            validation_steps=nb_validation_samples // batch_size)


model.save('emotion_recognition_model.h5')
print("Saved model")

使用上述代码进行训练需要 24 多个小时,所以我希望能够简单地加载模型。这是我尝试加载模型的代码:

from emotion_recognition_model_file import train_generator, class_labels
from keras.models import load_model
import cv2
import numpy as np
from time import sleep
from keras.preprocessing.image import img_to_array

face_classifier = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

try:
    classifier = load_model("/Users/TomSmith/Desktop/Vrify/DELPHI/Behavior/emotion_recognition_model.h5")
except:
    try:
        classifier = load_model("/Users/TomSmith/Desktop/Vrify/DELPHI/Behavior/best_model.hdf5")
    except:
        print('e')

eye_cascade = cv2.CascadeClassifier("/Users/TomSmith/Desktop/Vrify/DELPHI/Behavior/haarcascade_eye.xml")


def face_detector(img):
    # Convert image to grayscale
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_classifier.detectMultiScale(gray, 1.3, 5)
    if faces == ():
        return (0, 0, 0, 0), np.zeros((48, 48), np.uint8), img

    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
        roi_gray = gray[y:y + h, x:x + w]
        roi_color = img[y:y + h, x:x + w]
        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex, ey, ew, eh) in eyes:
            cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)

    try:
        roi_gray = cv2.resize(roi_gray, (48, 48), interpolation=cv2.INTER_AREA)

    except:
        return (x,w,y,h), np.zeros((48, 48), np.uint8), img
    return (x,w,y,h), roi_gray, img

cap = cv2.VideoCapture(0)

while True:

    ret, frame = cap.read()
    rect, face, image = face_detector(frame)
    if np.sum([face]) != 0.0:
        roi = face.astype("float") / 255.0
        roi = img_to_array(roi)
        roi = np.expand_dims(roi, axis=0)

        # make a prediction on the ROI, then lookup the class
        preds = classifier.predict(roi)[0]
        label = class_labels[preds.argmax()]
        label_position = (rect[0] + int((rect[1] / 2)), rect[2] + 25)
        cv2.putText(image, label, label_position, cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 3)
    else:
        cv2.putText(image, "No Face Found", (20, 60), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 3)

    cv2.imshow('All', image)
    if cv2.waitKey(1) == 13:  # 13 is the Enter Key
        break

cap.release()
cv2.destroyAllWindows()

我还将为 cv2 代码添加线程,但我不能简单地加载模型。我该怎么办?

编辑: 我怎么知道它是再培训的截图

【问题讨论】:

  • 你认为它为什么会被重新训练?
  • @AniketBote 它再次开始训练过程(即 epoch 1/150)
  • 如果您运行第一部分,模型将开始训练。评论model.fit() 或为第二部分使用单独的文件。据我所知,您可以在代码的第二部分使用不同的文件,而不会出现任何问题。
  • 不!训练模型后,您不必使用model.fit()。只需创建一个新文件并将第二部分的代码复制粘贴到该文件中并运行该文件。
  • @AniketBote 我已经这样做了。我的目录中有模型。我只需要加载它并使其适合实时数据

标签: python machine-learning model computer-vision


【解决方案1】:

我不知道你想问“如何在训练后保存模型?”,对吧? 我看到您使用 Keras(您选择 Tensorflow 作为其后端)来训练您的模型。所以也许你可以使用

from keras.model import load_model
# save model,assuming "model" is the name of the your instance,give a name as parameter
model.save("name.h5")
#load model
model = load_model("name.h5")

也许您也可以使用一些来自 Tensorflow 而不是 Keras 的方法来满足您的需求。我不确定。 希望对您有所帮助,祝您好运!

【讨论】:

  • 这不起作用。我已经试过了。不过,感谢您的尝试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
  • 2018-12-22
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
相关资源
最近更新 更多