如何使用RNN的keras处理可变长度的样本?

ttvkxqim  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(182)

背景

大家好,
我正在研究(我认为应该是)一个简单的RNN使用Google Colab [Tensorflow 2.9.2和Keras 2.9.0]。我已经研究了一段时间了,但是我似乎不能让所有的事情都很好地进行。我的RNN的输入是0 ~ 6(包括0和6)的数字序列,表示为one-hot编码的列向量。目标只是单个0 ~ 6值表示为一位热码编码行向量。
This link to a screenshot of my Colab describes...

  • 输入[0] -〉目标6
  • 输入[0,6] -〉目标0
  • 输入[0,6,0,3] -〉目标0
  • 输入[0,6,0,3,0] -〉目标值5

从我从其他stackoverflow问题、博客文章、keras文档等收集到的信息来看,下面的代码应该接近我的用例所需要的所有内容。

# Bulding RNN Model
model = None
model = keras.Sequential()
model.add(keras.Input((None, 7)))
model.add(layers.Bidirectional(layers.LSTM(32)))
model.add(layers.Dense(7, activation='softmax'))
model.summary()

# Compiling RNN Model
model.compile(
    loss = keras.losses.CategoricalCrossentropy(),
    optimizer="sgd",
    metrics=["accuracy"],
)

问题
我非常确定我的问题与每个样本输入都是不同大小的向量或矩阵有关。(7,1)向量输入,而[0,5,4,1,2,3]将变为(7,6)矩阵输入的时间步长。根据我在过去几个小时里收到的错误信息,我知道keras对此并不太满意,但对于我正在尝试做的事情,我不太确定下一步该怎么做。
我已经手动分割了训练集和测试集。
Image of code with output
为清楚起见...

  • x_train和x_test -〉numpy数组的列表,每个数组的列数都是可变的(例如,np.shape=(7,???))
  • y_train和y_test -〉numpy数组的列表,每个数组都有一个常数大小(例如,np.shape=(1,7))

I'm quite sure my types are correct.
我在试我的模特,没有任何奢侈的东西。

# Fitting the RNN Model
model.fit(
    x_train, y_train, validation_data=(x_test, y_test), epochs = 50
)

也就是说,我继续收到一个值错误,说明“Layer Sequential_???预期1个输入,但它收到了???输入Tensor”。
Image of Value Error
在这件事上的任何帮助都将不胜感激!提前感谢大家!

pod7payv

pod7payv1#

事实证明,我需要一个掩蔽层来做我想做的事情。
相反,我认为掩蔽层解决了两个根本问题...
1.我的维度不是Keras想要的[样本、时间步长、要素]
1.当每个样本都有一个可变的时间步长值时,我不知道如何使我的输入结构工作。我无法摆脱这样的感觉,即仍然有一种方法可以在没有填充的情况下做到这一点,但我的模型现在可以在几个小时内第一次“适合”。所以,我将在某种程度上称之为成功。
Link to Embeddings and Masking

相关问题