我的CNN出了什么问题?

时间:2018-05-07 15:13:30

标签: tensorflow deep-learning keras convolutional-neural-network

我真的不明白我的模特有什么问题。有时候它会给我带来很好的效果,但在其他情况下,结果却是荒谬的。在训练期间,从一个时刻到另一个时刻,它给出了荒谬的结果。我尝试了3个辍学图层的模型,没有它们,并获得相同的奇怪结果。这是我的模型定义:

protected override void OnExit(ExitEventArgs e) {
    base.OnExit(e); 
}

获得这样的结果:Results screenshot

发生了什么事?而且,你知道如何改进这个模型以获得更好的结果吗?

1 个答案:

答案 0 :(得分:2)

减少内核和池大小

通过浏览您的架构,我会说它值得为池和转换过滤器尝试更小的值。网络必须在同时查看100个值的同时找到模式。为了正确看待这一点,当在图像处理中使用卷积网时,他们发现2-4的内核大小是最好的。您仍然可以在更深层中同时查看多个数据点,因为它们汇集在一起​​时会查看更深层次的数据点组合。

增加批量大小

网络很难从单个示例中建立良好的梯度。你应该使用更大的批量,我会从32开始并从那里移动。

从上述更改开始,然后尝试...

  • 在输出图层之前添加另一个密集图层
  • 图层之间的批量标准化
  • 不同的激活功能。不确定您的用例是什么,但您可能需要查看它以优化性能

尝试这样的事情,看看它是否有所改善。

from keras import Sequential
from keras.layers import Conv1D, LeakyReLU, MaxPooling1D, Flatten, Dense
import keras

batch_size = 32
epochs = 25
model = Sequential()
model.add(Conv1D(32, input_shape=(1040, 1), kernel_size=2, padding='same', name='ConvLayer1', strides=1))
model.add(LeakyReLU(alpha=0.1))
model.add(MaxPooling1D(pool_size=2, strides=1, padding='same', name='PoolingLayer1'))
# model.add(Dropout(0.10))
model.add(Conv1D(64, kernel_size=3, padding='same', name='ConvLayer2', strides=1))
model.add(LeakyReLU(alpha=0.1))
model.add(MaxPooling1D(pool_size=3, strides=1, padding='same', name='PoolingLayer2'))
# model.add(Dropout(0.10))
model.add(Conv1D(128, kernel_size=3, padding='same', name='ConvLayer3', strides=1))
model.add(LeakyReLU(alpha=0.1))
model.add(MaxPooling1D(pool_size=3, strides=1, padding='same', name='PoolingLayer3'))
# model.add(Dropout(0.10))
model.add(Flatten())
model.add(Dense(1, name='output', activation='linear'))
model.compile(loss='mse', optimizer=keras.optimizers.Adam(lr=0.001), metrics=['mse'])
model.summary()

BatchNormalization示例

from keras.layers import BatchNormalization

model.add(Conv1D(32, input_shape=(1040, 1), kernel_size=2, padding='same', name='ConvLayer1', strides=1))
model.add(LeakyReLU(alpha=0.1))
model.add(BatchNormalization())  # Try adding this after each activation function except the output layer
model.add(MaxPooling1D(pool_size=2, strides=1, padding='same', name='PoolingLayer1'))

我还会添加早期停止和/或模型检查指示,以便在验证损失停止改进后停止训练,并允许您加载权重以获得最佳验证损失。