keras RNN с вводом символов не может предсказать - PullRequest
0 голосов
/ 03 октября 2018

Я работаю над RNN, который должен предсказать число из строки.По сути, у меня есть список строк, и с каждой строкой связан float.Строки, которые не являются словами и могут показаться случайными, на самом деле упорядочены и имеют логику.Таким образом, связанный float полностью предсказуем.

Моя стратегия для этой проблемы - преобразовать каждый символ строки в число с помощью ord(character) и поместить все строки в массив NumPy.

В качестве первого теста я создал очень простой набор строк, содержащий только символы «a» и «b».Логика очень проста.Чем больше в строке «а», тем больше ассоциированное число.К сожалению, RNN полностью терпит неудачу.

Подготовка обучающих данных:

a = "abbbbb"
b = "aabbbb"
c = "aaabbb"
d = "aaaabb"
e = "aaaaab"
f = "aaaaaa"

X_train = []
X_train.append([ord(letter) for letter in a]) # Converts "abbbbb" to [97, 98, 98, 98, 98, 98]
X_train.append([ord(letter) for letter in b])
X_train.append([ord(letter) for letter in c])
X_train.append([ord(letter) for letter in d])
X_train.append([ord(letter) for letter in e])
X_train.append([ord(letter) for letter in f])

X_train = np.array(X_train)
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))

y_train = [0, 5, 15, 30, 50, 80]

Внедрение и обучение RNN

Этоодин из многих рнн я пробовал.Я попытался изменить количество слоев, количество единиц на слой и выпадение.Без успеха.

from keras.models import Sequential
from keras.layers import Dense, LSTM, Dropout
import math
from sklearn.metrics import mean_squared_error

regressor = Sequential()

regressor.add(LSTM(units=256, return_sequences=True, input_shape=(X_train.shape[1], 1)))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units=256, return_sequences=True))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units=256, return_sequences=True))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units=256, return_sequences=True))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units=256, return_sequences=True))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units=256, return_sequences=False))
regressor.add(Dropout(0.2))
regressor.add(Dense(units=1))

regressor.compile(optimizer = "adam", loss = "mean_squared_error")

regressor.fit(X_train, y_train, epochs=100, batch_size=32)

Подготовка тестовых данных и прогноз

X_test = list(ord(letter) for letter in f)
X_test = np.array(X_test)
X_test = np.reshape(X_test, (1, X_test.shape[0], 1))

prediction = regressor.predict(X_test)

ПРОБЛЕМА

Я проверил RNNс разными струнами, даже с 6 струнами из тренировочного набора.Прогноз RNN всегда один и тот же, 30,0094, независимо от того, что вводится.Два последних знака после запятой могут различаться, но в основном выходные данные всегда будут 30,00xx.

Число 30 - это не любое число, поскольку оно является средним значением списка y_train, [0, 5, 15, 30,50, 80]

Я пытался использовать разные списки y_train, всегда получал среднее ...

Есть идеи о том, что происходит?

1 Ответ

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

Можете ли вы попробовать способ простой архитектуры?

regressor = Sequential()

regressor.add(LSTM(units=1, return_sequences=True, input_shape=(X_train.shape[1], 1)))
regressor.compile(optimizer = "adam", loss = "mean_squared_error")  
regressor.fit(X_train, y_train, epochs=5, batch_size=1)
...