กำลังโหลดโมเดล Keras ที่ผ่านการฝึกอบรมแล้วทำการฝึกต่อไป


102

ฉันสงสัยว่าเป็นไปได้หรือไม่ที่จะบันทึกโมเดล Keras ที่ผ่านการฝึกอบรมแล้วบางส่วนและทำการฝึกต่อหลังจากโหลดโมเดลอีกครั้ง

เหตุผลนี้คือฉันจะมีข้อมูลการฝึกอบรมมากขึ้นในอนาคตและฉันไม่ต้องการฝึกโมเดลทั้งหมดอีกครั้ง

ฟังก์ชั่นที่ฉันใช้คือ:

#Partly train model
model.fit(first_training, first_classes, batch_size=32, nb_epoch=20)

#Save partly trained model
model.save('partly_trained.h5')

#Load partly trained model
from keras.models import load_model
model = load_model('partly_trained.h5')

#Continue training
model.fit(second_training, second_classes, batch_size=32, nb_epoch=20)

แก้ไข 1: เพิ่มตัวอย่างการทำงานอย่างสมบูรณ์

ด้วยชุดข้อมูลแรกหลังจาก 10 ยุคความสูญเสียของยุคสุดท้ายจะเท่ากับ 0.0748 และความแม่นยำ 0.9863

หลังจากบันทึกการลบและโหลดโมเดลใหม่แล้วการสูญเสียและความแม่นยำของโมเดลที่ฝึกในชุดข้อมูลที่สองจะเป็น 0.1711 และ 0.9504 ตามลำดับ

เกิดจากข้อมูลการฝึกอบรมใหม่หรือจากรูปแบบการฝึกอบรมใหม่ทั้งหมดหรือไม่

"""
Model by: http://machinelearningmastery.com/
"""
# load (downloaded if needed) the MNIST dataset
import numpy
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import np_utils
from keras.models import load_model
numpy.random.seed(7)

