为什么神经网络不能学习曲线?

2024-04-28 19:38:58 发布

您现在位置:Python中文网/ 问答频道 /正文

为了实验的目的,我使用tf.keras建立了一个神经网络,其中一个神经元附着在乙状结肠上。要学习的目标曲线是:

#target function
f = lambda x:  - 1./(np.exp(10.*x)+1.)

我从曲线上取了几个点作为训练数据

#creat training data

x_train = np.linspace(-1, 1, 111)
y_train = f(x_train)


#test data

x_test = np.linspace(-1, 1, 11)
y_test = f(x_test)

模型如下:

model = tf.keras.models.Sequential([
  tf.keras.layers.Dense(1, activation='sigmoid', input_shape=(1,), use_bias=True)
])

model.compile(optimizer=tf.keras.optimizers.Adam(0.01),
              loss='mse',
              metrics=['MeanAbsoluteError'])

但它不能学习曲线。测试代码为

x_test = np.linspace(-1, 1, 11)
plt.plot(x_test, f(x_test), label='true')
y_pred = model.predict(x_test)
plt.plot(x_test, y_pred, label='predict')
plt.legend()
plt.show()

enter image description here

代码由colab共享,请参阅

https://colab.research.google.com/drive/1LQ9MXjrMxsImc80o6wMk1oKfeadnNaG3

有明显的错误,有人能帮忙吗


Tags: testdatamodelplottfnptrainplt
1条回答
网友
1楼 · 发布于 2024-04-28 19:38:58

sigmoid激活函数只能输出0到1之间的值。由于f(x)的所有值都是负数,因此无法学习该函数

处理这个问题的一种方法是将值规范化为[0, 1]。在您的情况下,简单地学习f = lambda x: 1./(np.exp(10.*x)+1.)就可以了

相关问题 更多 >