假设我有一个自定义参数化指标:
def my_metric_at_k(k):
def my_metric(y_true, y_pred):
'''
Do magic here with k
to get metric_value
'''
return metric_value
return my_metric
我想用指标k
和k=1
的多个值对我的模型进行评估,因此自然而然地,我倾向于将k=2
输入到[my_metric_at_k(1), my_metric_at_k(2)]
方法的metrics
输入。
当我拟合模型时,会遇到此错误
NotFoundError:FetchOutputs节点指标/ my_metric_1 / ...:未找到
我正在使用带有TensorFlow后端的Keras。
对于一个特定的示例,我使用的一个指标如下:
compile
我正在运行一个多标签的多类问题。
我的模型的简化版本是:
def variety_first_k(k):
def variety(y_true, y_pred):
y_pred = K.tf.cast(y_pred, dtype=K.tf.float64)
sort = K.tf.nn.top_k(y_pred, k=k, sorted=True).indices
unique, _ = K.tf.unique(K.flatten(sort))
num_unique = K.shape(unique)[0]
return K.tf.cast(num_unique, dtype=K.tf.float64) /
K.tf.cast(K.tf.shape(y_pred)[1], dtype=K.tf.float64)
return variety
结果给了我
metrics = [variety_first_k(1), variety_first_k(2)]
inputs = layers.Input(shape=(my_data.shape[1],))
merged_layer = layers.BatchNormalization()(inputs)
merged_layer = layers.Dense(256, activation='relu',
kernel_regularizer=l1_l2(l1=0.5, l2=0.5))(merged_layer)
merged_layer = layers.BatchNormalization()(merged_layer)
predictions = layers.Dense(len(mlb.classes_))(merged_layer)
predictions = layers.Activation('sigmoid')(predictions)
model = keras.Model(inputs=inputs, outputs=predictions)
EPOCHS = 100
INIT_LR = 1e-2
BS = 128
opt = keras.optimizers.Adadelta(lr=INIT_LR, decay=INIT_LR / EPOCHS)
model.compile(loss=multilabel,
optimizer=opt,
metrics=metrics)
H = model.fit(x=my_data,
y=Y,
validation_split=0.02,
epochs=EPOCHS,
batch_size=BS)