Извлечение весов из лучшей нейронной сети в Tensorflow/Keras — несколько эпох

Я работаю над однослойной нейронной сетью со скрытым слоем с 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'][:]) 

При использовании команды fit вы можете указать параметр validation_split, который будет выполнять проверку достоверности части данных. Использование ModelCheckpoint может помочь извлечь максимум из 2000.

Koralp Catalsakal 08.04.2019 17:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
1 835
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте обратный вызов 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, самостоятельно написав функцию обратного вызова.

Большое спасибо, Анакин, действительно рабочий и (невероятно) быстрый ответ. Я только что изменил monitor = 'mean_squared_error' на тот момент, когда я не использую данные проверки и с режимом = 'min', так как это потеря, а не точность.

Nicg 08.04.2019 17:56

Вау, умничка!! Я пропустил это на самом деле.

Anakin 08.04.2019 19:32

Другие вопросы по теме