我有一个Conv2D
层生成形状为(batch_size, 600, 105, 8)
的张量。这是一批歌曲频谱图,特征图大小为8。现在我想对每个时间帧(600)应用大小为48的”Dense”层,以生成形状为(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() # 添加卷积层 for _ in range(num_layers): # 卷积层 model.add(Conv2D( feature_map_size, kernerl_size, input_shape=input_shape, padding='same', activation='elu') ) # Dropout层 # model.add(Dropout(dropout)) # 密集层 model.add(TimeDistributed(Dense(48, activation='elu')))
回答:
最基本且不敏感的处理方法是重塑数据:
#卷积之后:model.add(Reshape((600,105*8)))model.add(Dense(48,...))
但这可能不是最佳选择。不幸的是,我对这些频谱图的理解不够,所以建议其他方法。但这种方法基本上是将所有频谱和特征混合在一个密集层中,它们将被混合在一起。
如果使用-1
重塑失败
有一种可能是在lambda层内使用后端函数处理未知形状。但这仅在tensorflow作为后端时有效。Theano不喜欢这个想法。我因为这个放弃了Theano。
#仅在tensorflow中有效import keras.backend as Kdef 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))