Как передать эти ложные данные с горячим кодированием через слой keras LSTM? - PullRequest
0 голосов
/ 03 февраля 2020

Как (я думаю) я понимаю в Keras, слои LSTM ожидают, что входные данные будут иметь 3-мерные размеры: (batch_size, timesteps, input_dim).

Однако я действительно изо всех сил пытаюсь понять, что эти значения на самом деле соответствуют, когда это касается моих данных. Я надеюсь, что если кто-то сможет объяснить, как я мог бы go ввести следующие ложные данные (со структурой, аналогичной моему фактическому набору данных) в слой LSTM, я мог бы тогда понять, как я могу добиться этого с моим реальным набором данных.

Таким образом, примером данных являются последовательности категориальных данных, закодированных с использованием кодирования одним горячим вектором. Например, первые 3 выборки выглядят так:

[ [0, 0, 0, 1], [0, 0, 1, 0], [1, 0, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0] ]

[ [0, 1, 0, 0], [0, 1, 0, 0], [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0] ]

[ [0, 0, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1] ]

т.е. последовательности имеют длину 5 с 4 категориальными вариантами, которые могут находиться в позиции в последовательности. Скажем также, у меня есть 3000 последовательностей. Это проблема двоичной классификации.

Поэтому я считаю, что это сделает форму моего набора данных (3000, 5, 4)?

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

model = keras.Sequential([
    keras.layers.LSTM(units=3, batch_input_shape=(???)),
    keras.layers.Dense(128, activation='tanh'),
    keras.layers.Dense(64, activation='tanh'),
    keras.layers.Dense(1, activation='sigmoid')
])

model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=20)

Это пока игнорирует любое разделение обучения / тестирования, поэтому просто предположим, что я тренируюсь со всем набором данных. Часть, с которой я борюсь, это input_shape.

Я хочу, чтобы каждый элемент в последовательности был временным шагом. Я перепробовал много разных форм и получил много разных ошибок. Я предполагаю, что мне действительно нужно изменить x_train вместо того, чтобы просто настроить input_shape. Проблема в том, что я понятия не имею, какой должна быть форма.

Мне кажется, я понимаю теорию, лежащую в основе LSTM, это просто практичность требований к размерности, которые я изо всех сил пытаюсь обдумать.

Любая помощь или совет будут высоко оценены. Спасибо.

РЕДАКТИРОВАТЬ - Как предложено @scign. Вот пример ошибки, которую я получаю, используя следующий код для набора фиктивных данных:

x_train = [[0, 0, 0, 1], [0, 0, 1, 0], [
    1, 0, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0]], [[0, 1, 0, 0], [0, 1, 0, 0], [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1]]

y_train = [1, 0, 1]

model = keras.Sequential([
    keras.layers.LSTM(units=3, batch_input_shape=(1, 5, 4)),
    keras.layers.Dense(128, activation='tanh'),
    keras.layers.Dense(64, activation='tanh'),
    keras.layers.Dense(1, activation='sigmoid')
])

model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=20)

Ошибка - ValueError: Error when checking input: expected lstm_input to have 3 dimensions, but got array with shape (5, 4)

1 Ответ

1 голос
/ 03 февраля 2020

Как (я думаю) я понимаю в Keras, слои LSTM ожидают, что входные данные будут иметь 3-мерные размеры: (batch_size, timesteps, input_dim).

Правильно.

т.е. последовательности имеют длину 5 с 4 категориальными вариантами, которые могут быть в позиции в последовательности. Скажем также, у меня есть 3000 последовательностей. Это проблема двоичной классификации.

Так что я считаю, что это сделает форму моего набора данных (3000, 5, 4)?

Правильной.

Вы ограничен тензорным потоком 1.x? Версия 2.x вышла в течение некоторого времени, и keras была полностью интегрирована с tf2, поэтому, если у вас нет каких-либо ограничений, вы можете рассмотреть возможность использования tf2.

Редактировать: Просмотр ваших тренировочных данных:

  1. Вам необходимо добавить дополнительный набор квадратных скобок вокруг ваших данных
  2. Ваши данные должны быть в одном массиве numpy, а не в списке списков
  3. Ваши элементы данных должны быть с плавающей точкой, а не целыми числами

