gpt4 book ai didi

python - 无法正确训练神经网络

转载 作者:太空宇宙 更新时间:2023-11-04 11:16:24 26 4
gpt4 key购买 nike

我正在尝试训练通过 Keras 实现的神经网络 (NN) 以实现以下功能。

y(n) = y(n-1)*0.9 + x(n)*0.1

所以想法是将一个信号作为 train_x 数据并通过上述函数得到一个 train_y 数据,给我们一个 (train_x, train_y) 训练数据。

import numpy as np
from keras.models import Sequential
from keras.layers.core import Activation, Dense
from keras.callbacks import EarlyStopping
import matplotlib.pyplot as plt

train_x = np.concatenate((np.ones(100)*120,np.ones(150)*150,np.ones(150)*90,np.ones(100)*110), axis=None)
train_y = np.ones(train_x.size)*train_x[0]

alpha = 0.9

for i in range(train_x.size):
train_y[i] = train_y[i-1]*alpha + train_x[i]*(1 - alpha)

train_x data vs train_y data plot

问题中的函数 y(n) 是一个低通函数,使得 x(n) 的值不会突然改变,如图所示。

然后我制作一个 NN 并用 (train_x, train_y) 拟合它并绘制

model = Sequential()

model.add(Dense(128, kernel_initializer='normal', input_dim=1, activation='relu'))

model.add(Dense(256, kernel_initializer='normal', activation='relu'))
model.add(Dense(256, kernel_initializer='normal', activation='relu'))
model.add(Dense(256, kernel_initializer='normal', activation='relu'))

model.add(Dense(1, kernel_initializer='normal', activation='linear'))

model.compile(loss='mean_absolute_error',
optimizer='adam',
metrics=['accuracy'])

history = model.fit(train_x, train_y, epochs=200, verbose=0)

print(history.history['loss'][-1])
plt.plot(history.history['loss'])
plt.show()

loss_plot_200_epoch

最后的loss值大概是2.9,我觉得已经很不错了。但后来准确度图是这样的

accuracy_plot_200_epochs

所以当我检查神经网络对训练数据的预测时

plt.plot(model.predict(train_x))
plt.plot(train_x)
plt.show()

train_x_vs_predict_x

这些值只是偏移了一点,仅此而已。我尝试更改激活函数、神经元数量和层数,但结果仍然相同。我做错了什么?

---- 编辑----

使 NN 接受二维输入并按预期工作

import numpy as np
from keras.models import Sequential
from keras.layers.core import Activation, Dense
from keras.callbacks import EarlyStopping
import matplotlib.pyplot as plt

train_x = np.concatenate((np.ones(100)*120,np.ones(150)*150,np.ones(150)*90,np.ones(100)*110), axis=None)
train_y = np.ones(train_x.size)*train_x[0]

alpha = 0.9

for i in range(train_x.size):
train_y[i] = train_y[i-1]*alpha + train_x[i]*(1 - alpha)

train = np.empty((500,2))

for i in range(500):
train[i][0]=train_x[i]
train[i][1]=train_y[i]

model = Sequential()

model.add(Dense(128, kernel_initializer='normal', input_dim=2, activation='relu'))

model.add(Dense(256, kernel_initializer='normal', activation='relu'))
model.add(Dense(256, kernel_initializer='normal', activation='relu'))
model.add(Dense(256, kernel_initializer='normal', activation='relu'))

model.add(Dense(1, kernel_initializer='normal', activation='linear'))

model.compile(loss='mean_absolute_error',
optimizer='adam',
metrics=['accuracy'])

history = model.fit(train, train_y, epochs=100, verbose=0)

print(history.history['loss'][-1])
plt.plot(history.history['loss'])
plt.show()

最佳答案

如果我执行您的代码,我会得到以下 X-Y 值图:

Plot of the X-Y values

如果我没有遗漏这里的一些重要信息,而您真的将其输入神经网络,您可能无法期待更好的结果。原因是,神经网络只是一个函数,只能为一个输入计算一个输出向量。在您的情况下,输出向量将仅包含一个元素(您的 y 值),但正如您在上图中所见,对于 x=90,不只有一个输出。所以你输入神经网络的东西,不能真正作为一个函数来计算,所以网络很可能会尝试计算点 ~(90, 145) 和 ~(150, 150) 之间的直线。我的意思是图中的“上面的线”。

关于python - 无法正确训练神经网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56913286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com