首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >优化CNN网络

优化CNN网络
EN

Data Science用户
提问于 2017-03-16 02:52:28
回答 2查看 1.6K关注 0票数 6

我目前正在尝试重新创建这个的结果,在这个结果中,他们从日志过滤能量的“平面图”中进行特征提取。

由于论文没有说明我要寻找的是什么类型的特征,所以我目前正在尝试提取特征,并将它们与MFCC特征相匹配。本文提出了一种有限权分担( LWS )技术,该技术将谱频轴划分为分段,每个部分不与他人共享权重。

因此,我将输入图像分成13个部分,从(6,3,3)个输入图像中接收1个输出特性。6对于行数,3列表示给定日志melfilter energi的静态三角洲_德尔塔数据,最后3列表示颜色通道。

如果我使用了13个过滤器库,并绘制了这个图,结果会是每一个(1,3,3)矩阵都会产生一个特征,但这似乎有点太好了,所以我决定使用78个滤波器组,并将其划分为13个部分,从而可以从一个大小的矩阵(6、3、3)中提取出一个特征。

我正在用这种模式结构来训练网络:

代码语言:javascript
运行
复制
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网络设计不好吗?

EN

回答 2

Data Science用户

发布于 2017-03-22 08:23:05

我认为有一些建议可以改善CNN的表现:

  1. 输入的大小是(6,3),所以使用MaxPooling层是不可取的。
  2. 在所有卷积层中使用padding = 'same',输出与输入相同维数的卷积图像。
  3. 使用ReluLeakyRelu作为激活函数。
  4. 使用Adam optimizer并调整学习速度。
  5. 按照Dense的建议将一些1x1 Convolution with no. of filters = no. of units in dense layer层转换为sh37211层

例如:

代码语言:javascript
运行
复制
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')
票数 1
EN

Data Science用户

发布于 2017-03-22 10:23:19

我给出的一个建议是改变CNN的层次。您有三个CNN层,所有的顺序添加在相同形状和输出相同的输出形状与相同的过滤器大小。

您可以尝试更改筛选器大小,并使用多个筛选器大小来捕获不同大小的不同功能。为此,请尝试以下模式:

代码语言:javascript
运行
复制
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)

注意:必要时更改尺寸。

  1. 除此之外,我建议您使用Dropout层。
  2. 根据我个人的经验,这对我有很大帮助。另外,一定要使用adam优化器。
  3. 试验各种池机制。请记住,有许多试验必须进行,所以尝试各种其他参数和过滤大小也。
票数 1
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/17629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档