其中一种 RNN 结构为:N vs 1。这种结构的输入为序列,输出为类别, 因此可以解决序列分类问题。 常见的序列分类问题有文本分类 、 时间序列分类 、 音频分类。本文用tensroflow制作一个简单的序列分类器。
一、Nvs1 的 RNN结构
x1,x2,...,Xt 为输入的数据, Y 为最终的分类 。 在不同的问题中,输入 数据 x 有不同的含义,如:
(1)对于文本分类,每一个 Xt 是一个词的向量表示。
(2)对于音频分类,每一个 Xt 是一帧采样的数据 。
(3)对于视频分类,每一个 Xt 是一帧图像(或从单帧图像中提取的特征 )
Nvs1 的 RNN结构如下:
用公式来表达是:
每一次只对最后一个隐层状态 hr 计算类别 。 通常输入的序列长度都是不等长的,hr 应取对应序列的长度 。
二、序列分类问题与数据生成
先处理一个最简单的序列分类问题:数值序列分类,希望能训练一个 RNN 分类器,将这两类数列自动分开。这里数列的长度是不固定的,但它们有一个共同的最大序列长度。生产数据代码如下:
class ToySequenceData(object): """ 生成序列数据。每个数量可能具有不同的长度。 一共生成下面两类数据 - 类别 0: 线性序列 (如 [0, 1, 2, 3,...]) - 类别 1: 完全随机的序列 (i.e. [1, 3, 10, 7,...]) 注意: max_seq_len是最大的序列长度。对于长度小于这个数值的序列,我们将会补0。 在送入RNN计算时,会借助sequence_length这个属性来进行相应长度的计算。 """ def __init__(self, n_samples=1000, max_seq_len=20, min_seq_len=3, max_value=1000): self.data