在复杂的多标签问题上训练神经网络

问题描述 投票:0回答:1

我正在尝试在大型胸部 X 射线数据集 CheXpert (https://stanfordmlgroup.github.io/competitions/chexpert/) 上训练神经网络。您基本上拥有的是一组大约 (320, 390) 的灰度 X 射线图像和 14 个类,其中多个类可以同时为真:

我将这些标签编码为大小为 14 的向量,其中每个元素表示一个类的存在。我将所有不确定值(-1,NaN)转换为负数(0),正类标记为(1)。标签就会变成例如 [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1]。

然后我构建了以下神经网络:

data_augmentation = Sequential(
    [
        layers.RandomFlip("horizontal"),
        layers.RandomRotation(0.1),
        layers.RandomZoom(0.2),
    ]
)

inputs = tf.keras.Input(shape=(320, 390, 1))

x = layers.Rescaling(1./255)(inputs)

x = layers.Conv2D(filters=32, kernel_size=3, activation="relu")(x)

x = layers.MaxPooling2D(pool_size=2)(x)

x = layers.Conv2D(filters=64, kernel_size=3, activation="relu")(x)

x = layers.MaxPooling2D(pool_size=2)(x)

x = layers.Conv2D(filters=128, kernel_size=3, activation="relu")(x)

x = layers.MaxPooling2D(pool_size=2)(x)

x = layers.Conv2D(filters=256, kernel_size=3, activation="relu")(x)

x = layers.MaxPooling2D(pool_size=2)(x)

x = layers.Conv2D(filters=512, kernel_size=3, activation="relu")(x)

x = layers.MaxPooling2D(pool_size=2)(x)

x = layers.Dropout(0.5)(x)

x = layers.Flatten()(x)
outputs = layers.Dense(FEATURES_SIZE, activation="sigmoid")(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)

model.summary()

model.compile(loss="binary_crossentropy",
              optimizer="adam",
              metrics=[
                  'accuracy',
                  metrics.AUC(),
                  metrics.Precision(),
                  metrics.Recall()
              ]
)

callbacks = [
    ModelCheckpoint(
        filepath="chexpert_convnet1.tf",
        monitor="val_auc",
        save_best_only=True),
    EarlyStopping(
      monitor='val_auc',
      patience=4,
      restore_best_weights=True)
]

history = model.fit(
    train_dataset,
    epochs=20,
    validation_data=validation_dataset,
    callbacks=callbacks
)

但是假设训练进行得不太顺利:

Epoch 1/20
803/803 [==============================] - 256s 285ms/step - loss: 0.3541 - accuracy: 0.1143 - auc: 0.8130 - precision: 0.5535 - recall: 0.2665 - val_loss: 0.3387 - val_accuracy: 0.1296 - val_auc: 0.8357 - val_precision: 0.6213 - val_recall: 0.2707
Epoch 2/20
803/803 [==============================] - 224s 272ms/step - loss: 0.3321 - accuracy: 0.1542 - auc: 0.8403 - precision: 0.6029 - recall: 0.3794 - val_loss: 0.3290 - val_accuracy: 0.1536 - val_auc: 0.8462 - val_precision: 0.6011 - val_recall: 0.4224
Epoch 3/20
803/803 [==============================] - 223s 270ms/step - loss: 0.3250 - accuracy: 0.1668 - auc: 0.8487 - precision: 0.6168 - recall: 0.4034 - val_loss: 0.3242 - val_accuracy: 0.1407 - val_auc: 0.8523 - val_precision: 0.6055 - val_recall: 0.4673
Epoch 4/20
803/803 [==============================] - 219s 266ms/step - loss: 0.3197 - accuracy: 0.1784 - auc: 0.8547 - precision: 0.6266 - recall: 0.4182 - val_loss: 0.3195 - val_accuracy: 0.1724 - val_auc: 0.8570 - val_precision: 0.6441 - val_recall: 0.3875
Epoch 5/20
803/803 [==============================] - 225s 272ms/step - loss: 0.3143 - accuracy: 0.1868 - auc: 0.8606 - precision: 0.6382 - recall: 0.4286 - val_loss: 0.3175 - val_accuracy: 0.1676 - val_auc: 0.8599 - val_precision: 0.6145 - val_recall: 0.4828
Epoch 6/20
803/803 [==============================] - 231s 276ms/step - loss: 0.3085 - accuracy: 0.1966 - auc: 0.8667 - precision: 0.6524 - recall: 0.4439 - val_loss: 0.3148 - val_accuracy: 0.1820 - val_auc: 0.8620 - val_precision: 0.6471 - val_recall: 0.4198
Epoch 7/20
803/803 [==============================] - 230s 275ms/step - loss: 0.3019 - accuracy: 0.2087 - auc: 0.8737 - precision: 0.6616 - recall: 0.4571 - val_loss: 0.3156 - val_accuracy: 0.1584 - val_auc: 0.8610 - val_precision: 0.6570 - val_recall: 0.3934

我不知道从这里该去哪里。有没有人有类似经历?

python tensorflow keras neural-network
1个回答
0
投票

我没有发现代码或架构有任何问题。看起来棒极了。

问题

我提出一些研究深度学习时的几点建议:

  1. 尝试查找有关您任务的调查论文,以熟悉最先进的方法。有时您不需要重新发明轮子。我向您推荐这个斯坦福排行榜:https://stanfordmlgroup.github.io/competitions/chexpert/

  2. 熟悉最先进的框架,并尝试找到已经构建的东西来快速构建原型。仅当预构建方法不能满足您的用例时,才采用自定义架构。

  3. 如果你的模型在几个 epoch 内没有达到 99%,并不意味着模型是错误的,只是需要更多的 epoch。您将耐心设置为 4。让纪元飞翔,看看进展如何。

加快训练时间并提高准确性的技巧:

1.学习率调度:

实施学习率调度,例如随着时间的推移降低学习率。这是一个例子。但总能找到最适合你的。

from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import LearningRateScheduler

initial_learning_rate = 0.001

lr_schedule = LearningRateScheduler(lambda epoch: initial_learning_rate / (10 ** (epoch // 10)))

model.compile(
    loss="binary_crossentropy",
    optimizer=Adam(learning_rate=initial_learning_rate),
    metrics=['accuracy', tf.keras.metrics.AUC(), tf.keras.metrics.Precision(), tf.keras.metrics.Recall()]
)

history = model.fit(
    train_dataset,
    epochs=20,
    validation_data=validation_dataset,
    callbacks=[lr_schedule, ModelCheckpoint(filepath="chexpert_convnet1.tf", monitor="val_auc", save_best_only=True), EarlyStopping(monitor='val_auc', patience=4, restore_best_weights=True)]
)

2.简化您的架构

考虑减少卷积数量并添加一些密集层以从卷积中学习模式。

inputs = tf.keras.Input(shape=(320, 390, 1))

x = layers.Rescaling(1./255)(inputs)

x = layers.Conv2D(filters=32, kernel_size=3, activation="relu")(x)

x = layers.MaxPooling2D(pool_size=2)(x)

x = layers.Conv2D(filters=64, kernel_size=3, activation="relu")(x)

x = layers.MaxPooling2D(pool_size=2)(x)

x = layers.Conv2D(filters=128, kernel_size=3, activation="relu")(x)

x = layers.MaxPooling2D(pool_size=2)(x)

x = layers.Dropout(0.5)(x)

x = layers.Flatten()(x)

# Two Dense layers added
x = layers.Dense(256, activation="relu")(x)
x = layers.Dropout(0.5)(x)
x = layers.Dense(128, activation="relu")(x)

outputs = layers.Dense(FEATURES_SIZE, activation="sigmoid")(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
© www.soinside.com 2019 - 2024. All rights reserved.