基于AlexNet架构的卷积神经网络模型用于对胸部X光图像进行二分类(例如,诊断肺炎)

1. 肺炎

正常的胸部 X 线片描绘了清晰的肺部,图像中没有任何异常混浊的区域。

正常的胸部X线片

1.1 细菌性肺炎

临床表现

        细菌性肺炎通常由细菌引起,如肺炎链球菌、流感嗜血杆菌、肺炎克雷伯菌等。患者可能出现高热、寒战、咳嗽、咳痰(痰液可能呈脓性)、胸痛、呼吸困难等症状。

影像学特征

局灶性肺叶实变

        细菌性肺炎在影像学上常表现为肺叶或肺段的局灶性实变,即某一区域的肺组织因炎症而失去气体交换功能,呈现为高密度影。

胸腔积液

        部分细菌性肺炎患者可能伴有胸腔积液,即胸膜腔内积聚了过多的液体,这进一步加剧了呼吸困难的症状。

实变发生在右上叶,这是细菌性肺炎常见的表现之一

1.2 病毒性肺炎

临床表现

        病毒性肺炎由病毒引起,如呼吸道合胞病毒、流感病毒、副流感病毒等。患者可能出现发热、咳嗽、乏力、呼吸急促等症状,但相比细菌性肺炎,其症状可能较轻或较重,具体取决于病毒的种类和患者的免疫力。

影像学特征

双肺弥漫性间质病变

        病毒性肺炎在影像学上常表现为双肺中弥漫性更强的“间质”模式,即肺间质(包括肺泡壁、肺血管周围和细支气管周围的结缔组织)发生炎症和水肿,导致肺组织密度增高,但不一定形成实变。这种病变通常更加弥漫,涉及多个肺叶或肺段。

磨玻璃影

        部分病毒性肺炎患者的胸部CT还可能显示磨玻璃影,即肺组织密度轻度增高,但支气管和血管纹理仍隐约可见,这反映了肺间质的水肿和炎症。

双肺中弥漫性更强的“间质”模式

2. AlexNet架构的卷积神经网络模型

2.1 导入必要的库

这些是用来构建、训练、评估神经网络模型以及可视化训练过程所需的库。

import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras import layers, models, callbacks
import os
import matplotlib.pyplot as plt
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping

2.2  设置数据路径和参数

指定训练、验证和测试数据的路径,以及图像大小和批处理大小。

train_dir = '/kaggle/input/chest_xray/train'
val_dir = '/kaggle/input/chest_xray/val'
test_dir = '/kaggle/input/chest_xray/test'
image_size = (227, 227)
batch_size = 32

2.3 数据预处理和增强

ImageDataGenerator 用于对图像进行预处理和数据增强。训练集中的图像会被重新缩放并应用多种随机变换(如旋转、平移、剪切、缩放、水平翻转),以增加模型的泛化能力。验证集和测试集只进行缩放。 

train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest'
)

val_datagen = ImageDataGenerator(rescale=1./255)
  • 增加 epochs 数量:将 epochs 数量从 20 增加到 50。
  • 数据增强参数:保持现有的数据增强参数,但可以根据需要进行调整。
  • 验证集和测试集的样本数量:在可能的情况下,增加验证集和测试集的样本数量。
train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest'
)

val_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
    train_dir,
    target_size=image_size,
    batch_size=batch_size,
    class_mode='binary'
)

val_generator = val_datagen.flow_from_directory(
    val_dir,
    target_size=image_size,
    batch_size=batch_size,
    class_mode='binary'
)

2.4 创建图像生成器

从指定目录加载图像,调整图像大小,并将它们转换为模型可接受的格式。

( class_mode='binary' 表示这是一个二分类问题。)

train_generator = train_datagen.flow_from_directory(
    train_dir,
    target_size=image_size,
    batch_size=batch_size,
    class_mode='binary'
)

val_generator = val_datagen.flow_from_directory(
    val_dir,
    target_size=image_size,
    batch_size=batch_size,
    class_mode='binary'
)

2.5 定义回调函数

