我有一个暹罗CNN在训练数据上的表现非常好(准确率为96%,损失为0.08)但在测试数据上表现不佳(70%准确率,0.1%损失)。
架构如下:
input_main = Input(shape=input_shape, dtype='float32')
x = Conv2D(32, (3, 3), padding='same', activation='relu',
kernel_regularizer=l2(0.005))(input_main)
x = Conv2D(16, (5, 5), activation='relu',
kernel_regularizer=l2(0.005))(x)
x = MaxPooling2D(pool_size=(5, 5))(x)
x = Dropout(0.5)(x)
x = Conv2D(32, (3, 3), padding='same', activation='relu',
kernel_regularizer=l2(0.0005))(x)
x = Conv2D(32, (7, 7), activation='relu',
kernel_regularizer=l2(0.005))(x)
x = MaxPooling2D(pool_size=(3, 3))(x)
x = Dropout(0.5)(x)
x = Flatten()(x)
#x = Dropout(0.5)(x)
x = Dense(16, activation='relu',
kernel_regularizer=l2(0.005))(x)
model = Model(inputs=input_main, outputs=x)
然后将其中两个组合成一个连体结构,最后一层的矢量之间的差异通知结果。我已经尝试了辍学和正规化,但都没能解决问题(这些参数是我在发布时测试的那些参数)
我还尝试将架构简化为更少的转换层,但这并没有解决问题。
数据是256x128x1图像,通过网络与二进制标签成对发送,具体取决于它们是否相同。我还使用数据增强,一些小的旋转和翻译。
有人可以提出任何其他建议来解决这个过度拟合的问题吗?