简单自定义Keras度量函数的问题无法返回Argmax?

时间:2018-12-17 12:54:04

标签: tensorflow keras

我想创建一个自定义指标,并且我了解到在一个自定义函数中,所有东西都是张量,我需要使用特殊的后端函数。为了解决这个问题,我尝试了一个三类分类问题示例,在该示例中,我仅将argmax返回为自定义函数

def custom(y_true, y_pred):
    return K.argmax(y_pred)

# Neural Network
model = models.Sequential()
model.add(keras.layers.Embedding(len(np.unique(X.values)), 4)) 
model.add(keras.layers.GlobalAveragePooling1D())
model.add(keras.layers.Dense(16, activation='relu'))
model.add(keras.layers.Dense(3, activation='softmax'))
model.compile(optimizer='rmsprop',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy', custom])

model.fit(X_train.values, y_train.values, epochs=4)

令我惊讶的是,我在输出中得到浮点值!

Epoch 1/4
1023/1023 [==============================] - 0s 276us/step - loss: 0.3560 - acc: 0.3294 - custom: 1.1867
Epoch 2/4
1023/1023 [==============================] - 0s 52us/step - loss: 0.3368 - acc: 0.3343 - custom: 1.9687
Epoch 3/4
1023/1023 [==============================] - 0s 47us/step - loss: 0.3225 - acc: 0.3324 - custom: 1.9374
Epoch 4/4
1023/1023 [==============================] - 0s 47us/step - loss: 0.3173 - acc: 0.3275 - custom: 1.2825

这显然没有达到我的预期,也不知道为什么

问题:为什么我的仅返回argmax的自定义指标没有返回表示argmax的整数向量,而是返回了浮点数?

PS:我修改了自定义功能以打印

def custom(y_true, y_pred):
    x = K.argmax(y_pred)
    x = K.print_tensor(x, message="x is: ")
    return(x)

我得到这样的输出

Epoch 4/4
x is: [2 2 0...]
  32/1023 [..............................] - ETA: 0s - loss: 0.3113 - acc: 0.2500 - custom: 1.0000x is: [2 0 0...]
x is: [0 0 0...]
x is: [0 0 0...]
x is: [2 0 2...]

这又对我没有任何意义。有人知道引擎盖下发生了什么吗?

1 个答案:

答案 0 :(得分:0)

argmax函数正常运行。对于每个批处理,argmax返回一个整数。但是整个批次的度量函数的输出将是该批次的平均值。 凯拉斯documentation

  

退货
  单个张量值表示输出数组的平均值   所有数据点。

因此,如果您的自定义指标函数返回某个批次的某些类值数组,则模型将计算这些值的平均值。