Вклад и обучение ГРУ - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь обучить RNN, используя слой GRU на нескольких последовательностях len N. Как настроить ввод слоя GRU и мои данные обучения и проверки?

Я пробовал разные input_shape (например, (None, N, 2), (N, 2), (None, 2) ...), мои данные имеют 2 столбца и последовательность размером N.

def get_batch(train, ind):
    X = np.array([train.loc[i * N: (i+1) * N - 1][['col_1', 'col_2']].values for i in ind])
    Y = np.array([train.loc[i * N: (i+1) * N - 1][['target']].values for i in ind])
    return X,Y

model = Sequential()
model.add(CuDNNGRU(20, input_shape=(2, 1)))
model.add(Dropout(.4))
model.add(Dense(20, activation='relu'))
model.add(Dropout(.5))
model.add(Dense(1))

model.compile(optimizer=adam(lr=0.005), loss="mae")

def cross_val(ind, train):
    fold_size = int(len(ind) / 5)
    for i in range(5):
        val_ind = ind[i * fold_size: (i+1) * fold_size]
        train_ind = [x for x in ind if x not in val_ind]
        X_train, Y_train = get_batch(train, train_ind)
        X_val, Y_val = get_batch(train, val_ind)
        model.fit(X_train, Y_train, validation_data=(X_val, Y_val))

cross_val(ind, train)

Я получаю такую ​​ошибку:

ValueError: Error when checking target: expected dense_54 to have 2 dimensions, but got array with shape (8, 4096, 1)

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Я пробовал некоторые вещи, и мне удалось тренировать мою модель, но только по одной последовательности за раз.

def create_model():
    model = Sequential()
    model.add(CuDNNGRU(20, input_shape=(2, 1)))
    model.add(Dense(20, activation='relu'))
    model.add(Dense(1))

    model.compile(optimizer=adam(lr=0.005), loss="mae")
    return model

def cross_val(ind, train):
    fold_size = int(len(ind) / 5)
    for i in range(5):
        model = create_model()
        val_ind = ind[i * fold_size: (i+1) * fold_size]
        train_ind = [x for x in ind if x not in val_ind]
        X_train, Y_train = get_batch(train, train_ind)
        X_val, Y_val = get_batch(train, val_ind)
        for j in range(len(X_train)):
            model.fit(X_train[j], Y_train[j], validation_data=(X_val[0], Y_val[0]))

cross_val(ind, train)

Мой вопрос, могу ли я удалить петлю for j in ...?

0 голосов
/ 22 мая 2019

Ладно, думаю, я понял, ваша модель должна быть:

from keras.layers import TimeDistributed

model = Sequential()
model.add(CuDNNGRU(20, return_sequences=True, input_shape=(2, 1)))
model.add(TimeDistributed(Dropout(.4)))
model.add(TimeDistributed(Dense(20, activation='relu')))
model.add(TimeDistributed(Dropout(.5)))
model.add(TimeDistributed(Dense(1)))

Поскольку у вас есть один выход на шаг времени, вы хотите вернуть последовательность

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