প্রশিক্ষিত কেরাস মডেলটি লোড করা এবং প্রশিক্ষণ চালিয়ে যাওয়া


102

আমি ভাবছিলাম যে আংশিক প্রশিক্ষিত কেরাস মডেলটি সংরক্ষণ এবং মডেলটি আবার লোড করার পরে প্রশিক্ষণ চালিয়ে যাওয়া সম্ভব ছিল কিনা।

এর কারণ হ'ল ভবিষ্যতে আমার আরও প্রশিক্ষণের ডেটা থাকবে এবং আমি পুরো মডেলটি আবার পুনরায় আঁকতে চাই না।

আমি যে ফাংশনগুলি ব্যবহার করছি তা হ'ল:

#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))

4
আপনি এটি পরীক্ষা করেছেন? আমি কাজ না করার কোনও কারণ দেখতে পাচ্ছি না।
maz

আমি এখন যা দেখছি তা হল মডেলটি লোড করার পরে আমার যথার্থতা প্রায় 10 শতাংশের সাথে নেমেছে (কেবলমাত্র প্রথম পর্বগুলিতে)। যদি পুনরায় লোডিং কাজ করে তবে এটি অবশ্যই নতুন প্রশিক্ষণের ডেটা দ্বারা সৃষ্ট। তবে আমি কেবল এটি নিশ্চিত করতে চাই যে এটি সত্যই ঘটেছে।
উইলমার ভ্যান ওম্মেরেন

7
আপনি কি মডেল.সভের সাহায্যে সরাসরি আপনার মডেলটি সংরক্ষণ করছেন বা আপনি কোনও মডেল চেকপয়েন্ট ব্যবহার করছেন ( কেরাস.আইও / ক্যালব্যাকস / # এক্সপ্লোর- মডেল- চেকপয়েন্ট )? আপনি যদি মডেল ব্যবহার করেন তবে সেভের কি এমন সুযোগ থাকবে যে আপনি সেরাটির (সর্বনিম্ন ত্রুটি) পরিবর্তে সর্বশেষ মডেলটি (অর্থাৎ শেষ যুগটি) সংরক্ষণ করছেন? আপনি কি সত্যিকারের কোড সরবরাহ করতে পারেন?
maz

আমি আমার সর্বশেষ মডেলটি সংরক্ষণ করছি, সেরাটি নয় (এই পয়েন্টটি অবধি আমি জানতাম না যে এটি সম্ভব হয়েছিল)। আমি কিছু কোড প্রস্তুত করব
উইলমার ভ্যান ওমমেরেন

4
সুতরাং আপনি কি এটি পুনরায় লোড করতে এবং একই ট্রেনের ডেটাতে প্রশিক্ষণ চালিয়ে যেতে পারেননি? এটি আপনাকে আশ্বস্ত করবে যে ফলাফলগুলি তুলনামূলক হলে পুনরায় লোড করা ঠিক আছে।
মার্সিন Mojejko

উত্তর:


36

আসলে - model.saveআপনার ক্ষেত্রে প্রশিক্ষণ পুনরায় চালু করার জন্য প্রয়োজনীয় সমস্ত তথ্য সংরক্ষণ করে sa মডেলটি পুনরায় লোড করে কেবল যে জিনিসটি নষ্ট হতে পারে তা হ'ল আপনার অপটিমাইজারের অবস্থা। এটি যাচাই করতে - saveমডেলটি পুনরায় লোড করার চেষ্টা করুন এবং এটি প্রশিক্ষণের ডেটাতে প্রশিক্ষণ দিন।


4
@ মার্সিন: কেরাস ব্যবহার করার সময় save(), এটি কি মডেলের সেরা ফলাফল (সর্বনিম্ন ক্ষতি) বা মডেলের শেষ ফলাফল (সর্বশেষ আপডেট) সংরক্ষণ করে? ধন্যবাদ
সিংহ লাই

4
সর্বশেষ আপডেট. মডেল চেকপয়েন্ট কলব্যাক সেরাটি সংরক্ষণের জন্য।
হোলি

4
@ খাজ আপনি কি এই কেরাস.আইও / ক্যালব্যাকস /# মডেলচেকপয়েন্টটি উল্লেখ করছেন ? এটি ডিফল্ট হিসাবে মনে হয়, এটি শেষ আপডেটটি সংরক্ষণ করে (সেরাটি নয়); save_best_only=Trueস্পষ্টভাবে সেট করা থাকলে সেরাটি সংরক্ষণ করা হয়।
ফ্লো 2 কে

9

উপরোক্ত উত্তরগুলির বেশিরভাগই গুরুত্বপূর্ণ পয়েন্টগুলি জুড়েছে। আপনি যদি সাম্প্রতিক টেনসরফ্লো ব্যবহার করছেন ( TF2.1বা উপরে), তবে নীচের উদাহরণটি আপনাকে সহায়তা করবে। কোডটির মডেল অংশটি টেনসরফ্লো ওয়েবসাইট থেকে।

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 ফর্ম্যাটে মডেলটি সংরক্ষণ করুন। আমার অভিজ্ঞতা থেকে, যদি আপনার কোনও কাস্টম_লস সংজ্ঞায়িত থাকে, * .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)

