我的 CNN 有什么问题?

What is wrong with my CNN?

我真的不明白我的模型有什么问题。有时它会给我很好的结果,但在其他情况下,结果却很荒谬。在训练过程中,从一个时刻到另一个时刻,它会给出荒谬的结果。我尝试了带有 3 个 dropout 层和没有它们的模型,得到了同样奇怪的结果。这是我的模型定义:

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

得到那种结果:Results screenshot

这是怎么回事?还有,你知道我如何改进这个模型以获得更好的结果吗?

减小内核和池大小

仅浏览一下您的体系结构,我会说值得为池化和转换过滤器尝试更小的值。网络必须在同时查看 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'))

我还会添加提前停止 and/or 模型检查点,以在验证损失停止改善时停止训练,并允许您加载权重以获得最佳验证损失。