我想创建一个自定义指标,并且我了解到在一个自定义函数中,所有东西都是张量,我需要使用特殊的后端函数。为了解决这个问题,我尝试了一个三类分类问题示例,在该示例中,我仅将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...]
这又对我没有任何意义。有人知道引擎盖下发生了什么吗?
答案 0 :(得分:0)
argmax函数正常运行。对于每个批处理,argmax返回一个整数。但是整个批次的度量函数的输出将是该批次的平均值。 凯拉斯documentation说
退货
单个张量值表示输出数组的平均值 所有数据点。
因此,如果您的自定义指标函数返回某个批次的某些类值数组,则模型将计算这些值的平均值。