এই পদ্ধতির প্রশিক্ষণটি আবার চালু করা হবে যেখানে আমরা মডেলটি সংরক্ষণের আগে রেখেছিলাম। অন্যদের দ্বারা উল্লিখিত হিসাবে, আপনি যদি সেরা মডেলের ওজনগুলি সংরক্ষণ করতে চান বা প্রতি পর্বের মডেলগুলির ওজনগুলি সংরক্ষণ করতে চান তবে , এবং save_weights_only=True, এর বিকল্পগুলির সাথে কেরাস কলব্যাকস ফাংশন (মডেলচেকপয়েন্ট) ব্যবহার করা দরকার ।save_freq='epoch'save_best_only

আরও তথ্যের জন্য, দয়া করে এখানে এবং এখানে অন্য একটি উদাহরণ চেক করুন


4
সুন্দর, এটি খুব আশাব্যঞ্জক দেখাচ্ছে - তথ্যের জন্য ধন্যবাদ। এই উদাহরণে, আমার কাছে মনে হয় যেন আপনি সেই একই ডেটাতে মডেলটিকে প্রশিক্ষণ দিচ্ছেন যা প্রশিক্ষণের জন্য ব্যবহৃত হয়েছিল। যদি তা হয়, তবে আমি ভাবতাম যে সঠিক পদ্ধতিটি পুনরায় প্রশিক্ষণের জন্য প্রশিক্ষণের ডেটাগুলির একটি নতুন উপসেটটি লোড করা হবে (প্রক্রিয়াটিতে নতুন তথ্য প্রবর্তন করার জন্য)?
বিবজ্জ্জা

4
@ বিজ্জেজ্জ আপনার সাথে একমত খুব ভাল মন্তব্য। পারফরম্যান্সের উন্নতি করতে আমি একই ডেটাতে পুনরায় প্রশিক্ষণ প্রদর্শন করতে চেয়েছিলাম। নমুনাটি পরিষ্কারভাবে পারফরম্যান্সের উন্নতি দেখায় যেখানে মডেলটি সংরক্ষণের আগে এটি বন্ধ করা হয়েছিল। আমি বিভিন্ন ডেটা পুনরায় প্রশিক্ষণ করতে আপনার সাথে পুরোপুরি একমত হব এবং পরে এটি চেষ্টা করব। ধন্যবাদ!
বিষ্ণুবর্ধন জনপতি

4
দুর্দান্ত - আপনি এটি খুব সুন্দরভাবে প্রদর্শন করেছেন, আপনাকে ধন্যবাদ।
বিবিজ্জ

8

সমস্যাটি হ'ল আপনি কোনও আলাদা অপটিমাইজার - বা আপনার অপ্টিমাইজারের কাছে বিভিন্ন যুক্তি ব্যবহার করেন। আমি কেবল একটি কাস্টম প্রিটেইনড মডেল ব্যবহার করে একই সমস্যা করেছি

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

