当前,我有一个函数f(x) = x^2
。
我有一个数据集,其特征是x,相应的标签是x ^ 2。
我希望我的机器学习模型能够准确地预测新值。
例如,对300的预测应接近300 * 300 = 90000
在我的代码中,我首先创建训练数据功能和标签,它们看起来像 功能:[0、1、2,... 999] 标签:[0,1,4,... 999 * 999]
import tensorflow as tf
import numpy as np
import logging
import matplotlib.pyplot as plt
logger = tf.get_logger()
logger.setLevel(logging.ERROR)
val = np.empty([1000], dtype = float)
val_squared = np.empty([1000], dtype = float)
#Create training data
for i in range(1000):
val[i] = i
val_squared[i] = i*i;
#Create layers of Deep Neural Network
l0 = tf.keras.layers.Dense(units = 500,input_shape=[1])
l1 = tf.keras.layers.Dense(units = 500, activation = 'sigmoid')
l2 = tf.keras.layers.Dense(units = 500, activation = 'sigmoid')
l3 = tf.keras.layers.Dense(units = 1)
model = tf.keras.Sequential([l0, l1, l2, l3])
model.compile(loss='mean_squared_error', optimizer = tf.keras.optimizers.Adam(lr=10))
history = model.fit(val,val_squared,epochs = 500, verbose = False, batch_size = 500)
plt.xlabel('Epoch Number')
plt.ylabel("Loss Magnitude")
plt.plot(history.history['loss'])
print("Prediction of 200: {}".format(model.predict([200.0])))
plt.show()
当绘制该图时,我们可以看到损耗收敛,这表明该模型正在学习。但是,实际预测与我们的预期值332823.16相比有很大差异,而不是40000。
可以在此处看到绘制的图形:https://imgur.com/a/GJMSrbV
我尝试将激活函数更改为relu和tanh,并调整了超参数以确保损耗收敛,但没有效果。我还有其他方法可以改善神经网络的性能吗?
答案 0 :(得分:1)
您的损失图显示的误差约为0.8E11,即80亿,这是非常大的损失,相当于您的预测中的误差约为30万。
原因可能是您的学习率是10,这是很高的(tf.keras.optimizers.Adam(lr=10)
)。通常,对于Adam,使用的学习率约为1e-3(0.001)或1e-4(0.0001)。
还有两点-您甚至不需要多层模型来求解y = x ^ 2,请尝试使用具有500个隐藏节点的单层模型开始。较小的模型收敛更快。