Keras LSTM для непрерывного ввода и непрерывного вывода - PullRequest
0 голосов
/ 25 октября 2018

Например, у меня есть двоичные данные, скажем, 0, 0, 0, 1, 1, 0, 1, 1. Это может продолжаться бесконечно.Для каждого входа есть соответствующий выход.Допустим, мы используем операцию XOR.Таким образом, вывод может выглядеть следующим образом: 0, 0, 0, 1, 0, 1, 1, 0.

Как мне сформировать входную форму Keras?Как мне установить временные шаги?Если я объявляю, что временные шаги 1 для каждого 1 временного шага рассматриваются как разные случаи, или он все еще может учитывать предыдущий ввод как последовательность или запомненную память?

Keras использует LSTM или GRU для своего скрытого слоя.

Я пробовал 2 метода для этой проблемы, но ни один из них не удался.Оба метода застряли на 37,5 в соотв.Фактически, он продолжает угадывать 1.

Метод 1:

data = [[[0], [0], [0], [1], [1], [0], [1], [1]]]
output = [[[0], [0], [0], [1], [0], [1], [1], [0]]]

model = Sequential()
model.add(GRU(10, input_shape=(8, 1), return_sequences=True))
model.add(GRU(10, return_sequences=True))
model.add(Dense(1, activation='softmax'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])
model.fit(np.asarray(data), np.asarray(output), epochs=3000)

Метод 2:

data = [[[0]], [[0]], [[0]], [[1]], [[1]], [[0]], [[1]], [[1]]]
output = [[0], [0], [0], [1], [0], [1], [1], [0]]

model = Sequential()
model.add(GRU(10, input_shape=(1, 1), return_sequences=True))
model.add(GRU(10))
model.add(Dense(1, activation='softmax'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])
model.fit(np.asarray(data), np.asarray(output), epochs=300)

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Изменить activation='softmax' на activation='sigmoid'

0 голосов
/ 25 октября 2018

На самом деле, он продолжает угадывать 1.

Это потому, что вы использовали softmax в качестве активации последнего слоя.Поскольку последний слой имеет только одну единицу, а функция softmax нормализует его входные данные, так что сумма элементов равна единице, он всегда выдает 1. Вместо этого вам нужно использовать sigmoid в качестве функции активации последнего уровня, чтобы иметьвывод между нулем и единицей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...