为包含可变长度序列的数组的输出标签创建分类 numpy 数组

Posted

技术标签:

【中文标题】为包含可变长度序列的数组的输出标签创建分类 numpy 数组【英文标题】:Create categorical numpy array for output labels of array containing variable length sequence [closed] 【发布时间】:2018-10-05 17:44:51 【问题描述】:

我正在尝试为 LSTM 模型创建一个可变序列长度数据。因此,我创建了一个可变长度的 numpy 数组列表。 例如,一个数组长度 => (11,20),另一个数组长度 => (9,20)。这里 20 是特征数,11/9 表示序列长度

每个数组的末尾都有零和一个数值(类索引)。

如果音频文件属于类索引 = 1 并且帧数为 8 则 y 将是 [0,0,0,0,0,0,0,1]

我想知道,当对每个可变长度的音频数据调用 model.fit 时,最后一个 Dense layer() 的输出形状将等于音频的帧数

那么,我怎样才能创建密集层的可变输出形状(8 或 9 或 11)

我不想填充序列,而是在 LSTM 输入层形状中给出“无”。

但是,在转换为 categorical 时,出现错误:setting array element with sequence.

这里,11是类数

y_train=to_categorical(y_train,11)
y_test=to_categorical(y_test,11)

张量流版本:1.3.0

Keras 版本:2.0.9

【问题讨论】:

形状 (11,20) 表示什么?这是y_train的形状吗?这里的 20 是多少? @VivekKumar 20 是特征数,11/9 表示序列长度 还是不清楚。您想对目标或特征进行编码吗?请仅显示目标是如何保存在 y_train 中的? @VivekKumar 所以 (11,20) 是一个音频文件的 mfcc 向量的形状 这就是功能。该文件的输出是什么?标签?抛出错误的 y_train 和 y_test 中的数据? 【参考方案1】:

正如你在问题中所说:

每个数组的末尾都有零和一个数值(类索引)。

如果音频文件属于类 index = 1 且帧数为 8 则 y 将为 [0,0,0,0,0,0,0,1]

第一步输入:

[更新] 处理可变输入大小的一种方法是使用dynamic_rnn。 Read more here

我们处理这个问题的另一种方法是使用填充。

假设我们创建大小为 10 的嵌入,因此每个单词将有一个大小为 10 的向量输入。

说 5 个单词的句子输入,实际上是 5 * 10 的输入。

现在,因为 TF/Keras 接受固定大小的输入。我们填充输入。

所以我们采用固定输入长度的单词数(本例中为 20)。

删除 20 之后出现的单词。

如果一个 Sentence 有 5 个单词,那么它将有 15 个填充。

现在输入将通过嵌入层,最终输入将是(None, 20, 10),代表(Batch_size, Sequence_length, embedding_dimension)

你的问题也可以转化为类似的输入。

例如,一个数组长度 => (11,20),另一个长度 => (9,20)。这里 20 是特征数,11/9 表示序列长度

这里假设序列长度为15左右..并假设嵌入维度为20。

您必须填充大小为 9/11 的输入,以便在 15 时保持一致(您可以试验这个数字)。

20 是您的嵌入维度、特征。

所以最终输入形状将是(None, 15, 20)

下一步输出:

您现在可以为每个输入直接热编码您的输出类。 对于 9,20 的输入,您有 1 个热编码输出向量。

之前您认为对于长度为 9 的输入和 20 的特征 输出的长度应该是 9,前 8 个输出应该是 0,第 9 个应该是类。

这将不再需要,因为 1 个大小为 (9,20) 的输入将提供 1 个输出。

如果需要更多解释,请告诉我,祝你好运:)

【讨论】:

感谢您的解释。但是准确性会受到填充的影响吗?并且 keras/tf 通过提及 (batch_size,None,number_features) 来接受可变序列长度。所以我想详细了解一下。 准确性会受到填充的影响吗? yes。输入可以是可变序列长度,但输出长度必须是固定的(如下一步输出中所述)。 你可以有可变长度的输出,但对于你的用例来说根本不需要。 谢谢您的解释 不客气。它是否回答了您的问题@RomaJain?

以上是关于为包含可变长度序列的数组的输出标签创建分类 numpy 数组的主要内容,如果未能解决你的问题,请参考以下文章

算法 LC 动态规划 - 最大递增子序列

Leetcode No.128 最长连续序列

Leetcode No.128 最长连续序列

创建一个具有可变长度数组的接口,其中包含 TypeScript/Angular4 中的对象

LeetCode53 最大子序列和

使用流在 C++ 中读取可变长度输入