ModelCheckpoint 用于在训练过程中保存模型的最佳版本(基于验证集上的最小损失),EarlyStopping 用于在验证损失不再改善时提前停止训练。

checkpoint_cb = ModelCheckpoint(
    'model_best.h5',
    save_best_only=True,
    monitor='val_loss',
    mode='min'
)

early_stopping_cb = EarlyStopping(
    patience=5,
    restore_best_weights=True,
    monitor='val_loss',
    mode='min'
)

2.6 构建AlexNet模型

 目录结构

chest_xray
    ├── train
    │   ├── NORMAL
    │   └── PNEUMONIA
    ├── val
    │   ├── NORMAL
    │   └── PNEUMONIA
    └── test
        ├── NORMAL
        └── PNEUMONIA

构建一个类似于AlexNet的卷积神经网络,包含多个卷积层、池化层、全连接层,以及在全连接层后应用的Dropout正则化。最后的输出层是一个使用sigmoid激活函数的神经元,用于二分类。

def build_alexnet(input_shape):
    model = models.Sequential()
    
    model.add(layers.Conv2D(96, (11, 11), strides=4, activation='relu', input_shape=input_shape))
    model.add(layers.MaxPooling2D((3, 3), strides=2))
    
    model.add(layers.Conv2D(256, (5, 5), padding='same', activation='relu'))
    model.add(layers.MaxPooling2D((3, 3), strides=2))
    
    model.add(layers.Conv2D(384, (3, 3), padding='same', activation='relu'))
    model.add(layers.Conv2D(384, (3, 3), padding='same', activation='relu'))
    model.add(layers.Conv2D(256, (3, 3), padding='same', activation='relu'))
    model.add(layers.MaxPooling2D((3, 3), strides=2))
    
    model.add(layers.Flatten())
    model.add(layers.Dense(4096, activation='relu'))
    model.add(layers.Dropout(0.5))
    model.add(layers.Dense(4096, activation='relu'))
    model.add(layers.Dropout(0.5))
    model.add(layers.Dense(1, activation='sigmoid'))
    
    return model

2.7 编译模型

编译模型,指定优化器(Adam)、损失函数(二分类交叉熵)和评价指标(准确率)

model = build_alexnet((image_size[0], image_size[1], 3))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()

2.8 训练模型

训练模型,使用前面定义的训练和验证生成器,以及回调函数。steps_per_epochvalidation_steps 确保每个epoch处理完所有的训练和验证数据。

history = model.fit(
    train_generator,
    steps_per_epoch=train_generator.samples // batch_size,
    epochs=20,  # 减少 epochs 数量
    validation_data=val_generator,
    validation_steps=val_generator.samples // batch_size,
    callbacks=[checkpoint_cb, early_stopping_cb]
)

2.9 评估模型 

使用测试集评估模型,并输出测试准确率

test_generator = val_datagen.flow_from_directory(
    test_dir,
    target_size=image_size,
    batch_size=batch_size,
    class_mode='binary'
)

test_loss, test_acc = model.evaluate(test_generator, steps=test_generator.samples // batch_size)
print('Test accuracy:', test_acc)

2.10 可视化训练和验证的准确率和损失

提取并可视化训练和验证过程中模型的准确率和损失,方便观察模型性能随时间的变化。

acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']

epochs = range(len(acc))

plt.plot(epochs, acc, 'r', label='Training accuracy')
plt.plot(epochs, val_acc, 'b', label='Validation accuracy')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()

plt.plot(epochs, loss, 'r', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.show()

3. 结果

训练结果

 增加验证集和测试集的样本数量:样本数量过少可能导致结果不稳定。

检查和修复数据集不平衡问题:如果某个类别的样本数量远多于另一个类别,可能会影响模型的训练。

调整模型的超参数:包括学习率、批量大小、数据增强参数等。

增加训练轮数:在更多的训练轮数下,模型可能会有更明显的变化。

总结

网络模型搭建不能契合该数据集,导致结果严重不符预期。失败。

数据集链接:

https://www.kaggle.com/datasets/paultimothymooney/chest-xray-pneumonia/data

感兴趣的同学可以试试 

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值