1

我真的不明白我的模型有什么问题。有时它给了我很好的结果,但在其他情况下,结果只是荒谬的。在训练期间,从一个时刻到另一个时刻,它给出了荒谬的结果。我尝试了有 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'])

得到那种结果:结果截图

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

4

1 回答 1

2

减小内核和池大小

仅仅浏览一下您的架构,我会说值得为 pooling 和 conv 过滤器尝试更小的值。网络必须在同时查看 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()

批量标准化示例

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'))

一旦验证损失停止改善,我还将添加提前停止和/或模型检查点以停止训练,并允许您加载权重以获得最佳验证损失。

于 2018-05-08T19:40:43.990 回答