ValueError: извлечение аргументане может быть истолкован как Тензор - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь решить проблему бинарной классификации, где классификатор предсказывает, является ли молекула мутагенной (типичная проблема биоинформатики), основываясь на битах, извлеченных из отпечатков пальцев Моргана.Для тех, кто не знаком с отпечатками пальцев Моргана, просто подумайте о наборе данных, как «одно наблюдение - это набор битов (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
...