为什么我的Keras CNN模型在如此多的数据下达到了局部最小值?

brgchamk  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(202)

我对机器学习非常陌生。我已经收集了一个包含超过35万张图像的标记数据集,这些图像属于9个类别。我一直试图创建一个CNN,但遇到了几个障碍。主要的一个是在1个时期之后,我的模型准确性,验证损失和验证准确性在以后的时期都保持不变。
我的主要问题是我做错了什么,让我的网络如此快地达到局部最小值,我能做些什么来改进我的模型?我将在下面包括一些结果和更多关于我的模型架构的信息。任何帮助都非常感谢!

  • 训练数据占数据集的60%
  • 验证数据为数据集的20%
  • 测试数据占数据集的20%

IMAGE_SIZE = [225,300]
BATCH_SIZE = 32
NUM_EPOCHS = 10

class_weight = 
              [0: 1588.3125, 1: 457.434, 2: 83.53433162892622, 
               3: 13.31608057755007, 4: 1.9566857729489264, 5: 2.7059415077374473, 
               6: 2.6158218582734802, 7: 1.6870270110788204, 8: 18.367892707998713]

initial_learning_rate = 0.01
lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(
    initial_learning_rate, decay_steps=20, decay_rate=0.96, staircase=True
)

checkpoint_cb = tf.keras.callbacks.ModelCheckpoint(
    f"model_weights.h5", save_best_only=True
)

early_stopping_cb = tf.keras.callbacks.EarlyStopping(
    patience=10, restore_best_weights=True
)

model = models.Sequential()
model.add(layers.Conv2D(32, (3,3), activation = tf.nn.relu, input_shape=(*IMAGE_SIZE,3)))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(64, (2,2), activation = tf.nn.relu))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(128, (2,2), activation = tf.nn.relu))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(256, (2,2), activation = tf.nn.relu))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(512, (2,2), activation = tf.nn.relu))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Flatten())
model.add(layers.Dropout(0.2))
model.add(layers.Dense(512, activation = tf.nn.softmax))
model.add(layers.Dense(9))

model.compile(
    optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule), 
    loss = tf.keras.losses.SparseCategoricalCrossentropy(), 
    metrics=['accuracy'])

history = model.fit(
    train_dataset, 
    epochs = NUM_EPOCHS, 
    validation_data=(valid_dataset),
    callbacks=[checkpoint_cb, early_stopping_cb],
    class_weight=class_weight)

5fjcxozz

5fjcxozz1#

一些激活函数不是有意选择的。(详细信息请参阅https://machinelearningmastery.com/choose-an-activation-function-for-deep-learning/)。
由于您正在预测类概率,因此您希望最终的密集层(包含9个神经元)生成一个值向量,该值向量可以被解释为类成员资格的概率(即它们合计为1.0)。为此,您可以使用softmax函数。

model.add(layers.Dense(9, activation = tf.nn.softmax))

对于所有其他层,您可以使用ReLU激活(也适用于第一个密集层)。

model.add(layers.Dense(512, activation = tf.nn.relu))

相关问题