Я пытаюсь решить проблему бинарной классификации, где классификатор предсказывает, является ли молекула мутагенной (типичная проблема биоинформатики), основываясь на битах, извлеченных из отпечатков пальцев Моргана.Для тех, кто не знаком с отпечатками пальцев Моргана, просто подумайте о наборе данных, как «одно наблюдение - это набор битов (1, 0, 1, 1, 1, 0, 1, 0, 0 ...) и битовВот некоторые функции.
В прилагаемом коде я выполняю поиск по сетке для настройки гиперпараметров. Меня больше всего интересуют эти гиперпараметры:
- Скорость обучения (наиболее важно) & импульс
- Функция активации
- Скорость отсева
- Количество слоев
- Количество нейронов в скрытых слоях
Код работает отлично, однако после нескольких итераций (~ 811) я получаю следующую ошибку, о которой я понятия не имею:
ValueError: Аргумент Fetch нельзя интерпретировать как Tensor. (Тензор Тензор ("dens_1 / kernel: 0", shape = (2048, 512), dtype = float32_ref) не является элементом этого графа.)
Я не нашел ни одного релевантногоинформация о переполнении стека. Эта ошибка возникает у людей обычно при использовании tf.Graph()
, каккогда-либо это не так здесь.Код для поста переполнения стека достаточно длинный, поэтому я оставил ссылку на страницу GitHub и прошу вас посмотреть.Найдите каталог StackOverflow/
в этом хранилище.Там вы найдете скриншот ошибки, а также полный код.Кроме того, я думаю, что наиболее интересным было бы показать функцию поиска по сетке, которую я использовал в своем коде, потому что мне пришлось реализовать свою собственную функцию вместо использования функции из sklearn
, просто потому, что мне было поручено это сделать.Поэтому я настоятельно рекомендую, чтобы в этой функции произошла ошибка.
Я был бы очень признателен за любые замечания по этому вопросу!
## Fix random seed for reproducibility
seed = 7
np.random.seed(seed)
def gridSearch(hyperparameters):
'''
Wrapper function that takes permuations of hyperparameters from the class itertools.product,
builds a new model in accord with these parameters. Analogous to the GridSerach_CV form
sklearn. Lasty, it returns best Roc AUC score and best parameters
Also prints out all parameters it tests (the progress of the Grid Search).
Parameters:
-------
hyperparameters:
(Iterable) product from class itertools representing all possible permutations of hyperparameters.
'''
## Values to be reported
best_score = 0
params = {}
best_params = {}
best_model = Sequential()
model_nr = 1
best_model_nr = 0
for permute in hyperparameters:
## Record of permuted values
model_nr +=1
params['units'] = permute[0]
params['activation'] = permute[1]
params['optimizer'] = permute[2]
params['learning_rate'] = permute[3]
params['num_layers'] = permute[4]
# params['dropout_rate'] = permute[5]
params['epochs'] = permute[5]
params['batch_size'] = permute[6]
## Build desired model from the wrapped function
model = build_classifier(units=permute[0], activation=permute[1],
optimizer=permute[2], learning_rate=permute[3],
num_layers=permute[4])
## Train the model
model.fit(X_train, y_train, batch_size=permute[6], epochs=permute[5])
## Predict on the test date
y_pred = model.predict(X_test)
## Evaluate model performatnce using hte roc_auc score as a metric
auc = roc_auc_score(y_test, y_pred)
## Report performance after each permuation
message = "Model number {}:\n".format(model_nr)
print(message)
f.write(message)
message = "Used Hyperparameters:\n" + str(params) +'\n'
print(message)
f.write(message)
message = 'auc score: {}'.format(auc)+'\n\n'
print(message)
f.write(message)
if best_score < auc:
best_score = auc
best_params = params
best_model = model
best_model_nr = model_nr
#### end of for loop! ####
## Serialize model to JSON
with open("best_model.json", "w") as json_file:
json_file.write(best_model.to_json())
## Serialize weights to HDF5
best_model.save_weights("model.h5")
print("Saved model to disk\n")
message = '\n\nBest model (Nr. {}):\n'.format(best_model_nr)
print(message)
f.write(message)
message = "Used Hyperparameters:\n" + str(best_params) +'\n'
print(message)
f.write(message)
message = 'auc score: {}'.format(best_score)+'\n'
print(message)
f.write(message)
return best_score, best_params, best_model