我有一个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')))
答案 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))