Оптимизация CNN для регрессии Keras Tuner

#python #regression #conv-neural-network #metrics #keras-tuner

#python #регрессия #conv-нейронная сеть #показатели #keras-tuner

Вопрос:

Я использую Keras Tuner для оптимизации модели CNN для задачи регрессии. В основном у меня есть последовательности ДНК, которые я превратил в матрицу, чтобы использовать их в качестве изображений для обучения модели CNN. То, что я хочу предсказать, — это процент, который зависит от этих последовательностей.

это моя модель, чтобы попробовать:

 def build_model(hp):  
  model = keras.Sequential([
    keras.layers.Conv2D(
        filters=hp.Int('conv_1_filter', min_value=32, max_value=128, step=16),
        kernel_size=hp.Choice('conv_1_kernel', values = [3,3]),
        activation='relu',
        padding = 'same',
        input_shape=(30,4,1)
    ),
    keras.layers.Conv2D(
        filters=hp.Int('conv_2_filter', min_value=32, max_value=96, step=16),
        kernel_size=hp.Choice('conv_2_kernel', values = [5,3]),
        activation='relu',
        padding = 'same'
    ),
    keras.layers.Conv2D(
        filters=hp.Int('conv_3_filter', min_value=32, max_value=64, step=16),
        kernel_size=hp.Choice('conv_3_kernel', values = [7,3]),
        activation='relu',
        padding = 'same'
    ),
    keras.layers.MaxPooling2D(
        pool_size=hp.Choice('maxpool_1_size', values = [2,2]),
    ),
    keras.layers.Flatten(),
    keras.layers.Dense(
        units=hp.Int('dense_1_units', min_value=32, max_value=128, step=16),
        activation='relu'
    ),
    keras.layers.Dense(1, activation='relu')
  ])
  
  model.compile(optimizer=keras.optimizers.Adam(hp.Choice('learning_rate', values=[1e-2, 1e-3,1e-4])),
              loss='mean_absolute_error',
              metrics=[R2_Score])
  
  return model
 

Поскольку я работаю с регрессией, я использовал эту функцию для R2Score, так как в Keras ее нет:

 def R2_Score(y_true, y_pred):
    from keras import backend as K
    SS_res =  K.sum(K.square( y_true-y_pred ))
    SS_tot = K.sum(K.square( y_true - K.mean(y_true) ) )
    return ( 1 - SS_res/(SS_tot   K.epsilon()) )
 

Для настройки я использую этот код:

 tuner=RandomSearch(build_model,
                   objective= kerastuner.Objective('R2_Score', direction='max'),
                   max_trials=5,
                   directory='output',
                   project_name="CRISPR-Cas9")

tuner.search(X_train, y_train,
             epochs=5,
             validation_data=(X_test, y_test),
             metrics=[R2_Score])
 

Я получаю ошибку в model.compile, и я подозреваю, что получу то же самое в tuner или tuner.search:

Ошибка типа: fit() получил неожиданный аргумент ключевого слова ‘metrics’

Я видел несколько решений этой проблемы, но ни одно из них не работает для меня, также почти каждый пример CNN, который я вижу, используется при классификации, но я делаю регрессию.