keras - 了解 Keras 中的指标计算
问题描述
我试图在 Keras 中实现一个真正的积极指标:
def TP(y_true, y_pred):
estimated = K.argmax(y_pred, axis=1)
truth = K.argmax(y_true, axis=1)
TP = K.sum(truth * estimated)
return TP
基于我的最后一层输出形状:(batch, 2)。该函数已使用 numpy argmax 等效项进行了测试,并且运行良好。
我使用 cross_entropy 损失函数,每个时期它都会给我度量值。但是这个值怎么可能是十进制数呢? 我究竟做错了什么 ?谢谢 !
编辑:这是 Keras 模型的示例代码:
def TP(y_true, y_pred):
estimated = K.argmax(y_pred, axis=1)
truth = K.argmax(y_true, axis=1)
TP = K.sum(truth * estimated)
return TP
epochs = 10
batch_size = 2
model = Sequential([
Dense(32, input_shape=(4,)),
Activation('relu'),
Dense(2),
Activation('softmax'),
])
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy', TP])
model.summary()
train = np.array([[17,0,1,0],[17,0,1,0],[17,0,1,0],[17,0,1,0],[17,0,1,0], [2,1,0,1],[0,1,0,1],[0,1,0,1],[0,1,0,1],[0,1,0,1]])
labels = np.array([ [1,0],[1,0],[1,0],[1,0],[1,0], [0,1],[0,1],[0,1],[0,1],[0,1] ])
model.fit(train, labels, epochs=epochs, batch_size=batch_size, verbose=2)
这里显示TP功能的测试似乎有效
def npTP(y_true, y_pred):
estimated = np.argmax(y_pred, axis=1)
truth = np.argmax(y_true, axis=1)
TP = np.sum(truth * estimated)
return TP
y_true = np.array([ [1,0],[1,0],[1,0],[1,0],[1,0], [0,1],[0,1],[0,1],[0,1],[0,1] ])
y_pred = np.array([ [0,1],[0,1],[0,1],[0,1],[0,1], [0,1],[0,1],[0,1],[0,1],[0,1]])
print("np check : ")
print(npTP(y_true, y_pred))
运行此代码会给出以下输出:
Using TensorFlow backend.
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (None, 32) 160
_________________________________________________________________
activation_1 (Activation) (None, 32) 0
_________________________________________________________________
dense_2 (Dense) (None, 2) 66
_________________________________________________________________
activation_2 (Activation) (None, 2) 0
=================================================================
Total params: 226
Trainable params: 226
Non-trainable params: 0
_________________________________________________________________
Epoch 1/10
- 0s - loss: 0.3934 - acc: 0.6000 - TP: 0.2000
Epoch 2/10 ^^^^^^^^^^ here are the decimal values
- 0s - loss: 0.3736 - acc: 0.6000 - TP: 0.2000
Epoch 3/10 ^^^^^^^^^^
- 0s - loss: 0.3562 - acc: 0.6000 - TP: 0.2000
Epoch 4/10 ^^^^^^^^^^
- 0s - loss: 0.3416 - acc: 0.7000 - TP: 0.4000
Epoch 5/10 ^^^^^^^^^^
- 0s - loss: 0.3240 - acc: 1.0000 - TP: 1.0000
Epoch 6/10
- 0s - loss: 0.3118 - acc: 1.0000 - TP: 1.0000
Epoch 7/10
- 0s - loss: 0.2960 - acc: 1.0000 - TP: 1.0000
Epoch 8/10
- 0s - loss: 0.2806 - acc: 1.0000 - TP: 1.0000
Epoch 9/10
- 0s - loss: 0.2656 - acc: 1.0000 - TP: 1.0000
Epoch 10/10
- 0s - loss: 0.2535 - acc: 1.0000 - TP: 1.0000
np check :
5
谢谢 !
解决方案
正如desertnaut 指出的那样,答案在此线程中进行了解释。
Keras在批次和时期之间进行运行平均。
这里有batch_size=2
10 个样本,每个 epoch 运行 5 次训练 ( 10/2=5
)。
要了解 epoch 1 的输出指标,5 次训练后的总数TP
必须为 1,因此指标给出1/5 = 0.2
. Epoch 4 在 5 次训练中给出了 2 个 TP 2/5 = 0.4
。
推荐阅读
- karate - 我们如何在 karate-config.js 文件中加密密码?
- asp.net - 如何从 Kendo SiteFinity 模板渲染 React 组件
- django - 在 Django 中向表单添加文件会使编辑表单的行为有所不同 - 为什么?
- git - 在整个存储库工作副本上签出错误后,Git 未暂存更改
- flutter - 将菜单项重定向到另一个页面
- c++ - 如何在头文件中设置字符串返回函数并在另一个类或.pp中使用该函数
- javascript - 通过对象属性/字段从对象数组中获取对象:功能方式?(JavaScript / ES6)
- javascript - 如何在 ReactJS 中获取 onCut 的输入值
- c++ - 向量向量的按位运算
- kotlin - 如何强制 Kotlin “何时”涵盖所有可能的选项?