我想设计三个模型,它们具有相同的结构,但其中一个模型在最后应出现严重的过拟合,另一个模型的过拟合较少,最后一个模型则没有过拟合。
我的想法是,我想看看每个模型的最后一层对于一些测试数据包含多少信息。假设我使用MNIST数据集作为训练和测试集,所有模型的结构应该如下所示。
# 网络架构
network = Sequential()
# 输入层
network.add(Dense(512, activation='relu', input_shape=(28*28,) ))
# 隐藏层
network.add(Dense(64, activation='relu', name='features'))
# 输出层
network.add((Dense(10,activation='softmax')))
network.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# 训练模型
history = network.fit(train_img, train_label, epochs=50, batch_size=256, validation_split=0.2)
那么现在的问题是,如何修改这个训练模型以满足我对具有不同过拟合的三个模型的需求。
我在机器学习方面是新手,希望我已经尽可能清楚地解释了我的问题。
提前感谢
回答:
过拟合:
MNIST数据集相对简单,因此使用你建议的模型很容易过拟合。增加训练轮数:最终,你的模型会很好地记住训练数据。如果你发现很难让数据过拟合,可能需要一个更复杂的网络——但我认为这种情况不太可能发生。
恰到好处:
获得一个恰到好处的模型(没有过拟合或欠拟合)可能最简单的办法是使用回调。具体来说,我们可以使用提前停止。这个回调会在验证损失停止改善时停止训练。对于你的代码,你只需按如下方式修改训练:
-
首先定义一个回调
callback_es = tf.keras.callbacks.EarlyStopping(monitor = 'val_loss')
-
将回调添加到你的训练中
history = network.fit(train_img, train_label, epochs=50, batch_size=256, validation_split=0.2, callback = [callback_es])
欠拟合
与过拟合的想法类似。在这种情况下,你希望尽早停止训练。只训练模型有限的几个轮次。如果你发现你的模型过快地过拟合,可以尝试降低学习率。