【发布时间】:2021-10-07 09:59:25
【问题描述】:
我目前有一个我训练的 DNN,它可以预测游戏所处状态的 one-hot 编码分类。基本上,假设有三个状态,0, 1, or 2.
现在,我通常会使用 categorical_cross_entropy 作为损失函数,但我意识到并不是所有的分类对于我的状态都是不相等的。例如:
- 如果模型预测它应该是状态 1,那么如果分类错误,我的系统不会有任何成本,因为状态 1 基本上什么都不做,所以奖励 0x。
- 如果模型正确预测状态 0 或 2(即预测 = 2 并且正确 = 2),那么奖励应该是 3 倍。
- 如果模型不正确预测状态 0 或 2(即预测 = 2 且正确 = 0),那么奖励应该是 -1x。
我知道我们可以在 Keras 中声明我们的自定义损失函数,但我一直卡在形成它。有人对如何转换该伪代码有建议吗?我不知道如何在向量操作中做到这一点。
其他问题:我认为我基本上是在追求奖励功能。这和损失函数一样吗?谢谢!
def custom_expectancy(y_expected, y_pred):
# Get 0, 1 or 2
expected_norm = tf.argmax(y_expected);
predicted_norm = tf.argmax(y_pred);
# Some pseudo code....
# Now, if predicted == 1
# loss += 0
# elif predicted == expected
# loss -= 3
# elif predicted != expected
# loss += 1
#
# return loss
咨询的来源:
Custom loss in Keras with softmax to one-hot
代码更新
import tensorflow as tf
def custom_expectancy(y_expected, y_pred):
# Get 0, 1 or 2
expected_norm = tf.argmax(y_expected);
predicted_norm = tf.argmax(y_pred);
results = tf.unstack(expected_norm)
# Some pseudo code....
# Now, if predicted == 1
# loss += 0
# elif predicted == expected
# loss += 3
# elif predicted != expected
# loss -= 1
for idx in range(0, len(expected_norm)):
predicted = predicted_norm[idx]
expected = expected_norm[idx]
if predicted == 1: # do nothing
results[idx] = 0.0
elif predicted == expected: # reward
results[idx] = 3.0
else: # wrong, so we lost
results[idx] = -1.0
return tf.stack(results)
我认为这就是我所追求的,但我还没有完全弄清楚如何构建正确的张量(应该是批量大小)以返回。
【问题讨论】:
标签: python tensorflow machine-learning keras deep-learning