def baseline_model():
    model = Sequential()
    model.add(Dense(num_pixels, input_dim=num_pixels, init='normal', activation='relu'))
    model.add(Dense(num_classes, init='normal', activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

if __name__ == '__main__':
    # load data
    (X_train, y_train), (X_test, y_test) = mnist.load_data()

    # flatten 28*28 images to a 784 vector for each image
    num_pixels = X_train.shape[1] * X_train.shape[2]
    X_train = X_train.reshape(X_train.shape[0], num_pixels).astype('float32')
    X_test = X_test.reshape(X_test.shape[0], num_pixels).astype('float32')
    # normalize inputs from 0-255 to 0-1
    X_train = X_train / 255
    X_test = X_test / 255
    # one hot encode outputs
    y_train = np_utils.to_categorical(y_train)
    y_test = np_utils.to_categorical(y_test)
    num_classes = y_test.shape[1]

    # build the model
    model = baseline_model()

    #Partly train model
    dataset1_x = X_train[:3000]
    dataset1_y = y_train[:3000]
    model.fit(dataset1_x, dataset1_y, nb_epoch=10, batch_size=200, verbose=2)

    # Final evaluation of the model
    scores = model.evaluate(X_test, y_test, verbose=0)
    print("Baseline Error: %.2f%%" % (100-scores[1]*100))

    #Save partly trained model
    model.save('partly_trained.h5')
    del model

    #Reload model
    model = load_model('partly_trained.h5')

    #Continue training
    dataset2_x = X_train[3000:]
    dataset2_y = y_train[3000:]
    model.fit(dataset2_x, dataset2_y, nb_epoch=10, batch_size=200, verbose=2)
    scores = model.evaluate(X_test, y_test, verbose=0)
    print("Baseline Error: %.2f%%" % (100-scores[1]*100))

3
คุณได้ทดสอบหรือไม่? ฉันไม่เห็นเหตุผลที่จะไม่ทำงาน
maz

สิ่งที่ฉันเห็นตอนนี้คือความแม่นยำของฉันลดลงประมาณ 10 เปอร์เซ็นต์หลังจากโหลดโมเดล (เฉพาะในยุคแรก) หากการโหลดซ้ำเกิดขึ้นแน่นอนว่าเกิดจากข้อมูลการฝึกอบรมใหม่ แต่ฉันแค่อยากให้แน่ใจว่าเป็นอย่างนั้นจริงๆ
Wilmar van Ommeren

7
คุณกำลังบันทึกโมเดลของคุณโดยตรงด้วย model.save หรือคุณกำลังใช้จุดตรวจโมเดล ( keras.io/callbacks/#example-model-checkpoints )? หากคุณใช้ model.save จะมีโอกาสที่คุณจะบันทึกโมเดลล่าสุด (เช่นยุคสุดท้าย) แทนที่จะเป็นรุ่นที่ดีที่สุด (ข้อผิดพลาดต่ำสุด) หรือไม่? คุณสามารถระบุรหัสจริงได้หรือไม่?
maz

ฉันกำลังประหยัดโมเดลล่าสุดไม่ใช่รุ่นที่ดีที่สุด (จนถึงจุดนี้ฉันไม่รู้ว่าเป็นไปได้) ฉันจะเตรียมรหัส
Wilmar van Ommeren

3
คุณไม่สามารถโหลดซ้ำและฝึกอบรมข้อมูลรถไฟเดิมต่อไปได้หรือไม่? สิ่งนี้จะทำให้คุณมั่นใจได้ว่าการโหลดซ้ำนั้นใช้ได้หากผลลัพธ์จะเทียบเคียงได้
Marcin Możejko

คำตอบ:


36

อันที่จริง - model.saveบันทึกข้อมูลทั้งหมดที่จำเป็นสำหรับการเริ่มการฝึกอบรมในกรณีของคุณใหม่ สิ่งเดียวที่อาจทำให้เสียจากการโหลดโมเดลใหม่คือสถานะเครื่องมือเพิ่มประสิทธิภาพของคุณ หากต้องการตรวจสอบให้ลองsaveโหลดแบบจำลองใหม่และฝึกอบรมเกี่ยวกับข้อมูลการฝึกอบรม


1
@ Marcin: เมื่อใช้ keras save()มันจะบันทึกผลลัพธ์ที่ดีที่สุด (การสูญเสียต่ำสุด) ของโมเดลหรือผลลัพธ์สุดท้าย (การอัปเดตล่าสุด) ของโมเดลหรือไม่? ขอบคุณ
Lion Lai

5
การปรับปรุงครั้งล่าสุด. การเรียกกลับแบบจำลองจุดตรวจสอบเพื่อบันทึกสิ่งที่ดีที่สุด
โฮลี

2
@ ขจคุณหมายถึงkeras.io/callbacks/#modelcheckpointนี้หรือเปล่า? ดูเหมือนว่าโดยค่าเริ่มต้นจะบันทึกการอัปเดตล่าสุด (ไม่ใช่การอัปเดตที่ดีที่สุด) สิ่งที่ดีที่สุดจะถูกบันทึกไว้save_best_only=Trueก็ต่อเมื่อตั้งค่าไว้อย่างชัดเจน
flow2k

9

คำตอบข้างต้นส่วนใหญ่ครอบคลุมประเด็นสำคัญ หากคุณใช้ Tensorflow ล่าสุด ( TF2.1หรือสูงกว่า) ตัวอย่างต่อไปนี้จะช่วยคุณได้ ส่วนโมเดลของโค้ดมาจากเว็บไซต์ Tensorflow

import tensorflow as tf
from tensorflow import keras
mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

def create_model():
  model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(512, activation=tf.nn.relu),  
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10, activation=tf.nn.softmax)
    ])

  model.compile(optimizer='adam', loss='sparse_categorical_crossentropy',metrics=['accuracy'])
  return model

