损耗计算中的Keras分量选择

时间:2017-04-19 23:54:17

标签: machine-learning tensorflow keras

我有这个简单的模型(5个频道),我希望它能返回第二个

git log --all --decorate --oneline --graph

效果很好,我完全零损失。

当我稍微调整一下(我在输出中添加一个额外的频道)时我决定不关心第二个频道。

我将其更改为:

import keras
import numpy as np
import keras.backend as K

data = np.random.normal(size = (1000, 5))

model = keras.models.Sequential()
model.add(keras.layers.Dense(10, activation = 'linear',input_shape = (5,)))
model.add(keras.layers.Dense(1, activation = 'linear'))

def loss(x, y):
    return K.mean(K.square(x - y))

model.compile('adam', loss)
model.fit(data, data[:, 1], epochs = 100)

现在不可能训练。这对我来说似乎很疯狂。有谁知道发生了什么?

PS:这个例子可能看起来很愚蠢但是对于一个更复杂的问题,我需要计算一个自定义的损失,我把问题简化为这个简单的例子。

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

经过几个小时的挣扎,我终于得到了解决方案(以及可能的解释)。

此示例中的问题(唯一的区别)是索引选择。尽管Tensorflow似乎支持它。它行为不正确。 (并且有问题的片段在Theano Backend下失败了)。即使损失计算正确,似乎导数也是错误的。误导优化器。这就是NN不训练的原因。我发现一个hacky但完美工作的解决方案是替换

y[:, 0]

通过

tensorflow.matmul(y, [[1.0], [0.0]])

我没有尝试,但如果你正在寻找多后端的东西,它也应该没关系keras.backend.dot。小心将浮动而不是整数放在权重中,否则不会进行类型检查。

希望它会帮助别人。