我有一个简单的模型(5个通道),我期望它返回第二个通道
它运作得很好,我得到了完美的零损失。
当我稍作调整(我在输出中添加了一个额外的通道)并且我决定不再关心第二个通道时,
我将其改为如下:
现在无法训练了。这对我来说似乎很疯狂。有人知道这是怎么回事吗?
附注:这个例子可能看起来很愚蠢,但对于一个更复杂的问题,我需要计算一个自定义损失,我将问题简化为这个简单的例子。
感谢您的帮助
回答:
经过几个小时的挣扎,我终于找到了解决方案(以及一个可能的解释)。
这个例子中的问题(也是唯一的区别)是索引选择。虽然它似乎得到了Tensorflow的支持,但它的行为并不正确。(并且在Theano后端下,问题片段会失败)。尽管损失计算正确,但似乎导数是错误的,误导了优化器。这就是神经网络无法训练的原因。我找到的一个虽然有点 hacky 但完美工作的解决方案是将
y[:, 0]
替换为
tensorflow.matmul(y, [[1.0], [0.0]])
我没有尝试过,但如果你是多后端的东西,应该用keras.backend.dot也可以。注意在权重中使用浮点数而不是整数,否则类型检查会失败。
希望这能帮助到其他人。