【发布时间】:2022-01-09 03:47:30
【问题描述】:
我已经创建了一个 y ~ x**2 的数据集
但是,当我训练神经网络时,它无法拟合二次方程。
这是我的模型。
model2 = tf.keras.models.Sequential(
[tf.keras.layers.Dense(100, activation='relu'),
tf.keras.layers.Dense(100, activation='relu'),
tf.keras.layers.Dense(100, activation='relu'),
tf.keras.layers.Dense(100, activation='relu'),
tf.keras.layers.Dense(100, activation='relu'),
tf.keras.layers.Dense(100, activation='relu'),
tf.keras.layers.Dense(1)]
)
loss = tf.keras.losses.mse
optimizer = tf.keras.optimizers.Adam(learning_rate=0.0001)
model2.compile(optimizer=optimizer, loss=loss, metrics=tf.metrics.RootMeanSquaredError())
model2.fit(tf.expand_dims(X_train, -1), y_train, epochs=1000, verbose=1)
我对上述模型的思考过程是,我认为每个relu激活都会拟合一条局部线性线,并慢慢连接所有神经元形成一条二次线。
最后,我通过在输出层使用lambda x:x**2 的激活来进行拟合,但是,那是因为我知道该函数是 x**2。
所以我的问题是,在不知道真实函数的情况下,如何训练神经网络以拟合非线性曲线?
【问题讨论】:
-
您的 NN 无法拟合二次函数并没有任何理论上的原因。具有非线性激活函数(如 ReLU)的神经网络可以逼近任何函数,参见Universal approximation theorem。
标签: python tensorflow keras neural-network