Я работаю над 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, всегда получал среднее ...
Есть идеи о том, что происходит?