keras TimeDistributed 包装器

本文介绍了如何使用Keras中的TimeDistributed层来处理时序数据,特别是在目标检测模型FastRCNN中,对多个感兴趣区域(ROIs)进行独立处理的应用案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官方中文文档的说明如下:

输入至少为3D张量,下标为1的维度将被认为是时间维

例如,考虑一个含有32个样本的batch,每个样本都是10个向量组成的序列,每个向量长为16,则其输入维度为(32,10,16),其不包含batch大小的input_shape(10,16)

我们可以使用包装器TimeDistributed包装Dense,以产生针对各个时间步信号的独立全连接:


用途举例:

在搭建需要独立连接时的结构时需要用到,比如在faster rcnn中,在最后fast rcnn的结构中进行类别判断和box框的回归时,需要对num_rois个感兴趣区域ROIs进行回归处理,每一个区域的处理是相对独立的,等价于此时的时间步为num_rois,举例代码如下:

def classifier(base_layers, input_rois, num_rois, nb_classes=21, trainable=False):
    # compile times on theano tend to be very high, so we use smaller ROI pooling regions to workaround

    if K.backend() == 'tensorflow':
        pooling_regions = 14
        input_shape = (num_rois, 14, 14, 1024)
    elif K.backend() == 'theano':
        pooling_regions = 7
        input_shape = (num_rois, 1024, 7, 7)

    out_roi_pool = RoiPoolingConv(pooling_regions, num_rois)([base_layers, input_rois])  # 该层的输入为feature maps和roi的坐标信息
    out = classifier_layers(out_roi_pool, input_shape=input_shape, trainable=True)  # 输出的是(None, num_riois, 2048)的feature map

    out = TimeDistributed(Flatten())(out)  # 因为是对num_rois个feature maps分别处理的,所以需要使用timedistributed进行包装

    out_class = TimeDistributed(Dense(nb_classes, activation='softmax', kernel_initializer='zero'),
                                name='dense_class_{}'.format(nb_classes))(out)
    # 我们可以使用包装器TimeDistributed包装Dense,以产生针对各个时间步信号的独立全连接
    # note: no regression target for bg class
    out_regr = TimeDistributed(Dense(4 * (nb_classes - 1), activation='linear', kernel_initializer='zero'),
                               name='dense_regress_{}'.format(nb_classes))(out)
    return [out_class, out_regr]   # 一共有num_riois个out_class和out_regr


注:个人感觉这个思路和功能与slice layer非常相似

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值