我正在使用 Keras Tuner 为回归问题优化 CNN 模型。基本上,我将 DNA 序列转化为矩阵,以便将它们用作图像来训练 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 中得到相同的结果:
TypeError: fit() 得到了一个意外的关键字参数“metrics”
我看到了一些针对这个问题的解决方案,但没有一个对我有用,而且我看到的几乎每个 CNN 示例都用于分类,但我正在做回归。