输入字符的keras RNN无法预测

时间:2018-10-03 04:03:38

标签: python tensorflow keras deep-learning rnn

我正在研究必须从字符串中预测数字的RNN。 基本上,我有一个字符串列表,并且浮点数与每个字符串关联。字符串(不是单词,可能看起来是随机的)实际上是有序的并且具有逻辑。因此,相关的浮动是完全可预测的。

我针对此问题的策略是使用ord(character)将字符串中的每个字符转换为数字,并将所有字符串放入NumPy数组中。

作为第一个测试,我创建了一组非常简单的字符串,只包含“ a”和“ b”字符​​。逻辑很简单。字符串中的“ a”越多,关联的数字就越高。不幸的是,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的实施和培训

这是我尝试过的许多RNN之一。我尝试更改层数,每层的单位数和Dropout。没有成功。

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 :(得分:0)

您可以尝试一种简单的体系结构吗?

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)