# Create a basic model instance
model=create_model()
model.fit(x_train, y_train, epochs = 10, validation_data = (x_test,y_test),verbose=1)

โปรดบันทึกโมเดลในรูปแบบ * .tf จากประสบการณ์ของฉันหากคุณกำหนด custom_loss รูปแบบ * .h5 จะไม่บันทึกสถานะเครื่องมือเพิ่มประสิทธิภาพและด้วยเหตุนี้จะไม่ตอบสนองวัตถุประสงค์ของคุณหากคุณต้องการฝึกโมเดลใหม่จากจุดที่เราทิ้งไว้

# saving the model in tensorflow format
model.save('./MyModel_tf',save_format='tf')


# loading the saved model
loaded_model = tf.keras.models.load_model('./MyModel_tf')

# retraining the model
loaded_model.fit(x_train, y_train, epochs = 10, validation_data = (x_test,y_test),verbose=1)

วิธีนี้จะเริ่มต้นการฝึกอบรมที่เราออกก่อนบันทึกโมเดล เป็นที่กล่าวถึงโดยคนอื่น ๆ ถ้าคุณต้องการที่จะบันทึกน้ำหนักของรูปแบบที่ดีที่สุดหรือคุณต้องการที่จะบันทึกน้ำหนักของรูปแบบยุคทุกครั้งที่คุณต้องใช้ฟังก์ชัน keras เรียกกลับ (ModelCheckpoint) กับตัวเลือกเช่นsave_weights_only=True, และsave_freq='epoch'save_best_only

สำหรับรายละเอียดเพิ่มเติมโปรดตรวจสอบที่นี่และอีกตัวอย่างหนึ่งที่นี่


1
ดีนี่ดูมีแนวโน้มมาก - ขอบคุณสำหรับข้อมูล ในตัวอย่างนี้สำหรับฉันแล้วดูเหมือนว่าคุณกำลังฝึกโมเดลใหม่โดยใช้ข้อมูลเดียวกับที่ใช้ในการฝึกอบรม ถ้าเป็นเช่นนั้นฉันคิดว่าแนวทางที่ถูกต้องคือการโหลดข้อมูลการฝึกอบรมชุดย่อยใหม่เพื่อฝึกอบรมอีกครั้ง (เพื่อสะท้อนข้อมูลใหม่ที่จะนำไปใช้ในกระบวนการ)?
bibzzzz

1
@bibzzzz เห็นด้วยกับคุณ แสดงความคิดเห็นได้ดีมาก. ฉันต้องการแสดงให้เห็นถึงการฝึกอบรมข้อมูลเดิมซ้ำเพื่อปรับปรุงประสิทธิภาพ ส่วนสำคัญแสดงให้เห็นอย่างชัดเจนถึงการปรับปรุงประสิทธิภาพที่หยุดทำงานก่อนบันทึกโมเดล ฉันเห็นด้วยอย่างยิ่งกับคุณในการฝึกอบรมข้อมูลต่างๆอีกครั้งและจะลองใช้ในภายหลัง ขอบคุณ!
Vishnuvardhan Janapati

1
ยอดเยี่ยม - คุณได้แสดงให้เห็นแล้วอย่างดีขอบคุณ
bibzzzz

8

ปัญหาอาจเกิดจากคุณใช้เครื่องมือเพิ่มประสิทธิภาพอื่นหรืออาร์กิวเมนต์อื่นกับเครื่องมือเพิ่มประสิทธิภาพของคุณ ฉันเพิ่งมีปัญหาเดียวกันกับโมเดลที่กำหนดเองล่วงหน้าโดยใช้

reduce_lr = ReduceLROnPlateau(monitor='loss', factor=lr_reduction_factor,
                              patience=patience, min_lr=min_lr, verbose=1)

สำหรับแบบจำลองก่อนการฝึกอบรมโดยที่อัตราการเรียนรู้เดิมเริ่มต้นที่ 0.0003 และในระหว่างการฝึกอบรมล่วงหน้าจะลดลงเป็นอัตราการเรียนรู้ขั้นต่ำซึ่งเท่ากับ 0.000003

