Keras模型始终低估了目标

问题描述 投票:1回答:1

我不明白为什么我的keras模型会低估目标。我在下面列出了最小的示例。如果简化模型架构,则预测将更接近真实的预测。但是我困惑的是,如果复杂的模型过度拟合,为什么预测值不是非常接近训练的真实价值却如此系统地偏离呢? (该图用于训练数据)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
from sklearn.metrics import mean_squared_error

def create_dataset(num_series=1, num_steps=1000, period=500, mu=1, sigma=0.3):
    noise = np.random.normal(mu, sigma, size=(num_series, num_steps))
    sin_minumPi_Pi = np.sin(np.tile(np.linspace(-np.pi, np.pi, period), int(num_steps / period)))
    sin_Zero_2Pi = np.sin(np.tile(np.linspace(0, 2 * np.pi, period), int(num_steps / period)))
    pattern = np.concatenate((np.tile(sin_minumPi_Pi.reshape(1, -1),
                                      (int(np.ceil(num_series / 2)),1)),
                              np.tile(sin_Zero_2Pi.reshape(1, -1),
                                      (int(np.floor(num_series / 2)), 1))
                             ),
                             axis=0
                            )

    target = noise + pattern
    return target[0]
avail=create_dataset(mu=5)

window_size = 7
def getdata(data,window_size):
    X,y = np.array([1]*window_size),np.array([])

    for i in range(window_size, len(data)):
        X = np.vstack((X,data[i-window_size:i]))
        y = np.append(y,data[i:i+1])

    return X[1:],y

X,y = getdata(avail,window_size)

def train_model(X,y,a_dim=100,epoch=50,batch_size=32,d=0.2):
    model = Sequential()
    model.add(Dense(a_dim,activation='relu',input_dim=X.shape[1]))
    model.add(Dropout(d))
    model.add(Dense(a_dim,activation='relu'))
    model.add(Dropout(d))
    model.add(Dense(a_dim,activation='relu'))
    model.add(Dropout(d))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer='adam')
    model.fit(X, y, epochs=epoch,batch_size=batch_size,  verbose=2)
    return model

model = train_model(X,y)

plt.plot(model.predict(X)[:,0])
plt.plot(y)
plt.show()

enter image description here

python keras predict
1个回答
0
投票

这是因为您的模型是为此行为构建的。对于模型而言,获得优化功能的主要目的是使其尽可能地适合任何看不见的数据。这样做,您的模型便开始从训练样本中学习。问题在于,在训练过程中,您的模型可能会过度适合您的训练样本,从而失去了泛化能力,即在看不见的数据上表现良好。

为避免这种情况,我们使用了一些技术,其中之一是dropout。您也使用了它:

model.add(Dropout(d))

带有默认参数d=0.2

def train_model(X,y,a_dim=100,epoch=50,batch_size=32,d=0.2):

如上所述,这是为了避免训练数据过度拟合,这就是为什么模型会不断高估它,但对看不见的数据进行更好的估计的原因。

将其他dropout值传递给train_model()功能,您将更好地适应火车数据:

model = train_model(X, y, d=0.0)

plt.plot(model.predict(X)[:,0])
plt.plot(y)
plt.show()

Out:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.