我极为精简的代码如下:
#!/usr/bin/python3
from keras.layers import Input
from keras.layers.core import Dense
from keras.models import Model
import numpy as np
inp = Input(shape=[1])
out = Dense(units=1, activation='linear')(inp)
model = Model(inputs=inp, outputs=out)
model.compile(loss='mean_absolute_error',
optimizer='rmsprop')
x=np.array([[0]])
y=np.array([[42]])
model.fit(x,y,epochs=1000, verbose=False)
prediction = model.predict(x)
print(prediction)
输出[[1.0091327]]
该模型有两个参数:一维输出的重量和偏差。而且重量并不重要,因为x
始终为0.这应该很容易训练。
如果我使用42
或0.42
代替-0.42
,那么它可以正常工作(4.2和-42不会)。所以我认为必须有某种规范化某处轻柔地压缩输出或偏向[-1,1]。
有谁知道这种规范化是什么以及如何将其关闭?
(在任何人告诉我之前我不应该使用神经网络这些愚蠢的东西,我的真实代码会做更多。我为了清晰和调试而编写了这个剥离版本。)
答案 0 :(得分:2)
不,没有内置规范化,即用户工作。
你所看到的是“为什么”我们使用标准化,没有它,优化问题要困难得多,在我运行这个例子之后,你可以看到损失不会接近于零并保持在41左右。 / p>
如果您进行一些更改,例如使用均方误差丢失并在50K历元中运行此示例,那么您可以将其收敛为零损失,并按预期输出42。
一个普通的初学者的错误是在不首先考虑训练损失的情况下查看预测,因为损失很高,这意味着预测将是错误的。