RNN 的输入数据格式
Input Data Format for RNN
我很困惑如何准确地将数据序列编码为 LSTM RNN 的输入。
在普通 DNN 中,每个标签都有一个输入。 RNN 中的 "input" 是什么?是否必须是一组(或序列)数据才能训练与标签关联的顺序事件?
我对如何对顺序信息进行编码感到困惑,因为似乎应该有多个输入与给定标签相关联。
it seems that there should be more than a single input associated with a given label
是的,你是对的。实际上你的输入需要是一个 3D 矩阵。例如,如果您有 n 个序列,每个序列的长度为 m,并且您的每个序列数据都有 d 个特征,那么您的 RNN 的输入必须具有维度 (n,m,d)。
例如,如果您有一个时间序列 (X1,..,Xt)
并且您想要训练预测器在 +1 的范围内进行预测并使用长度为 3 的序列,您的输入和输出将为:
[[X1,X2,X3]] [X4]
[[X2,X3,X4]] [X5]
...
[[Xt-3,Xt-2,Xt-1]] [Xt]
所以,有t-3个序列,每个序列的长度为3,有1个特征。维度应该是 (t-3,3,1).
让我们在代码中画一个例子。
假设我们有一些句子,其中句子中的每个单词都被编码为一个向量(可能是来自 word2vec 的向量)。
假设我们要class将每个句子化为两个class (0, 1)之一。我们可能会像这样构建一个简单的 classifier:
import numpy as np
from keras.models import Sequential
from keras.layers import LSTM, Dense
# each example (of which we have a 100) is a sequence of 10 words and
# each words is encoded as 16 element vectors
X = np.random.rand(100, 10, 16)
y = np.random.choice(1, 100)
model = Sequential()
model.add(LSTM(128, input_shape=(10, 16)))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='sgd')
# fit model
model.fit(X, y, epochs=3, batch=16)
Graves 的书(第 19 页)用明确的维度扩充了答案:
考虑一个长度为 T 的输入序列 x 呈现给具有 I 个输入单元、H 个隐藏单元和 K 个输出单元的 RNN。设 $x_i^t$ 为输入 i 在时间 t 的值。
在您输入的每个单词 t= 1,...,T 的句子中,单词 t 都有一个长度为 I 的嵌入向量。标量级别 ( $x_i^t$ ) 的输入是该向量的第 i 个分量。
我很困惑如何准确地将数据序列编码为 LSTM RNN 的输入。
在普通 DNN 中,每个标签都有一个输入。 RNN 中的 "input" 是什么?是否必须是一组(或序列)数据才能训练与标签关联的顺序事件?
我对如何对顺序信息进行编码感到困惑,因为似乎应该有多个输入与给定标签相关联。
it seems that there should be more than a single input associated with a given label
是的,你是对的。实际上你的输入需要是一个 3D 矩阵。例如,如果您有 n 个序列,每个序列的长度为 m,并且您的每个序列数据都有 d 个特征,那么您的 RNN 的输入必须具有维度 (n,m,d)。
例如,如果您有一个时间序列 (X1,..,Xt)
并且您想要训练预测器在 +1 的范围内进行预测并使用长度为 3 的序列,您的输入和输出将为:
[[X1,X2,X3]] [X4]
[[X2,X3,X4]] [X5]
...
[[Xt-3,Xt-2,Xt-1]] [Xt]
所以,有t-3个序列,每个序列的长度为3,有1个特征。维度应该是 (t-3,3,1).
让我们在代码中画一个例子。
假设我们有一些句子,其中句子中的每个单词都被编码为一个向量(可能是来自 word2vec 的向量)。
假设我们要class将每个句子化为两个class (0, 1)之一。我们可能会像这样构建一个简单的 classifier:
import numpy as np
from keras.models import Sequential
from keras.layers import LSTM, Dense
# each example (of which we have a 100) is a sequence of 10 words and
# each words is encoded as 16 element vectors
X = np.random.rand(100, 10, 16)
y = np.random.choice(1, 100)
model = Sequential()
model.add(LSTM(128, input_shape=(10, 16)))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='sgd')
# fit model
model.fit(X, y, epochs=3, batch=16)
Graves 的书(第 19 页)用明确的维度扩充了答案:
考虑一个长度为 T 的输入序列 x 呈现给具有 I 个输入单元、H 个隐藏单元和 K 个输出单元的 RNN。设 $x_i^t$ 为输入 i 在时间 t 的值。
在您输入的每个单词 t= 1,...,T 的句子中,单词 t 都有一个长度为 I 的嵌入向量。标量级别 ( $x_i^t$ ) 的输入是该向量的第 i 个分量。