【问题标题】:keras RNN with characters input fails to predict带有字符输入的keras RNN无法预测
【发布时间】:2018-10-03 04:03:37
【问题描述】:

我正在研究一个必须从字符串中预测数字的 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 列表,我总是得到平均值...

知道发生了什么吗?

【问题讨论】:

    标签: python tensorflow keras deep-learning rnn


    【解决方案1】:

    你能尝试一种简单的架构吗?

    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)
    

    【讨论】:

    • 我尝试了你的建议,唯一的修改是return_sequences=False。无论输入字符串如何,预测值为 0.999988...我尝试用 5000 个 epoch 过度拟合这个模型。对训练集的预测仍然给出 0.999988。然后,我尝试通过在您建议的模型之上添加一层 64 个单元来构建模型。仍然得到大约 1 的预测。然后我尝试在您建议的模型之上使用 2 层 128 个单元。仍然是 1 点左右的预测...
    猜你喜欢
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 2018-08-08
    • 2020-06-10
    • 2018-06-20
    • 2017-01-01
    • 2019-07-31
    • 2022-01-15
    相关资源
    最近更新 更多