9

Я довольно новичок в Neural Networks и Keras Library, и мне интересно, как я могу использовать уровень вложения, как описано here, чтобы скрыть мои входные данные от 2D-тензора до 3D-тензора для RNN.Как использовать слой вставки для повторяющейся нейронной сети (RNN) в Keras

Say данные мои TimeSeries глядя следующим образом (с увеличением времени):

X_train = [ 
    [1.0,2.0,3.0,4.0], 
    [2.0,5.0,6.0,7.0], 
    [3.0,8.0,9.0,10.0], 
    [4.0,11.0,12.0,13.0], 
    ... 
] # with a length of 1000 

Теперь, скажем, я хотел бы дать РНН 2 последних векторов признаков для прогнозирования вектора признаков для времени т +1.

В настоящее время (без слоя встраивания) я создаю необходимый трехмерный тензор с формой (nb_samples, timesteps, input_dim) сам (как в этом примере here).

, относящийся к моему примеру, окончательный 3D Tensor будет выглядеть следующим образом:

X_train_2 = [ 
    [[1.0,2.0,3.0,4.0], 
    [2.0,5.0,6.0,7.0]], 
    [[2.0,5.0,6.0,7.0], 
    [3.0,8.0,9.0,10.0]], 
    [[3.0,8.0,9.0,10.0], 
    [4.0,11.0,12.0,13.0]], 
    etc... 
] 

и Y_train:

Y_train = [ 
    [3.0,8.0,9.0,10.0], 
    [4.0,11.0,12.0,13.0], 
    etc... 
] 

Моя модель выглядит следующим образом (адаптировано к упрощенному примеру выше):

num_of_vectors = 2 
vect_dimension = 4 

model = Sequential() 
model.add(SimpleRNN(hidden_neurons, return_sequences=False, input_shape=(num_of_vectors, vect_dimension))) 
model.add(Dense(vect_dimension)) 
model.add(Activation("linear")) 
model.compile(loss="mean_squared_error", optimizer="rmsprop") 
model.fit(X_train, Y_train, batch_size=50, nb_epoch=10, validation_split=0.15) 

И, наконец, мой вопрос: как я могу избежать выполнения этих 2D-тензоров до 3D тензор меняет форму и вместо этого использует слой Embedding? Я думаю, после того, как модель = последовательного() я бы добавить что-то вроде:

model.add(Embedding(?????)) 

Вероятно, ответ довольно прост, я просто смущен документации вложения слоя.

ответ

7

Вы можете вы это следующим образом:

Примечание:

  1. Я создал некоторый X и Y, как 0s просто чтобы дать вам некоторое представление о входной структуре.

  2. Если у вас многоуровневый y_train, вам необходимо выполнить двоичный код.

  3. Возможно, вам потребуется добавить отступы, если у вас есть данные разной длины.

  4. Если я правильно понял предсказание в момент времени t + 1, вы можете посмотреть на обучение последовательностям Sequence.

Попробуйте что-то вроде:

hidden_neurons = 4 
nb_classes =3 
embedding_size =10 

X = np.zeros((128, hidden_neurons), dtype=np.float32) 
y = np.zeros((128, nb_classes), dtype=np.int8) 


model = Sequential() 
model.add(Embedding(hidden_neurons, embedding_size)) 
model.add(SimpleRNN(hidden_neurons, return_sequences=False)) 
model.add(Dense(nb_classes)) 
model.add(Activation("softmax")) 
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', class_mode="categorical") 
model.fit(X, y, batch_size=1, nb_epoch=1) 
+0

Возможно, я должен был добавить «.0» за всеми моими номерами. На самом деле я не пытаюсь выполнить категориальный анализ. – Kito

0

Из того, что я знаю, до сих пор, встраивание слой, как представляется, более или менее для уменьшения размерности как word embedding. Таким образом, в этом смысле он не представляется применимым в качестве инструмента общей перестройки.

Если у вас есть сопоставление слов с целыми числами, например {car: 1, mouse: 2 ... zebra: 9999}, ваш текст будет представлять собой вектор слов, представленных целыми id, например [1, 2 , 9999 ...], что означало бы [автомобиль, мышь, зебра ...].Но, похоже, эффективно сопоставлять слова с векторами действительных чисел с длиной словарного запаса, поэтому, если ваш текст имеет 1000 уникальных слов, вы должны сопоставлять каждое слово с вектором действительных чисел длиной 1000. Я не уверен, но я подумайте, что это в основном представляет собой вес того, как сходное значение слова относится ко всем другим словам, но я не уверен, что это правильно, и есть другие способы вставки слов.