我真的不明白我的模特有什么问题。有时候它会给我带来很好的效果,但在其他情况下,结果却是荒谬的。在训练期间,从一个时刻到另一个时刻,它给出了荒谬的结果。我尝试了3个辍学图层的模型,没有它们,并获得相同的奇怪结果。这是我的模型定义:
protected override void OnExit(ExitEventArgs e) {
base.OnExit(e);
}
获得这样的结果:Results screenshot
发生了什么事?而且,你知道如何改进这个模型以获得更好的结果吗?
答案 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'))
我还会添加早期停止和/或模型检查指示,以便在验证损失停止改进后停止训练,并允许您加载权重以获得最佳验证损失。