Извлечение весов из лучшей нейронной сети в Tensorflow / Keras - несколько эпох - PullRequest
1 голос
/ 08 апреля 2019

Я работаю над 1-скрытой нейронной сетью с 2000 нейронов и 8 + постоянными входными нейронами для решения проблемы регрессии.

В частности, в качестве оптимизатора я использую RMSprop с параметром обучения = 0.001,Активация ReLU от входа к скрытому слою и линейная от скрытого к выходу.Я также использую мини-пакетный градиент-спуск (32 наблюдения) и запускаю модель 2000 раз, то есть эпох = 2000.

Моя цель, после тренировки, извлечь веса из лучшихНейронная сеть из 2000 года запуска (где после многих испытаний самый лучший никогда не бывает последним, а под лучшим я имею в виду тот, который приводит к наименьшему MSE).

Использование save_weights ('my_model_2.h5', save_format =' h5 ') на самом деле работает, но, насколько я понимаю, он извлекает веса из прошлой эпохи, а я хочу, чтобы те из эпохи, в которой NN показал лучшие результаты.Пожалуйста, найдите код, который я написал:

def build_first_NN():
  model = keras.Sequential([
    layers.Dense(2000, activation=tf.nn.relu, input_shape=[len(X_34.keys())]),
    layers.Dense(1)
  ])

  optimizer = tf.keras.optimizers.RMSprop(0.001)

  model.compile(loss='mean_squared_error',
                optimizer=optimizer,
                metrics=['mean_absolute_error', 'mean_squared_error']
                )
  return model



first_NN = build_first_NN()

history_firstNN_all_nocv = first_NN.fit(X_34, 
                                        y_34, 
                                        epochs = 2000)

first_NN.save_weights('my_model_2.h5', save_format='h5')

trained_weights_path = 'C:/Users/Myname/Desktop/otherfolder/Data/my_model_2.h5'

trained_weights = h5py.File(trained_weights_path, 'r')

weights_0 = pd.DataFrame(trained_weights['dense/dense/kernel:0'][:])
weights_1 = pd.DataFrame(trained_weights['dense_1/dense_1/kernel:0'][:]) 

Тогда извлеченные веса должны быть теми из последних эпох 2000 года: как я могу получить их от того, в котором MSE было наименьшим?

Ждем каких-либо комментариев.

РЕДАКТИРОВАТЬ: РЕШЕНО

Основываясь на полученных предложениях, что касается общего интереса, вот как я обновил свой код, выполняя свои задачи:

# build_first_NN() as defined before

first_NN = build_first_NN()

trained_weights_path = 'C:/Users/Myname/Desktop/otherfolder/Data/my_model_2.h5'

checkpoint = ModelCheckpoint(trained_weights_path, 
                             monitor='mean_squared_error', 
                             verbose=1, 
                             save_best_only=True, 
                             mode='min')

history_firstNN_all_nocv = first_NN.fit(X_34, 
                                        y_34, 
                                        epochs = 2000,
                                        callbacks = [checkpoint])

trained_weights = h5py.File(trained_weights_path, 'r')

weights_0 = pd.DataFrame(trained_weights['model_weights/dense/dense/kernel:0'][:])
weights_1 = pd.DataFrame(trained_weights['model_weights/dense_1/dense_1/kernel:0'][:]) 

1 Ответ

1 голос
/ 08 апреля 2019

Используйте ModelCheckpoint обратный вызов от Keras.

from keras.callbacks import ModelCheckpoint

checkpoint = ModelCheckpoint(filepath, monitor='val_mean_squared_error', verbose=1, save_best_only=True, mode='max')

используйте это как обратный вызов в вашем model.fit(). Это всегда сохранит модель с самой высокой точностью проверки (самое низкое значение MSE при проверке) в месте, указанном filepath.

С документацией можно ознакомиться здесь . Конечно, вам нужны данные проверки во время обучения для этого. В противном случае, я думаю, вы, вероятно, сможете проверить MSE с самым низким уровнем подготовки, написав функцию обратного вызова самостоятельно.

...