我对机器学习非常陌生。我已经收集了一个包含超过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)
1条答案
按热度按时间5fjcxozz1#
一些激活函数不是有意选择的。(详细信息请参阅https://machinelearningmastery.com/choose-an-activation-function-for-deep-learning/)。
由于您正在预测类概率,因此您希望最终的密集层(包含9个神经元)生成一个值向量,该值向量可以被解释为类成员资格的概率(即它们合计为1.0)。为此,您可以使用softmax函数。
对于所有其他层,您可以使用ReLU激活(也适用于第一个密集层)。