প্রাক-প্রশিক্ষিত মডেলটির জন্য, যার মাধ্যমে আসল শিক্ষার হার 0.0003 থেকে শুরু হয় এবং প্রাক-প্রশিক্ষণের সময় এটি কমিয়ে আনা হয় মিনি_ট্রেনিং হারে, যা 0.000003

আমি সেই লাইনটি কেবল স্ক্রিপ্টে অনুলিপি করেছি যা প্রাক-প্রশিক্ষিত মডেল ব্যবহার করে এবং সত্যই খারাপ স্বীকৃতি পেল। যতক্ষণ না আমি লক্ষ্য করেছি যে পূর্বনির্ধারিত মডেলের শেষ শিক্ষার হারটি ন্যূনতম শিক্ষার হার, অর্থাৎ 0.000003। এবং যদি আমি সেই শিক্ষার হারটি দিয়ে শুরু করি, তবে আমি পূর্বনির্ধারিত মডেলের আউটপুট হিসাবে শুরু করার জন্য ঠিক একই রকম নির্ভুলতা পেয়েছি - যা অনুধাবন করে, এমন একটি শিক্ষার হার দিয়ে শুরু করা যা পূর্বশিক্ষিত ব্যবহৃত শেষ শিক্ষার হারের চেয়ে 100 গুণ বড় মডেলটির ফলে জিডির বিশাল ওভারশুট হবে এবং তাই হ্রাসকৃত যথাযথ পরিমাণে।


2

লক্ষ্য করুন যে কেরাস এখানে কখনও কখনও বোঝা মডেল নিয়ে সমস্যা আছে । এটি এমন ক্ষেত্রে ব্যাখ্যা করতে পারে যেখানে আপনি একই প্রশিক্ষিত নির্ভুলতা থেকে শুরু করেন না।


1

উপরের সমস্তটি সহায়তা করে, মডেল এবং ওজনগুলি সংরক্ষণ করার সময় আপনার অবশ্যই এলআর হিসাবে একই শিক্ষার হার () থেকে শুরু করতে হবে । এটি সরাসরি অপ্টিমাইজারে সেট করুন।

মনে রাখবেন যে সেখান থেকে উন্নতির কোনও গ্যারান্টি নেই, কারণ মডেলটি স্থানীয় সর্বনিম্নে পৌঁছেছে যা বৈশ্বিক হতে পারে। অন্য স্থানীয় ন্যূনতম সন্ধানের জন্য কোনও মডেল পুনরায় শুরু করার কোনও অর্থ নেই, যদি না আপনি নিয়ন্ত্রিত ফ্যাশনে শিক্ষার হার বাড়ানোর এবং মডেলটিকে সম্ভবত আরও ভালতম ন্যূনতমের দিকে ঠেলাঠেলি না করেন।


তা কেন? আমি কি আগের চেয়ে আরও ছোট এলআর ব্যবহার করতে পারি না?
lte__

প্রকৃতপক্ষে, প্রশিক্ষণ অব্যাহত থাকতে পারে যদি আপনি আরও ডেটা পান তবে আপনাকে আরও ভাল মডেলের কাছে নিয়ে যেতে পারেন। সুতরাং অন্য একটি স্থানীয় সর্বনিম্ন সন্ধানের জন্য একটি মডেল পুনরায় চালু করার পয়েন্ট রয়েছে।
কোরি লেভিনসন

0

আপনি কনসেপ্ট ড্রিফটকেও আঘাত করতে পারেন, নতুন পর্যবেক্ষণগুলি উপলভ্য হলে আপনার কোনও মডেল পুনরায় প্রশিক্ষণ করা উচিত তা দেখুন । বিপর্যয়ের ভুলে যাওয়ার ধারণাটিও রয়েছে যা একাডেমিক গবেষণাপত্র নিয়ে আলোচনা করে। এমএনআইএসটি সহকারে বিপর্যয় ভুলে যাওয়ার পরীক্ষামূলক তদন্ত রয়েছে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.