Keras中的多个参数化指标

时间:2018-08-16 18:48:38

标签: python-3.x tensorflow keras metrics

假设我有一个自定义参数化指标:

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

我想用指标kk=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)

0 个答案:

没有答案