【发布时间】:2019-11-27 00:59:32
【问题描述】:
我在 Keras 中构建了一个神经网络来学习 4 个坐标 x,y,z,d(带有 d=sqrt(x**2+y**2+z**2))和一个标量值之间的映射。我的训练集由 x,y,z,d 的 1500 个值组成,与标量函数的 1500 个值相关联。我的测试集有 500 个样本。
我的神经网络产生正确的数据“趋势”,但幅度不正确。下面的图表应该清楚地说明什么意思。它们显示了训练和测试集的标量函数的值;在每个图中,显示了原始样本和 NN 预测。我想询问有关如何让 NN 也正确学习幅度的指示,避免图中清晰可见的“插值”效应。
from __future__ import division
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
from tensorflow.keras import optimizers
input_sig = Input(batch_shape=(None,4))
output = Dense(1)(input_sig)
NN = Model(input_sig, output)
nadam = optimizers.Nadam()
NN.compile(optimizer=nadam, loss='logcosh', metrics=['accuracy'])
history = NN.fit(x = x_train, y = y_train,
epochs=1000,
batch_size=100,
validation_split=0.2)
prediction_training = np.squeeze(NN.predict(x_train))
prediction_testing = np.squeeze(NN.predict(x_test))
plt.plot(y_train, color='blue', label='Original training')
plt.plot(prediction_training, color='red', label='Prediction training')
plt.legend(fontsize='x-large')
plt.show()
plt.close()
plt.plot(y_test, color='blue', label='Original testing')
plt.plot(prediction_testing, color='red', label='Prediction testing')
plt.legend(fontsize='x-large')
plt.show()
plt.close()
训练集图
测试集图
【问题讨论】:
-
我不清楚您是如何生成
x_train和y_train的。如果样本之间没有依赖关系,我认为您的数据中没有“趋势”。 -
你凭什么说它学会了“趋势”?我不清楚它是否至少来自图像。比如,你怎么知道模型是不是在区间之间随机波动?
-
@thushv89 我说它已经正确地了解了趋势,因为如果你放大图,你可以看到红线“跟随”蓝线的运动。但是,NN 无法在信号中产生尖峰,更一般地说,无法产生与原始信号一样高的信号
-
@HanWang 我明白你的意思。但是,我不觉得它已经学会了(这是我的观点)。我觉得数据太不稳定,无法从中学习。您可以使用一些数据规范化来使线条更平滑吗?那么你可能有更好的学习机会。
标签: python tensorflow machine-learning keras neural-network