RNN з багатьма можливостями


27

У мене є небагато знань самоучки, що працюють з алгоритмами машинного навчання (основні матеріали типу "Випадкова лісова та лінійна регресія"). Я вирішив розгалужуватися і почати вивчати RNN з Керасом. Переглядаючи більшість прикладів, які зазвичай передбачають передбачення запасів, я не зміг знайти жодних основних прикладів використання декількох функцій, крім 1 стовпця, який є датою функції, а інший є результатом. Чи є ключова фундаментальна річ, яку я пропускаю, чи щось таке?

Якщо хтось має приклад, я дуже вдячний.

Спасибі!


1
Не впевнений, що ви мали на увазі під "кількома можливостями". Якщо ви маєте на увазі більше, ніж одна особливість, що впливає на навчання, то ви просто використовуєте багатовимірну матрицю дизайну. Проясніть на прикладі чи чомусь.
horaceT

@horaceT Я розробив multiple features тут більш конкретний питання про те, як використовувати RNN для прогнозування часових рядів з функціями, що містять числові дані та нечислові дані?
hhh

Відповіді:


25

Повторні нейронні мережі (RNN) призначені для вивчення даних послідовностей. Як ви здогадуєтесь, вони напевно можуть приймати декілька функцій як вхідні дані! RNN Keras приймають двовимірні входи ( T , F ) часових кроків T і функції F (я ігнорую розмір партії тут).

Однак, вам не завжди потрібні або потрібні проміжні часові кроки, t = 1, 2 ... ( T - 1). Тому Керас гнучко підтримує обидва режими. Щоб воно виводило всі T часові кроки, перейдіть return_sequences=Trueдо свого RNN (наприклад, LSTMабо GRU) під час створення. Якщо ви хочете лише останній часовий крок t = T , тоді використовуйте return_sequences=False(це типово, якщо ви не переходите return_sequencesдо конструктора).

Нижче наведено приклади обох цих режимів.

Приклад 1: Вивчення послідовності

Ось короткий приклад підготовки LSTM (типу RNN), який зберігає всю послідовність навколо. У цьому прикладі кожна точка вхідних даних має 2 часових кроки, кожен з яких має 3 функції; вихідні дані мають 2 часові кроки (тому що return_sequences=True), кожен з яких має 4 точки даних (тому що це розмір, який я передаю LSTM).

import keras.layers as L
import keras.models as M

import numpy

# The inputs to the model.
# We will create two data points, just for the example.
data_x = numpy.array([
    # Datapoint 1
    [
        # Input features at timestep 1
        [1, 2, 3],
        # Input features at timestep 2
        [4, 5, 6]
    ],
    # Datapoint 2
    [
        # Features at timestep 1
        [7, 8, 9],
        # Features at timestep 2
        [10, 11, 12]
    ]
])

# The desired model outputs.
# We will create two data points, just for the example.
data_y = numpy.array([
    # Datapoint 1
    [
        # Target features at timestep 1
        [101, 102, 103, 104],
        # Target features at timestep 2
        [105, 106, 107, 108]
    ],
    # Datapoint 2
    [
        # Target features at timestep 1
        [201, 202, 203, 204],
        # Target features at timestep 2
        [205, 206, 207, 208]
    ]
])

# Each input data point has 2 timesteps, each with 3 features.
# So the input shape (excluding batch_size) is (2, 3), which
# matches the shape of each data point in data_x above.
model_input = L.Input(shape=(2, 3))

# This RNN will return timesteps with 4 features each.
# Because return_sequences=True, it will output 2 timesteps, each
# with 4 features. So the output shape (excluding batch size) is
# (2, 4), which matches the shape of each data point in data_y above.
model_output = L.LSTM(4, return_sequences=True)(model_input)

# Create the model.
model = M.Model(input=model_input, output=model_output)

# You need to pick appropriate loss/optimizers for your problem.
# I'm just using these to make the example compile.
model.compile('sgd', 'mean_squared_error')

# Train
model.fit(data_x, data_y)

Приклад 2: Вивчення останнього кроку часу

Якщо, з іншого боку, ви хочете навчити LSTM, який видає лише останній часовий крок у послідовності, тоді вам потрібно встановити return_sequences=False(або просто видалити його повністю з конструктора, оскільки Falseце за замовчуванням). І тоді ваші вихідні дані ( data_yу прикладі вище) потрібно переставити, оскільки вам потрібно лише надати останній часовий крок. Отже, у цьому другому прикладі кожна точка вхідних даних все ще має 2 кроки часу, кожен з яких має 3 функції. Однак вихідні дані є лише одним вектором для кожної точки даних, тому що ми зрівняли все до одного часового кроку. Кожен з цих вихідних векторів все ж має 4 функції (адже саме це розмір, який я передаваю LSTM).

import keras.layers as L
import keras.models as M

import numpy

# The inputs to the model.
# We will create two data points, just for the example.
data_x = numpy.array([
    # Datapoint 1
    [
        # Input features at timestep 1
        [1, 2, 3],
        # Input features at timestep 2
        [4, 5, 6]
    ],
    # Datapoint 2
    [
        # Features at timestep 1
        [7, 8, 9],
        # Features at timestep 2
        [10, 11, 12]
    ]
])

# The desired model outputs.
# We will create two data points, just for the example.
data_y = numpy.array([
    # Datapoint 1
    # Target features at timestep 2
    [105, 106, 107, 108],
    # Datapoint 2
    # Target features at timestep 2
    [205, 206, 207, 208]
])

# Each input data point has 2 timesteps, each with 3 features.
# So the input shape (excluding batch_size) is (2, 3), which
# matches the shape of each data point in data_x above.
model_input = L.Input(shape=(2, 3))

# This RNN will return timesteps with 4 features each.
# Because return_sequences=False, it will output 2 timesteps, each
# with 4 features. So the output shape (excluding batch size) is
# (2, 4), which matches the shape of each data point in data_y above.
model_output = L.LSTM(4, return_sequences=False)(model_input)

# Create the model.
model = M.Model(input=model_input, output=model_output)

# You need to pick appropriate loss/optimizers for your problem.
# I'm just using these to make the example compile.
model.compile('sgd', 'mean_squared_error')

# Train
model.fit(data_x, data_y)

Дякую за велике пояснення. Який взаємозв'язок між точкою №1 та точкою №2. Наприклад, у першій ситуації, якщо ви видалили точку даних 2 і помістили її під точку 1, то тепер у нас є 4 етапи часу. Як це вплине на модель в цілому?
Rjay155

Особливих взаємозв'язків між точками даних немає. Хороший навчальний набір з глибокого навчання матиме багато десятків тисяч або навіть мільйонів точок даних. Один пункт даних = один навчальний зразок, ось і все. Якби ви "зливали" точки даних №1 та №2, то data_xпросто містили б одну точку даних, і ця точка матиме чотири часові кроки, кожен з 3 вимірів (і аналогічно, вам доведеться об'єднати data_yоднаково). Кількість часових кроків, які ви використовуєте, просто залежить від того, що ви намагаєтеся моделювати (і скільки часових кроків є актуальними для цього процесу).
Адам Сипнєвський

@Adam Sypniewski У мене питання щодо у. data_y = numpy.array ([# Дані 1 , 208], [1, 0]]]), якщо одна з моїх y є категоричними ознаками. Як би я це структурував. Дякую!
Хуа Є

2
У такому випадку вам, ймовірно, слід подати вихід RNN в щільний шар, щоб кожен часовий крок виведення був відображений в категорії "гарячі".
Адам Сипнєвський

Як тут можна уявити результати? Деякі сюжети були б корисні.
hhh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.