我有这个简单的模型(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:这个例子可能看起来很愚蠢但是对于一个更复杂的问题,我需要计算一个自定义的损失,我把问题简化为这个简单的例子。
感谢您的帮助
答案 0 :(得分:1)
经过几个小时的挣扎,我终于得到了解决方案(以及可能的解释)。
此示例中的问题(唯一的区别)是索引选择。尽管Tensorflow似乎支持它。它行为不正确。 (并且有问题的片段在Theano Backend下失败了)。即使损失计算正确,似乎导数也是错误的。误导优化器。这就是NN不训练的原因。我发现一个hacky但完美工作的解决方案是替换
y[:, 0]
通过
tensorflow.matmul(y, [[1.0], [0.0]])
我没有尝试,但如果你正在寻找多后端的东西,它也应该没关系keras.backend.dot。小心将浮动而不是整数放在权重中,否则不会进行类型检查。
希望它会帮助别人。