Я столкнулся с проблемой относительно сохранения процесса обучения гиперпараметра в моем сверточном нейронном Net. Я прочитал пару сообщений в блоге, но почему-то не могу этого сделать.
У меня есть следующий код:
def ConvNet(embeddings, max_sequence_length, num_words, embedding_dim, trainable=False, extra_conv=True,
lr=0.0001, dropout=0.7, filters = 128, momentum = 0.8, units = 32, pool_size = 3):
embedding_layer = Embedding(num_words,
embedding_dim,
weights=[embeddings],
input_length=max_sequence_length,
trainable=trainable)
sequence_input = Input(shape=(max_sequence_length,), dtype='int32')
embedded_sequences = embedding_layer(sequence_input)
convs = []
filter_sizes = [3, 4, 5]
for filter_size in filter_sizes:
l_conv = Conv1D(filters=filters, kernel_size=filter_size, activation='relu')(embedded_sequences)
l_pool = MaxPooling1D(pool_size=pool_size)(l_conv)
l_conv2 = Conv1D(filters=filters, kernel_size=3, activation='relu')(l_pool)
l_pool2 = MaxPooling1D(pool_size=pool_size)(l_conv2)
convs.append(l_pool2)
l_merge = concatenate(convs, axis=1)
# add a 1D convnet with global maxpooling, instead of Yoon Kim model
conv = Conv1D(filters=filters, kernel_size=3, activation='relu')(embedded_sequences)
pool = MaxPooling1D(pool_size=pool_size)(conv)
if extra_conv == True:
x = Dropout(dropout)(l_merge)
else:
# Original Yoon Kim model
x = Dropout(dropout)(pool)
x = Flatten()(x)
x = Dense(units = units, activation='relu')(x)
preds = Dense(1, activation='linear')(x)
model = Model(sequence_input, preds)
sgd = keras.optimizers.SGD(learning_rate = lr, momentum= momentum)
model.compile(loss= r_square_loss,
optimizer= sgd,
metrics=['mean_squared_error', rmse, r_square])
model.summary()
return model
Я оптимизирую гиперпараметр следующей функцией:
from hyperopt import fmin, hp, tpe, space_eval, Trials
def train_and_score(args):
# Train the model the fixed params plus the optimization args.
# Note that this method should return the final History object.
model = ConvNet(embeddings=train_embedding_weights, max_sequence_length= MAX_SEQUENCE_LENGTH,
num_words=len(train_word_index)+1, embedding_dim= EMBEDDING_DIM,
trainable=False, extra_conv=True,
lr=args['lr'], dropout=args['dropout'], filters=args['filters'],
momentum= args['momentum'], units = args['units'])
early_stopping = EarlyStopping(monitor='mean_squared_error', patience=40, verbose=1, mode='auto')
hist = model.fit(x_train, y_tr, epochs=args['epochs'], batch_size=args['batch_size'], validation_split=0.2, shuffle=True,
callbacks=[early_stopping])
#Unpack and return the last validation loss from the history.
return hist.history['val_loss'][-1]
#Define the space to optimize over.
space = {
'lr': hp.choice('lr', [0.1, 0.01, 0.001, 0.0001]),
'dropout': hp.choice('dropout', [0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]),
'filters': hp.choice('filters', [32, 64, 128, 256]),
'pool_size': hp.choice('pool_size', [2, 3]),
'momentum': hp.choice('momentum', [0.4, 0.5, 0.6, 0.7, 0.8, 0.9]),
'units': hp.choice('units', [32, 64, 128, 256]),
'epochs': hp.choice('epochs', [20, 30, 40, 50, 60, 70]),
'batch_size': hp.choice('batch_size', [20, 30, 40, 50, 60, 70, 80])
}
# Minimize the training score over the space.
trials = Trials()
best = fmin(fn=train_and_score,
space=space,
trials=trials,
max_evals = 10,
algo=tpe.suggest)
# Print details about the best results and hyperparameters.
print(best)
print(space_eval(space, best))
На данный момент у меня max_evals равно 10, чтобы посмотреть, все ли работает. Для фактического тренировочного процесса я бы хотел установить его на 500 и дать ему поработать в течение одного дня ... Итак, вот мой вопрос: Как мне сохранить тренировочный процесс? Думаю, будет достаточно просто сохранить лучшее в файле или что-то в этом роде, так как это университетский проект, и я должен предоставить «доказательство» того, что я обучал CNN.
Дополнительно вопрос: На данный момент, после 10 оценок, я беру лучшие параметры и вручную заполняю их в приведенный выше код, чтобы предсказать набор тестов и вычислить некоторые статистические числа, такие как mse, r-square et c.
model = ConvNet(train_embedding_weights, MAX_SEQUENCE_LENGTH, len(train_word_index)+1, EMBEDDING_DIM,
trainable=False, extra_conv=True,
lr=0.0001, dropout=0.6, filters= 128,
momentum= 0.8, units = 32, pool_size = 2)
#define callbacks
early_stopping = EarlyStopping(monitor='mean_squared_error', patience=40, verbose=1, mode='auto')
hist = model.fit(x_train, y_tr, epochs=30, batch_size=20, validation_split=0.2, shuffle=False, callbacks=[early_stopping])
Я мечтаю установить max_eval на 500 и чтобы результат сохранялся в выходном файле (достаточно только лучшей комбинации гиперпараметров) и чтобы впоследствии получить лучший гиперпараметр автоматически берутся для расчета x-теста и статистических чисел mse, r-square et c.
Кто-нибудь может помочь? Я застрял здесь на много-много-много часов.
Спасибо!