Я работаю над однослойной нейронной сетью со скрытым слоем с 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'][:])
Используйте обратный вызов 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', так как это потеря, а не точность.
Вау, умничка!! Я пропустил это на самом деле.
При использовании команды
fit
вы можете указать параметрvalidation_split
, который будет выполнять проверку достоверности части данных. ИспользованиеModelCheckpoint
может помочь извлечь максимум из 2000.