Time-distributed 的理解

Time-distributed 的理解_第1张图片

“Time-distributed” 是一种用于深度学习处理序列数据的技术,它将神经网络中的层或网络独立地应用于序列的每个时间步长。在典型的前馈神经网络中,输入数据会被馈送到网络中,并且相同的权重会被应用于所有的输入特征。但是,当处理序列数据,如时间序列或自然语言时,我们需要在每个时间步长上应用相同的权重来捕捉时间信息。

“Time-distributed” 技术允许我们独立地应用每个时间步长上的层或网络。这可以通过在 Keras 或 PyTorch 中将层或网络包装在 “TimeDistributed” 层中来实现。

例如,如果我们有一个形状为 (batch_size, timesteps, input_dim) 的三维张量作为输入,应用一个具有 10 个单位的 “TimeDistributed” 密集层将产生一个形状为 (batch_size, timesteps, 10) 的三维张量作为输出。这个包装器可以用于任何模块,例如卷积层、循环神经网络层、全连接层等。 “Time-distributed” 层将相同的密集层应用于每个时间步长,从而使网络能够学习数据中的时间模式。

“Time-distributed” 层通常用于序列到序列模型中,如语言翻译或语音识别,其中输入和输出都是序列。

在 keras 中,自带 TimeDistributed。在 pytorch 中没有实现,需要自己手动实现。

以下是 pytorch 版本的 TimeDistributed 代码实现。

import torch
import torch.nn as nn

class TimeDistributed(nn.Module):
    def __init__(self, module):
        super(TimeDistributed, self).__init__()
        self.module = module

    def __multi_time(self, size):
        size_temp = list(size)
        size_temp = [size_temp[0] * size_temp[1]] + size_temp[2:]
        return tuple(size_temp)

    def __dist_time(self, size, batch, time_dim):
        size_temp = list(size)
        size_temp = [batch, time_dim] + size_temp[1:]
        return tuple(size_temp)

    def forward(self, x):
        # Squash samples and timesteps into a single axis
        x_reshape = x.contiguous().view(self.__multi_time(x.size()))
        y = self.module(x_reshape)
        y = y.contiguous().view(self.__dist_time(y.size(), x.size(0), x.size(1)))
        return y

input = torch.randn(3, 5, 3, 256, 256)  # 时间步数是5,batch_size是3,通道数是3,图片高宽都是256
model = TimeDistributed(nn.Conv2d(3, 16, kernel_size=3))  # 输入通道是3,输出通道是16,kernel_size=3
output = model(input)
print(output.shape)

参考:Time-distributed 的理解

你可能感兴趣的:(记录本,python)