Модель Кераса последовательно недооценивает цель - PullRequest
0 голосов
/ 25 января 2020

Я не понимаю, почему моя модель 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

1 Ответ

0 голосов
/ 25 января 2020

Это потому, что ваша модель была построена для этого поведения. Для модели основной целью является получение оптимизированной функции, которая максимально подходит для любых невидимых данных. В результате ваша модель начинает учиться на тренировочных примерах. Проблема заключается в том, что в процессе обучения ваша модель имеет тенденцию переписываться на ваших тренировочных образцах, теряя свою способность к обобщению, то есть, хорошо работает с невидимыми данными.

Чтобы избежать этого, мы используем некоторые приемы, одним из которых является 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...