RNN с несколькими функциями

27

У меня есть немного самообучаемых знаний по работе с алгоритмами машинного обучения (базовый материал типа «Случайный лес» и «Линейная регрессия»). Я решил расшириться и начать изучать RNN с Керасом. Рассматривая большинство примеров, которые обычно включают прогнозирование запасов, я не смог найти каких-либо базовых примеров реализации нескольких функций, кроме одного столбца, представляющего дату объекта, а другого - выходных данных. Есть ли какая-то ключевая вещь, по которой я скучаю или что-то еще?

Если у кого-то есть пример, я был бы очень признателен.

Благодарность!

Rjay155
источник
1
Не уверен, что вы имели в виду под «множественными функциями». Если вы имеете в виду несколько функций, влияющих на обучение, то вы просто используете многомерную матрицу проектирования. Просьба уточнить на примере или что-то.
horaceT
@horaceT Я разработал multiple features здесь более конкретный вопрос о том, как использовать RNN для прогнозирования временных рядов с функциями, содержащими числовые и нечисловые данные?
HHH

Ответы:

25

Рекуррентные нейронные сети (RNN) предназначены для изучения данных последовательности. Как вы догадываетесь, они определенно могут принимать несколько функций в качестве входных данных! RNN Keras принимают двумерные входы ( T , F ) временных шагов T и функции F (здесь я игнорирую размер пакета).

Однако вам не всегда нужны или нужны промежуточные временные шаги, t = 1, 2 ... ( T - 1). Поэтому Keras гибко поддерживает оба режима. Чтобы он вывел все 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)
Адам Сипневски
источник
Спасибо за ваше великолепное объяснение. Какова связь между datapoint # 1 и datapoint # 2. Например, в первой ситуации, если вы удалили datapoint 2 и поместили его под datapoint 1, то теперь у нас есть 4 временных шага. Как это повлияет на модель в целом?
Rjay155
Между точками данных нет особых отношений. Хороший учебный набор для глубокого обучения будет иметь много десятков тысяч или даже миллионов точек данных. Одна точка данных = одна обучающая выборка, вот и все. Если бы вы «объединяли» точки данных № 1 и № 2, то data_xпросто содержали бы одну точку данных, и эта точка данных имела бы четыре временных шага, каждое из 3-х измерений (и аналогично, вы должны были бы объединить data_yтаким же образом). Количество используемых вами временных шагов просто зависит от того, что вы пытаетесь смоделировать (и сколько временных шагов относится к этому процессу).
Адам Сипневски
@ Adam Sypniewski У меня есть вопрос по поводу y. data_y = numpy.array ([# Datapoint 1 # Целевые объекты на временном шаге 2 [[105, 106, 107, 108], [0, 1]], # Datapoint 2 # Целевые объекты на временном шаге 2 [[205, 206, 207 , 208], [1, 0]]]), если один из моих у - категориальные черты. Как бы я это структурировал? Спасибо!
Хуа Е
2
В этом случае вам, вероятно, следует подать выходные данные RNN в плотный слой, чтобы каждый выходной временной интервал отображался в категории «горячая».
Адам Сипневски
Как вы можете визуализировать результаты здесь? Некоторые участки были бы полезны.
HHH