Time-distributed 的理解

2023-09-19 13:07:14

“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 的理解

更多推荐

【Java】泛型 之 使用泛型

使用ArrayList时,如果不定义泛型类型时,泛型类型实际上就是Object://编译器警告:Listlist=newArrayList();list.add("Hello");list.add("World");Stringfirst=(String)list.get(0);Stringsecond=(String

MySQL 锁机制

文章目录MySQL锁机制1、什么是锁2、锁的缺点3、锁的分类3.1表级锁(1)什么是表级锁(2)读锁(3)写锁(4)读锁和写锁的总结(5)表级锁的优点和缺点(6)表级锁优缺点总结3.2行级锁(1)什么是行级锁(2)读锁`S`(3)写锁(4)意向共享锁`IS`(5)意向排他锁`IX`(6)行级锁的优点和缺点(7)行级锁的

【MySQL】索引

索引索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查询算法,这种数据结构就是索引。优缺点:优点:提高数据检索效率,降低数据库的IO成本通过索引列对数据进行排序,降低数据排序的成本,降

安卓桌面记事本便签软件哪个好用?

日常生活及工作中,很多人常常会遇到一些一闪而现的灵感,这时候拿出手机想要记录时,却找不到记录的软件。在这个快节奏的时代,安卓手机是我们日常生活不可或缺的伙伴。然而,正因为我们的生活如此忙碌,记事变得尤为重要。无论是备忘、计划、灵感还是简单的笔记,都需要一个方便而强大的工具。所以问题来了,安卓桌面记事本便签软件中哪个才是

气传导与入耳式传导区别?气传导耳机好用吗?

​入耳式耳机隔音效果好,但佩戴舒适性差,音质更偏向沉浸式。相比传统入耳式耳机,气传导耳机可以提供开放的听觉体验,音质更加自然真实,同时避免了长时间佩戴耳机可能会带来的不适感。以下是我总结了最好用的几款气传导耳机,看看有没有喜欢的。Top1:NANK南卡00压开放式耳机点评:开放式音频“技术之王”,音质与舒适最好的开放式

链表oj题1(Leetcode)——移除链表元素,反转链表,链表的中间节点,

链表OJ一,移除链表元素1.1分析1.2代码二,找到链表的中间节点2.1分析2.2代码三,反转链表3.1分析3.2代码四,找到链表中倒数第k个节点4.1分析4.2代码一,移除链表元素移除链表元素1.1分析这里的删除要分成两种情况来考虑,因为这个题目给了我们头节点,所以分成头删和非头删。因为要记录下一个节点的位置,所以1

ceph分布式存储

目录前言一、概述(一)、特点(二)、组件(三)、架构图二、搭建(一)、基础环境(二)、准备工作(三)、ceph安装(四)、集群构建(五)、dashboard安装(六)、ceph文件系统创建(七)、客户端挂载总结前言Ceph项目最早起源于Sage就读博士期间的工作(最早的成果于2004年发表),并随后贡献给开源社区。在经

【SLAM】10.纵观SLAM,对比方案和未来方向

"天下谁人配白衣”SLAM方案研究方向SLAM方案站在历史角度,看一下为SLAM的发展带来贡献的方案:2007年—A.J.Davison—MonoSLAM视觉SLAM的先驱,建立在EKF基础上,此前基本无法在线运行,意义较大;应用场景窄;2007—Klein—PTAM也是SLAM重要事件:双线程结构;跟踪部分实时响应,

UI设计师的工作职责 优漫动游

五、思维导图软件:MindManager或XMindMindManager或XMind都为思维导图软件,具体使用哪个软件并不重要,根据个人习惯就行。思维导图想必大家在进行策划分析和头脑风暴时,都用过。在UI设计中,也是经常用到。优途UI设计培训中特开设该课程就是主要用来整理产品需求思路、产品架构、产品的交互逻辑等等。总

springBoot整合harbor

<docker.version>3.2.13</docker.version><fastjson.version>1.2.75</fastjson.version><dependencies><dependency><groupId>com.github.docker-java</groupId><artifactId

性能测试 —— 性能测试常见的测试指标 !

一、什么是性能测试先看下百度百科对它的定义,性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。我们可以认为性能测试是:通过在测试环境下对系统或构件的性能进行探测,用以验证在生产环境下系统性能是否达到预估的性能需求,发现系统可能存在的性能瓶颈,进而改善优化并系统的性能,提高系

热文推荐