用于时序网络的NumPy阵列:可变序列长度

l7mqbcuq  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(123)

我有一个递归网络(RNN),它的任务是学习分类向量(Float32)。到目前为止,我的模型非常简单:

model = Sequential([
    SimpleRNN(units=10, input_shape=(None, len_vector)),
    Dense(1, activation="relu")
])

model.compile(loss='mse', optimizer='Adam', metrics=['accuracy'])

history = model.fit(X_train, y_train, epochs=30)

为了训练这个网络,我创建了一个包含1000个向量序列示例的数据集。当我创建每个长度相同的序列时,训练效果很好,数据集具有形状:

[<number of sequences>, <number of vectors in each sequence>, <number of floats in each vector>]

问题是,我的模型必须能够在各种长度的序列上工作。我不知道如何(或者是否可能)创建一个一维不恒定的数值数组。
在寻找解决方案时,我发现设置数组dtype=object可以将不同形状的列表分配给Numy数组的元素,但keras模型只接受dtype="float32"
有没有办法让这个数组数据集变得稀疏呢?或者我应该改变算法来训练模型?或者,用NUL载体填充序列以统一其长度是唯一的解决方案?
)谢谢你的帮助。我对深度学习还是个新手,所以如果我的要求很明显的话,我很抱歉。)

3htmauhk

3htmauhk1#

使用参差不齐的Tensor,它们为你提供可变长度的输入,

import numpy as np
_input = tf.keras.layers.Input(shape=(None, 100))
lstm = tf.keras.layers.LSTM(20,)(_input)
func = tf.keras.backend.function(inputs=_input, outputs=lstm)
rt = tf.ragged.constant([np.random.randn(1,34,100),
                         np.random.randn(1,55,100) ,
                         np.random.randn(1,60,100) ,
                         np.random.randn(1,70,100)])

func(rt[1])

相关问题