如何在Keras中使用嵌入层用于递归神经网络(RNN)

时间:2016-01-29 16:57:10

标签: neural-network embedding keras recurrent-neural-network

我是神经网络和Keras库的新手,我想知道如何使用here所描述的嵌入层将我的输入数据从2D张量屏蔽到3D张量的RNN {3}}

说我的时间序列数据如下(随着时间的增加):

X_train = [
   [1.0,2.0,3.0,4.0],
   [2.0,5.0,6.0,7.0],
   [3.0,8.0,9.0,10.0],
   [4.0,11.0,12.0,13.0],
   ...
] # with a length of 1000

现在,我想要给RNN最后2个特征向量,以便预测时间t + 1的特征向量。

目前(没有嵌入层),我自己创建了所需的3D张量(nb_samples,timesteps,input_dim)(如本例here所示)。

与我的例子相关,最终的3D Tensor看起来如下:

X_train_2 = [
  [[1.0,2.0,3.0,4.0],
   [2.0,5.0,6.0,7.0]],
  [[2.0,5.0,6.0,7.0],
   [3.0,8.0,9.0,10.0]],
  [[3.0,8.0,9.0,10.0],
   [4.0,11.0,12.0,13.0]],
  etc...
]

和Y_train:

Y_train = [
   [3.0,8.0,9.0,10.0],
   [4.0,11.0,12.0,13.0],
   etc...
]

我的模型如下(适用于上面的简化示例):

num_of_vectors = 2
vect_dimension = 4

model = Sequential()
model.add(SimpleRNN(hidden_neurons, return_sequences=False, input_shape=(num_of_vectors, vect_dimension))) 
model.add(Dense(vect_dimension))
model.add(Activation("linear"))
model.compile(loss="mean_squared_error", optimizer="rmsprop")
model.fit(X_train, Y_train, batch_size=50, nb_epoch=10, validation_split=0.15)

最后,我的问题是,我怎么能避免那些2D张量到3D张量重塑自己并使用嵌入层呢?我想在model = sequential()之后,我必须添加类似的东西:

model.add(Embedding(?????))

可能答案很简单,我只是对嵌入层的文档感到困惑。

2 个答案:

答案 0 :(得分:7)

你可以这样做:

注意:

  1. 我生成了一些X和y作为0,只是为了让你对输入结构有所了解。

  2. 如果您正在使用多级y_train,则需要进行二值化。

  3. 如果您有不同长度的数据,则可能需要添加填充。

  4. 如果我理解正确的时间t + 1预测,你可能想看看序列到序列的学习。

  5. 尝试类似:

    hidden_neurons = 4
    nb_classes =3
    embedding_size =10
    
    X = np.zeros((128, hidden_neurons), dtype=np.float32)
    y = np.zeros((128, nb_classes), dtype=np.int8)
    
    
    model = Sequential()
    model.add(Embedding(hidden_neurons, embedding_size))
    model.add(SimpleRNN(hidden_neurons, return_sequences=False)) 
    model.add(Dense(nb_classes))
    model.add(Activation("softmax"))
    model.compile(loss='categorical_crossentropy', optimizer='rmsprop', class_mode="categorical")
    model.fit(X, y, batch_size=1, nb_epoch=1)
    

答案 1 :(得分:0)

据我所知,到目前为止,嵌入层似乎或多或少都像word embedding那样减少维数。所以在这个意义上它似乎不适用于一般的重塑工具。

基本上,如果你有一个单词映射到整数,如{car:1,mouse:2 ... zebra:9999},你的输入文本将是由它们整数id表示的单词的向量,如[1,2, 9999 ...],这意味着[汽车,老鼠,斑马...]。但是将单词映射到具有词汇长度的实数向量似乎是有效的,所以如果你的文本有1000个独特的单词,你可以将每个单词映射到长度为1000的实数向量。我不确定但是我我认为它主要代表一个词的含义与所有其他词的相似程度,但我不确定这是否正确,还有其他方法可以嵌入单词。