我是keras的新手。当我实现线性回归时,我遇到了一个纳米损失,这让我非常困扰。我把我的源代码放在下面:
from keras.layers import Dense,Activation
from keras.models import Sequential
import numpy as np
model = Sequential()
model.add(Dense(1,input_shape=(1,)))
model.add(Activation('linear'))
model.compile(loss='mse',optimizer='sgd',metrics=['mse'])
x = np.linspace(1,100,1e3)
y = 3*x + 1 + np.random.normal(size=x.shape)
model.fit(x,y,batch_size=100)
然后损失的输出是nan。 但是当我更改训练数据时,相应的代码是:
x = np.linspace(1,10,1e3)
一切都很好,最后我可以得到近似为3.0的w和近似为1的b。 有人知道为什么会这样吗?提前谢谢。
答案 0 :(得分:1)
问题是,x = np.linspace(1,100,1e3)
会为您提供1000个数字,其值介于1到100之间。想象一下所有这些数字乘以某个随机值w
来创建预测(x * w
) ,然后平方并求和以获得MSE函数的损失值。这个数字非常大,从inf
变为nan
。
一个好的做法是使您的数据保持平均值0.0和低方差(例如1)
在这种情况下,一个简单的解决方法是将数据划分为100,如下所示:
x = np.linspace(1,100,1e3) / 100
答案 1 :(得分:0)
我是NN新手,我花了整整两天的时间与Keras一起制作线性回归模型,直到我最终发现需要规范化的数据,以便更快地学习。
您可以将这两行添加到您的程序中:
from·keras.layers·import·BatchNormalization
model.add(BatchNormalization())