reinforcement-learning - RL Card Game DQN 上的预测输出为 NaN
问题描述
我正在尝试为流行的葡萄牙纸牌游戏制作强化学习项目。我有环境工作。该代码可以使用随机选择自行运行 n 轮。
为了快速解释,游戏类似于 Hearts。它有2支球队的4名球员。每个玩家有 10 张牌,如果可能的话,玩下花色,直到没有牌为止。每墩计分,10墩后得分超过60分的队伍获胜。
首先,我对如何“编码”卡片/套牌有一些疑问。我将桌上的牌、手头的牌和已经打过的牌传递给模型。我对甲板进行了一次热编码,4套花色,10个数字/数字。我还必须包括王牌(取自回合开始)。例如,一张牌看起来像:[ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ],其中前四个数字是花色,并且最后一个是王牌(布尔值),其余的是什么牌(2、3、4、5、6、j、q、k、7、a)。我正在为每手牌、每张牌桌、每张牌都传递牌组,所以 40*3,每张牌有 15 个特征(展平时有 1800 个特征)。可能这不是最好的方法,如果有人可以就此提出建议,那就太好了。
有了这些数据,我将 1 个玩家设置为 AI 代理。当轮到 AI 时,状态是手牌、桌上的牌、打出的牌。对于下一个状态,我将使用相同类型的数据通过技巧结束。该技巧的奖励是累积值(最多 120 分)。当我运行代码时,损失初始输出一个值,就像第一次一样,然后显示 NaN。所以预测也以 NaN 的形式出现(我有 10 个输出,手上的每张牌都有 1 个。也对这个有一些疑问,因为它们从 10 张牌开始,但随着游戏的进行和牌的开始,这个数字变为零。)
这是训练的代码:
async expReplay() {
console.debug('Training...')
const minibatch = await this.memory.concat().sort(() => .5 - Math.random()).slice(0, this.batchSize)
for (let i = 0; i < minibatch.length - 1; i++) {
let [state, action, reward, next_state, done] = minibatch[i]
state = await tf.concat(state).flatten().reshape([1, this.stateSize])
next_state = await tf.concat(next_state).flatten().reshape([1, this.stateSize])
let target = reward
if (!done) {
let predictNext = await this.model.predict(next_state)
target = reward + this.gamma * predictNext.argMax().dataSync()[0]
}
let target_f = await this.model.predict(state).dataSync()
target_f[action] = target
target_f = await tf.tensor2d(target_f, [1, this.actionSize])
await this.model.fit(state, target_f, {
epochs: 1,
verbose: 1,
callbacks: {
onEpochEnd: (epoch, logs) => {
process.stdout.write(`${logs.loss} ${logs.acc} \r`)
}
}
})
await state.dispose()
await next_state.dispose()
await target_f.dispose()
}
if (this.epsilon > this.epsilonMin) {
this.epsilon *= this.epsilonDecay
}
return 'Training... stop!'
}
这个循环,我以前在 DQN 上使用过,也用于我正在试验的比特币交易者,它运行良好。所以我猜我的数据在某个地方是错误的。我已经记录了 state 和 next_state 来检查 NaN 但没有发现任何...
如果您需要更多信息,请询问!
解决方案
推荐阅读
- sql - SUBSTR 和 INSTR SQL 甲骨文
- angular - 使用 startWith 时 RxJS 跳过去抖动
- azure - 在同一环境中混合 Service Fabric 编程模型
- hyperledger-fabric - Hyperledger Fabric:错误 [lib/handler.js] 与对等方聊天流 - 出现错误:“错误:14 不可用:EOF\n at createStatusError
- css - 如何在 Twitter Bootstrap 中实现“拖出菜单”?
- php - PHP以奇怪的方式计算
- asp.net-mvc-5.2 - 从 ReturnUrl 返回 MVC 5 中的 QueryString
- excel - 在 Excel 中使用 IF 数组
- excel - 在两列数据中查找匹配项
- rabbitmq - RabbitMQ:检查发布者的队列大小