【发布时间】: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