Почему обучение модели Keras занимает больше времени каждый раз, когда я собираю новую модель в ноутбуке Jupyter.Выход из Jupyter / Python и перезапуск сбрасывает скорость обучения. Диаграмма рассеяния выглядит каждый раз, когда я делаю это.
Я использую Keras 'Sequential' для обучения простого MLP с входным слоем около 6000 объектов, 3 скрытых реляционных слоя(размер 2500, 800, 800) с выпуском и выпадением, а также с сигмоидальным выходом, ничего особенного.
Я оптимизирую (используя GPyOpt, но эффект также появляется, когда я строю модели в простом цикле for), который я использую функцию, которая строит новую модель Keras вышеупомянутую каждый раз, когда онассылки.До того, как модель встроена в эту функцию, она вызывает функцию limitmen (), потому что в противном случае я сталкиваюсь с проблемами памяти GPU:
def limit_mem():
"""
Clear GPU-memory and tensorflow session.
"""
K.get_session().close()
cfg = K.tf.ConfigProto()
cfg.gpu_options.allow_growth = True
K.set_session(K.tf.Session(config=cfg))
Я нашел эту функцию после некоторого поиска здесь on stackoverflow
def f_beta(precision, recall, beta):
f_beta_result = (1 + (beta ** 2)) * (precision * recall) / (((beta ** 2) * precision) + recall)
if isinstance(f_beta_result, np.ndarray):
f_beta_result[np.isnan(f_beta_result)] = 0
else:
if math.isnan(f_beta_result):
f_beta_result = 0
return f_beta_result
beta = 1.5 # define beta for f-score
class Metrics(Callback):
def on_train_begin(self, logs={}):
self.val_f1s = []
self.val_f2s = []
self.val_recalls = []
self.val_precisions = []
self.val_briers = []
def on_epoch_end(self, epoch, logs={}):
val_predict = (np.asarray(self.model.predict(X_val))).round()
val_targ = y_val
_val_precision, _val_recall, _val_f1, _support = precision_recall_fscore_support(val_targ, val_predict, labels=[0,1])
_val_f2 = f_beta(_val_precision[1], _val_recall[1], beta)
_val_brier = brier_score_loss(val_targ, val_predict)
# print(_val_precision)
self.val_f1s.append(_val_f1[1])
self.val_f2s.append(_val_f2)
self.val_recalls.append(_val_recall[1])
self.val_precisions.append(_val_precision[1])
self.val_briers.append(_val_brier)
# print (' — val_f1: %.3f — val_precision: %.3f — val_recall %.3f' % ( _val_f1[1], _val_precision[1], _val_recall[1]))
return
def return_metrics(self):
return self.val_f1s, self.val_f2s, self.val_recalls, self.val_precisions, self.val_briers, np.array(self.val_f2s).argmax()
metrics = Metrics()
# create model
def build_model(dropout=0.9, dense1=2500, dense2=800, dense3=800, lr=0.0001):
model = Sequential()
# first layer
model.add(Dense(dense1, input_dim=X_train.shape[1], init='uniform'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(dropout))
# second layer
model.add(Dense(dense2, init='uniform'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(dropout))
# third layer
model.add(Dense(dense3, init='uniform'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(dropout))
# final layer
model.add(Dense(1, activation='sigmoid'))
# Compile model
adam = Adam(lr)
model.compile(loss='binary_crossentropy', optimizer=adam, metrics=['accuracy', 'mae'])
return model
Это более или менее цикл, который строит модели keras:
for i in range(self.cycle):
# actually build model
t_before = time.time()
self.keras_model = build_model(dropout, dense1, dense2, dense3, lr)
# train model
self.hist = self.keras_model.fit(X_train, y_train, validation_data=(X_val, y_val), epochs=self.epochs,
batch_size=1024, verbose=0, callbacks=[metrics],
class_weight={ 0 : 1, 1 : weight1 })
t_after = time.time()
Кто-нибудь испытывал то же самое?Вам нужно больше информации?Или это хорошо известная проблема с простым решением (или вообще без решения)?