我目前正在尝试重新创建这个纸的结果,在这个结果中,他们从日志过滤能量的“平面图”中进行特征提取。
由于论文没有说明我要寻找的是什么类型的特征,所以我目前正在尝试提取特征,并将它们与MFCC特征相匹配。本文提出了一种有限权分担( LWS )技术,该技术将谱频轴划分为分段,每个部分不与他人共享权重。
因此,我将输入图像分成13个部分,从(6,3,3)个输入图像中接收1个输出特性。6对于行数,3列表示给定日志melfilter energi的静态三角洲_德尔塔数据,最后3列表示颜色通道。
如果我使用了13个过滤器库,并绘制了这个图,结果会是每一个(1,3,3)矩阵都会产生一个特征,但这似乎有点太好了,所以我决定使用78个滤波器组,并将其划分为13个部分,从而可以从一个大小的矩阵(6、3、3)中提取出一个特征。
我正在用这种模式结构来训练网络:
def create_model(init_mode='normal',activation_mode='softsign',optimizer_mode="Adamax", activation_mode_conv = 'softsign'):
model = Sequential()
model.add(ZeroPadding2D((6,4),input_shape=(6,3,3)))
model.add(Convolution2D(32,3,3 , activation=activation_mode_conv))
print model.output_shape
model.add(Convolution2D(32, 3,3, activation=activation_mode_conv))
print model.output_shape
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,1)))
print model.output_shape
model.add(Convolution2D(64, 3,3 , activation=activation_mode_conv))
print model.output_shape
model.add(Convolution2D(64, 3,3 , activation=activation_mode_conv))
print model.output_shape
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,1)))
model.add(Flatten())
print model.output_shape
model.add(Dense(output_dim=32, input_dim=64, init=init_mode,activation=activation_mode))
model.add(Dense(output_dim=13, input_dim=50, init=init_mode,activation=activation_mode))
model.add(Dense(output_dim=1, input_dim=13, init=init_mode,activation=activation_mode))
model.add(Dense(output_dim=1, init=init_mode, activation=activation_mode))
#print model.summary()
model.compile(loss='mean_squared_error',optimizer=optimizer_mode)
return model
这个模型由于某种原因而保持不变,给我带来了非常糟糕的结果。我似乎一直亏损216,几乎是数据范围的3倍.
我做了一个网格搜索,以找出哪个参数(激活函数、init_mode、epochs和batch_size )最好,这是在上面的函数中选择的参数(尽管结果并没有太大的变化。)
我怎样才能得到更好的结果?CNN网络设计不好吗?
发布于 2017-03-22 08:23:05
我认为有一些建议可以改善CNN的表现:
MaxPooling
层是不可取的。padding = 'same'
,输出与输入相同维数的卷积图像。Relu
或LeakyRelu
作为激活函数。Adam optimizer
并调整学习速度。Dense
的建议将一些1x1 Convolution with no. of filters = no. of units in dense layer
层转换为sh37211层例如:
no_of_filters = [32, 64, 64, 32]
kernel_size = [3, 3, 3, 1]
input = Input(shape = (6,3,3), name = "input")
layer_output = [input]
for i in range(4):
convolution = Convolution2D(no_of_filters[i], kernel_size[i], kernel_size[i], padding = 'same')(layer_output[-1])
activation = LeakyReLU()(convolution)
layer_output.append(activation)
flatten = Flatten()(layer_output[-1])
flatten_dropout = Dropout(0.5)(flatten)
fc = Dense(output_dim = 13)
activation = LeakyReLU()(fc)
layer_output.append(activation)
fc = Dense(output_dim = 1, activation = 'tanh')
model.compile(loss = 'mean_squared_error',optimizer = 'adam')
发布于 2017-03-22 10:23:19
我给出的一个建议是改变CNN的层次。您有三个CNN层,所有的顺序添加在相同形状和输出相同的输出形状与相同的过滤器大小。
您可以尝试更改筛选器大小,并使用多个筛选器大小来捕获不同大小的不同功能。为此,请尝试以下模式:
main_input = Input(shape=input_shape, name="main input")
flattened_outputs = []
for i in filter_sizes:
conv_filter_i = Convolution1D(no_of_filters, i, border_mode='same', activation='relu', W_constraint=maxnorm(3))(main_input)
pooling_i = MaxPooling1D(pool_length=2)(conv_filter_i)
flattened_i = Flatten()(pooling_i)
flattened_outputs.append(flattened_i)
merged_conv_outputs = merge(flattened_outputs, mode="concat")
softmax = Dense(output_shape, activation="softmax")(merged_conv_outputs)
model = Model(input=main_input, output=softmax)
model.compile(loss='mean_squared_error',optimizer=optimizer_mode)
注意:必要时更改尺寸。
Dropout
层。https://datascience.stackexchange.com/questions/17629
复制相似问题