使用ANN和Tensorflow来训练一个简单的已知方程Y=Sin(X)或Y=Cos(X)。损失函数是收敛的。损失函数收敛图。如果损失函数收敛,则意味着模型很好地拟合了我的训练数据集。
然而,当我预测传入参数训练集本身时,模型甚至无法预测训练数据,这是奇怪的。这里可以看到,在第200个值之后,模型显示没有任何训练如果损失已经收敛,那么模型应该完美地拟合火车数据集,但这里没有发生这种情况。我的代码有什么问题?
X = np.linspace(0,10*np.pi,1000)
Y = np.sin(X)
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(500,input_shape=(1,),activation='relu'))
model.add(tf.keras.layers.Dense(1))
opt = tf.keras.optimizers.Adam(0.01)
model.compile(optimizer=opt,loss='mse')
r= model.fit(X.reshape(-1,1),Y,epochs=100)
plt.plot(r.history['loss'])
Yhat = model.predict(X.reshape(-1,1)).flatten()
plt.plot(Y)
plt.plot(Yhat)
这是数据的本质。
这让我想起了以前的一篇论文,那篇论文表明人工神经网络甚至不能计算异或
无论如何,这里的原因是你的模型是浅的,浅网络比深度网络效率低得多。下面的模型
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(20,input_shape=(1,),activation='relu'))
model.add(tf.keras.layers.Dense(20,activation='relu'))
model.add(tf.keras.layers.Dense(1))
可能会表现得更好,即使它只有原始模型参数的1/3
,这是因为你越深入,模型可以创建更复杂的表示。要记住的核心内容是
深度学习模型不建立非线性决策边界作为每一个单元的基本设计是为了创建一些线性决策边界。那么是什么它是做什么的?它通过堆叠这些线性决策边界来表示线性可分离的数据
同时,最重要的是了解你的数据。在这种情况下,使用Probabilistic Models
将给出几乎完美的结果。您可以使用TensorFlow probability
轻松实现这些。