Как правильно структурировать 3D-ввод для Keras LSTM - PullRequest
1 голос
/ 22 октября 2019

У меня есть набор данных, который содержит много наблюдений снимков во времени и 1 или 0 в качестве метки для каждого наблюдения. Допустим, каждое наблюдение содержит 3 особенности. Я хочу обучить LSTM, который будет принимать последовательность из n наблюдений и пытаться классифицировать n-е наблюдение как 1 или 0.

Итак, если у нас есть набор данных, который выглядит следующим образом:

# X = [[0, 1, 1], [1, 0, 0], [1, 1, 1], [1, 1, 0]]
# y = [1, 0, 1, 0]
# so X[0] = y[0], X[1] = y[1]
# . and I would like to input X[0] + X[1] to classify X[1] as y[1]
# . How would I need to structure this below?


X = [[0, 1, 1], [1, 0, 0], [1, 1, 1], [1, 1, 0]]
y = [1, 0, 1, 0]

def create_model():
  model = Sequential()
  # input_shape[0] is equal to 2 timesteps?
  # input_shape[1] is equal to the 3 features per row?
  model.add(LSTM(20, input_shape=(2, 3)))
  model.add(Dense(1, activation='sigmoid'))
  model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
  model.summary()

m = create_model()
m.fit(X, y)

Так что я хочу, чтобы X[0] и X[1] были входными данными для одной итерации обучения и должны быть классифицированы как y[1].

Мой вопрос такой. Как мне структурировать модель, чтобы правильно воспринимать эти данные? Я очень смущен input_shape, features, input_length, batches и т. Д. *

Ответы [ 2 ]

1 голос
/ 22 октября 2019

У вас правильная форма ввода. Я бы изменил входные данные, чтобы они были (batch_size, временные шаги, функции)

m = create_model()
X.reshape((batch_size, 2, 3))
m.fit(X, y)

Общие размеры пакетов - 4, 8, 16, 32, но для небольшого набора данных влияние размера пакета менее важно. И когда вы хотите предсказать, используйте batch_size = 1

1 голос
/ 22 октября 2019

Приведенный ниже фрагмент кода может помочь уточнить:

from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np

# Number of samples = 4, sequence length = 3, features = 2

X = np.array( [ [ [0, 1], [1, 0,], [1, 1] ], 
                [ [1, 1], [1, 1,], [1, 0] ], 
                [ [0, 1], [1, 0,], [0, 0] ], 
                [ [1, 1], [1, 1,], [1, 1] ]] )

y = np.array([[1], [0], [1], [0]])
print(X)
print(X.shape)
print(y.shape)

model = Sequential()
model.add(LSTM(20, input_shape=(3, 2)))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()

model.fit(X, y)

Кроме того, на странице документации Keras: https://keras.io/getting-started/sequential-model-guide/ посмотрите на пример "Stacked LSTM для классификации последовательностей" внизу. Это может помочь.

Как правило, при использовании Keras размер пакета / размер образца не указывается в слоях - он автоматически выводится из входных данных.

Надеюсь, это поможет.

...