有没有办法专门优化张量流中神经网络的单个输出?

时间:2018-12-18 13:25:58

标签: python tensorflow neural-network

例如,如果我有一个神经网络在玩草稿/棋子,并试图做出无效动作,是否有办法专门优化该特定输出?

  ---------------------------------------
8 |    | bM |    | bM |    | bM |    | bM | 
  ---------------------------------------
7 | bM |    | bM |    | bM |    | bM |    | 
  ---------------------------------------
6 |    | bM |    | bM |    | bM |    | bM | 
  ---------------------------------------
5 |    |    |    |    |    |    |    |    | 
  ---------------------------------------
4 |    |    |    |    |    |    |    |    | 
  ---------------------------------------
3 | wM |    | wM |    | wM |    | wM |    | 
  ---------------------------------------
2 |    | wM |    | wM |    | wM |    | wM | 
  ---------------------------------------
1 | wM |    | wM |    | wM |    | wM |    | 
  ---------------------------------------
    A    B    C    D    E    F    G    H  

如果电路板看起来像这样,并且在草图区域中的每个可能移动都有一个输出神经元(在任何方向上最多移动2个),所以64 * 8个输出神经元(如果最高)概率输出是神经元8(或任何其他无效输出),类似于B1C2(B1是开始位置,C2是结束位置)。

如果神经网络的输出已经是概率分布,有没有办法更新网络以使该特定输出为0并更新所有其他输出并对其进行归一化?

我尝试查看在mnist数据集和adamoptimizer上训练的神经网络的示例,但是找不到仅更改一个特定输出而不更改整个输出层的任何内容。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

对于此特定示例,最好将网络重组为仅包括可能有效的移动。 B1C2永远不会是一个有效的举动,所以不要让它成为您网络的一部分。

对于可能有效但实际上无效的移动,例如B2C3(第一回合无效,但在移动当前在C3上的零件之后有效),您可以编写自定义激活函数,但是它可能会调整输出更容易。

您可以编写函数将每个无效举动设置为零,然后将所有其他答案除以(1-无效举动预测之和)。请注意,这假设您已经使用softmax作为最后一个激活函数。

根据以下后续问题进行编辑:

您可以编写一个函数,该函数将板状态和预测作为输入,并返回将无效移动设置为零并将其余预测归一化的预测。

如果您宁愿让网络了解哪些移动无效,而不是修改最终结果,则可以由损失功能处理。例如,如果您正在进行深度Q学习,那么您将为无效动作加重惩罚。