Кроме того, вы можете использовать параметр input_dim и указать только количество объектов вместо использования batch_input_shape.

. следующие работы для меня.

# make tensorflow a bit quieter
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'

import tensorflow as tf
import numpy as np

x_train = np.array([
    [[0, 0, 0, 1], [0, 0, 1, 0], [1, 0, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0]],
    [[0, 1, 0, 0], [0, 1, 0, 0], [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0]],
    [[0, 0, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1]]
], dtype=float)
y_train = np.array([1, 0, 1], dtype=float)

features = x_train.shape[2]

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.LSTM(units=3, input_dim=features))
model.add(tf.keras.layers.Dense(128, activation='tanh'))
model.add(tf.keras.layers.Dense(64, activation='tanh'))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))

model.compile(optimizer='adam',
            loss='binary_crossentropy',
            metrics=['accuracy'])

model.fit(x_train, y_train, epochs=20)

print(model.predict(x_train))

Вывод

    >>>python so60040420.py
    Train on 3 samples
    Epoch 1/20
    WARNING:tensorflow:From C:\...\lib\site-packages\tensorflow_core\python\ops\nn_impl.py:183: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.
    Instructions for updating:
    Use tf.where in 2.0, which has the same broadcast rule as np.where
    WARNING:tensorflow:Entity .initialize_variables at 0x0000019E75189598> could not be transformed and will be executed as-is. Please report this to the AutoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: module 'gast' has no attribute 'Num'
    3/3 [==============================] - 1s 464ms/sample - loss: 0.7105 - accuracy: 0.0000e+00
    Epoch 2/20
    3/3 [==============================] - 0s 1ms/sample - loss: 0.6842 - accuracy: 0.6667
    Epoch 3/20
    3/3 [==============================] - 0s 2ms/sample - loss: 0.6591 - accuracy: 0.6667
    Epoch 4/20
    3/3 [==============================] - 0s 2ms/sample - loss: 0.6350 - accuracy: 0.6667
    Epoch 5/20
    3/3 [==============================] - 0s 2ms/sample - loss: 0.6119 - accuracy: 0.6667
    Epoch 6/20
    3/3 [==============================] - 0s 1ms/sample - loss: 0.5897 - accuracy: 0.6667
    Epoch 7/20
    3/3 [==============================] - 0s 2ms/sample - loss: 0.5684 - accuracy: 0.6667
    Epoch 8/20
    3/3 [==============================] - 0s 2ms/sample - loss: 0.5479 - accuracy: 0.6667
    Epoch 9/20
    3/3 [==============================] - 0s 2ms/sample - loss: 0.5282 - accuracy: 0.6667
    Epoch 10/20
    3/3 [==============================] - 0s 1ms/sample - loss: 0.5092 - accuracy: 0.6667
    Epoch 11/20
    3/3 [==============================] - 0s 2ms/sample - loss: 0.4909 - accuracy: 0.6667
    Epoch 12/20
    3/3 [==============================] - 0s 1ms/sample - loss: 0.4733 - accuracy: 0.6667
    Epoch 13/20
    3/3 [==============================] - 0s 2ms/sample - loss: 0.4564 - accuracy: 0.6667
    Epoch 14/20
    3/3 [==============================] - 0s 2ms/sample - loss: 0.4402 - accuracy: 0.6667
    Epoch 15/20
    3/3 [==============================] - 0s 2ms/sample - loss: 0.4246 - accuracy: 0.6667
    Epoch 16/20
    3/3 [==============================] - 0s 1ms/sample - loss: 0.4096 - accuracy: 0.6667
    Epoch 17/20
    3/3 [==============================] - 0s 2ms/sample - loss: 0.3951 - accuracy: 0.6667
    Epoch 18/20
    3/3 [==============================] - 0s 2ms/sample - loss: 0.3809 - accuracy: 0.6667
    Epoch 19/20
    3/3 [==============================] - 0s 2ms/sample - loss: 0.3670 - accuracy: 1.0000
    Epoch 20/20
    3/3 [==============================] - 0s 2ms/sample - loss: 0.3531 - accuracy: 1.0000
    [[0.8538592 ]
    [0.48295668]
    [0.8184752 ]]
...