如何将TimeDistributed密集层应用于形状的张量(batch_size,600,105,8)以生成输出(batch_size,600,48)

时间:2017-10-11 03:48:12

标签: machine-learning neural-network computer-vision deep-learning keras

我有一个Conv2D图层,产生一个形状张量(batch_size, 600, 105, 8)。这是一组歌曲谱图,其feature_map为8.现在我想在每个时间帧(600)上应用大小为48的“密集”层,以产生形状(batch_size, 600, 48)的张量。默认的Keras Dense图层似乎没有削减它......

有什么建议吗?

这是我的功能

def build_cnn(input_shape=(None, None, 1),
          feature_map_size=8,
          num_layers=5,
          kernerl_size=(5, 5),
          dropout=0.2,
          pool_size=(2, 2),
          epochs=100,
          lr=0.001,
          momentum=0.9,
          verbose=False):

    model = Sequential()

    # Add the convolutional layers
    for _ in range(num_layers):     
        # Conv layer
        model.add(Conv2D(
            feature_map_size,
            kernerl_size,
            input_shape=input_shape,
            padding='same',
            activation='elu')
        )
        # Dropout layer
        # model.add(Dropout(dropout))

    # Dense layer
    model.add(TimeDistributed(Dense(48, activation='elu')))

1 个答案:

答案 0 :(得分:0)

最基本且最不敏感的方法是重塑数据:

#after the convolutions:

model.add(Reshape((600,105*8)))
model.add(Dense(48,...))

但这可能不是最好的选择。不幸的是,我不太了解那些光谱,所以建议其他方法。但是这个基本上抛出了Dense层中的所有箱子和特征,它们将混合在一起。

如果使用-1进行重塑失败

使用后端函数可以在lambda图层内处理未知形状。但这仅适用于tensorflow作为后端。 Theano不喜欢这个主意。因此,我放弃了theano。

#valid in tensorflow only
import keras.backend as K

def reshape(x):
    shp = K.shape(x)
    shp = K.concatenate([shp[:2],shp[2:3]*shp[3:]])
    return K.reshape(x,shp)

model.add(Lambda(reshape))