深度学习---时序数据的采样(随机采样和相邻采样)

随机采样

在随机采样照片那个,每个样本是原始序列上任意截取的一段序列。相邻的两个随机小批量在原始序列上的位置不一定相毗邻。因此,无法用一个小批量的最终时间步的
隐藏状态来初始化下一个小批量的隐藏状态。在训练模型时,每次随机采样前都需要重新初始化隐藏状态

    num_examples = (len(corpus_indices) - 1) // num_steps
    epoch_size = num_examples // batch_size
    example_indices = list(range(num_examples))
    random.shuffle(example_indices)

    def _data(pos):
        return corpus_indices[pos:pos+num_steps]
    for i in range(epoch_size):
        i = i * batch_size
        batch_indices = example_indices[i:i+batch_size]
        X = [_data(j*num_steps) for j in batch_indices]
        Y = [_data(j*num_steps + 1) for j in batch_indices]
        yield torch.tensor(X), torch.tensor(Y)

my_seq = list(range(30))
for x,y in data_iter_random(my_seq, batch_size=2, num_steps=6):
    print('x: ',x, '\ny:',y,'\n')

相邻采样

相邻的两个随机小批量在原始序列上的位置相毗邻。这时候,可以用一个小批量最终时间步的隐藏状态来初始化下一个小批量的隐藏状态
从而使下一个小批量的输出也取决于当前小批量的输入,并如此循环下去。
这对实现循环神经网络造成了两方面影响:一方面,在训练模型时,
#只需要在每一个迭代周期开始时初始化隐藏状态;另一方面,当多个相邻小批量通过传递隐藏状态串联起来时,模型参数的梯度计算将依赖所有串联起来的小批量序列。

def data_iter_consecutive(corpus_indices,batch_size, num_steps, ctx=None):
    corpus_indices = torch.tensor(corpus_indices)
    data_len = len(corpus_indices)
    batch_len = data_len // batch_size
    indices = corpus_indices[0:batch_size*batch_len].reshape((batch_size,batch_len))
    epoch_size = (batch_len - 1) // num_steps
    for i in range(epoch_size):
        i = i * num_steps
        X = indices[:,i:i+num_steps]
        Y = indices[:,i+1:i+num_steps+1]
        yield X,Y

你可能感兴趣的:(深度学习)