ฉันเพิ่งคัดลอกบรรทัดนั้นไปยังสคริปต์ซึ่งใช้โมเดลที่ได้รับการฝึกฝนมาก่อนและได้รับความแม่นยำที่ไม่ดีจริงๆ จนกระทั่งฉันสังเกตเห็นว่าอัตราการเรียนรู้สุดท้ายของรูปแบบการฝึกล่วงหน้าคืออัตราการเรียนรู้ขั้นต่ำคือ 0.000003 และถ้าฉันเริ่มต้นด้วยอัตราการเรียนรู้นั้นฉันจะได้รับความแม่นยำเหมือนกันทุกประการในการเริ่มต้นด้วยผลลัพธ์ของแบบจำลองที่ได้รับการฝึกฝนมาก่อนซึ่งก็สมเหตุสมผลเช่นเดียวกับการเริ่มต้นด้วยอัตราการเรียนรู้ที่ใหญ่กว่าอัตราการเรียนรู้สุดท้ายที่ใช้ใน pretrained ถึง 100 เท่า แบบจำลองจะส่งผลให้ GD มีขนาดใหญ่เกินไปและด้วยเหตุนี้ความแม่นยำจึงลดลงอย่างมาก


2

ขอให้สังเกตว่า Keras บางครั้งมีปัญหาเกี่ยวกับรูปแบบการโหลดในขณะที่ที่นี่ สิ่งนี้อาจอธิบายถึงกรณีที่คุณไม่ได้เริ่มต้นจากความแม่นยำที่ได้รับการฝึกฝนเช่นเดียวกัน


1

ทั้งหมดข้างต้นช่วยได้คุณต้องดำเนินการต่อจากอัตราการเรียนรู้ () เดียวกันกับ LR เมื่อโมเดลและน้ำหนักถูกบันทึก ตั้งค่าโดยตรงบนเครื่องมือเพิ่มประสิทธิภาพ

โปรดทราบว่าไม่มีการรับประกันการปรับปรุงจากที่นั่นเนื่องจากโมเดลอาจถึงขั้นต่ำสุดในท้องถิ่นซึ่งอาจเป็นระดับโลก ไม่มีประเด็นที่จะดำเนินการต่อแบบจำลองเพื่อค้นหาขั้นต่ำในท้องถิ่นอื่นเว้นแต่คุณตั้งใจที่จะเพิ่มอัตราการเรียนรู้ในรูปแบบที่มีการควบคุมและผลักดันโมเดลให้อยู่ในระดับต่ำสุดที่อาจจะดีกว่าไม่ไกล


ทำไมถึงเป็นเช่นนั้น? ฉันไม่สามารถใช้ LR ที่เล็กกว่าเดิมได้หรือไม่?
lte__

ที่จริงแล้วการฝึกอบรมอย่างต่อเนื่องอาจทำให้คุณได้รูปแบบที่ดีขึ้นหากคุณได้รับข้อมูลมากขึ้น ดังนั้นจึงมีจุดที่จะดำเนินการต่อแบบจำลองเพื่อค้นหาขั้นต่ำในท้องถิ่นอื่น
Corey Levinson

0

คุณอาจกำลังกดปุ่ม Concept Drift โปรดดูที่หากคุณฝึกอบรมโมเดลใหม่เมื่อมีข้อสังเกตใหม่คุณควรฝึกให้โมเดลเมื่อสังเกตใหม่ที่มีอยู่นอกจากนี้ยังมีแนวคิดเกี่ยวกับความหายนะที่ลืมไปว่าเอกสารทางวิชาการจำนวนมากพูดถึงเรื่องใด นี่คือหนึ่งใน MNIST การสืบสวนเชิงประจักษ์เกี่ยวกับการลืมภัยพิบัติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.