官方中文文档的说明如下:
输入至少为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非常相似