Я заметил, что при выполнении следующего рабочего процесса:
- загрузить предварительно обученную модель из keras.applications с весами из Imag eNet
- отточить это модель с новыми данными
- сохраните настроенную модель в файл hdf5 с помощью
model.save('file.h5')
- и перезагрузите модель куда-нибудь еще с помощью
load_model('file.h5')
При использовании некоторых моделей этапы сохранения и загрузки могут занимать очень много времени.
При использовании VGG16 или VGG19 или Mobil eNet сохранение и загрузка происходят очень быстро (не более нескольких секунд).
Однако при использовании Na sNet, InceptionV3 или DenseNet121 и сохранение, и загрузка могут занимать до 10-30 минут каждый, как показано в следующих примерах:
from keras.layers import GlobalAveragePooling2D
from keras.layers.core import Dense
from keras.models import Model
# VGG16
model_ = keras.applications.vgg16.VGG16(weights='imagenet', include_top=False)
x = GlobalAveragePooling2D()(model_.output)
x = Dense(16, activation='softmax')(x)
my_model = Model(inputs=model_.input, outputs=x)
my_model.fit(some_data)
my_model.save('file.h5') # takes 2 seconds
load_model('file.h5') # takes 2 seconds
# NASNetMobile
model_ = keras.applications.nasnet.NASNetMobile(weights='imagenet', include_top=False)
x = GlobalAveragePooling2D()(model_.output)
x = Dense(16, activation='softmax')(x)
my_model = Model(inputs=model_.input, outputs=x)
my_model.fit(some_data)
my_model.save('file.h5') # takes 10 minutes
load_model('file.h5') # takes 5 minutes
# DenseNet121
model_ = keras.applications.densenet.DenseNet121(weights='imagenet', include_top=False)
x = GlobalAveragePooling2D()(model_.output)
x = Dense(16, activation='softmax')(x)
my_model = Model(inputs=model_.input, outputs=x)
my_model.fit(some_data)
my_model.save('file.h5') # takes 10 minutes
load_model('file.h5') # takes 5 minutes
При запросе командной строки чтобы наблюдать за созданным файлом во время сохранения, мы можем видеть, как медленно создается file.h5
, со скоростью около 100 КБ в минуту в худшем случае, а затем внезапно, когда он достигает 22 МБ, он очень быстро завершается до полного размера (80-100 МБ в зависимости от модели).
Мне было интересно, является ли это «стандартным поведением», просто потому, что эти модели изначально сложны, а затем ожидаются такие длительные периоды сохранения / загрузки, или это не нормально? Кроме того, можно ли что-то сделать, чтобы смягчить это?
Используемая конфигурация:
- Keras 2.2 с бэкэндом TensorFlow
- TensorFlow-GPU 1.13
- Python 3,6
- CUDA 10,1
- работает на предварительно настроенном экземпляре AWS Deep Learning EC2