CNN 模型检测脑肿瘤的 Val_accuracy 保持不变;我认为我增强数据和预处理的方式是错误的

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

我使用的数据集是https://www.kaggle.com/clarksaben/ct-head-scans

def augment_data(image):
    images = [image]
    for i in range(6):
        transform = A.Compose([
        A.Resize(256, 256), 
        A.RandomCrop(224, 224),
        A.OneOf([A.HorizontalFlip(p=1),
                 A.RandomRotate90(p=1),
                 A.VerticalFlip(p=1),
                 A.Blur(),
                 A.RandomBrightnessContrast(p=1)], p = 1),
        A.OneOf([A.MotionBlur(p=1),
                 A.OpticalDistortion(p=1),
                 A.GaussNoise(p=1),
                 A.RandomGamma(p=1),
                 A.CLAHE(p=1)], p=1),
        ])
        transformed_image = transform(image = image)
        images.append(transformed_image['image'])
    return images

def load_data(data):
    paths = ['../input/ct-head-scans/' + x for x in data['ID']]
    images = []
    for path in paths:
        if path.find('gaus') == -1 and path.find('elastic') == -1 and path.find('contrast') == -1 and path.find('gamma') == -1 and path.find('clahe') == -1 and path.find('blur') == -1:
            image = cv2.imread(path, 0)
            image = cv2.bilateralFilter(image, 2, 50, 50)
            augmented = augment_data(image)
            for aImage in augmented:
                img_data = aImage.astype('float32')
        
                img_data = cv2.resize(img_data,(256,256)) / 255
                img_data = img_data.reshape((256,256,1))
                images.append(img_data)
    return images, data['Tumor Present']

def define_model():
    model = Sequential()
    model.add(Conv2D(16, (5, 5), activation = 'relu', input_shape=(256, 256, 1)))
    model.add(Dropout(0.5))
    model.add(MaxPooling2D(2, 2))
    model.add(Conv2D(16, (5, 5), activation = 'relu'))
    model.add(MaxPooling2D(2, 2))
    model.add(Conv2D(32, (5, 5), activation = 'relu'))
    model.add(MaxPooling2D(2, 2))
    model.add(Conv2D(32, (5, 5), activation = 'relu'))
    model.add(MaxPooling2D(2, 2))
    model.add(Conv2D(64, (5, 5), activation = 'relu'))
    model.add(MaxPooling2D(2, 2))
    model.add(Flatten())
    model.add(Dense(10, activation='sigmoid'))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Flatten())
    model.add(Dense(1, activation='sigmoid'))
    model.add(Flatten())
    opt = tf.keras.optimizers.Adam(learning_rate=0.001)
    model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])
    return model

我一直在尝试添加新图层并切换参数,但似乎没有任何效果。我相信问题可能是我增强数据和进行预处理的方式,但我不确定如何改进这一点。实施示例会很棒!

python machine-learning conv-neural-network artificial-intelligence data-augmentation
2个回答
0
投票

数据集,我可以看到,

  • 对照组有30个样本
  • 坏死有22个样本
  • 肿瘤有31个样本

您需要训练的数据量非常少,因此模型预计会过度拟合。即使在增强和应用 dropout 层之后,可用数据的数量仍然太少,模型无法学习图像中的底层特征。

解决这个问题的一种可能方法是迁移学习。 (在互联网上)搜索经过训练可对 CT 扫描进行分类的模型,然后提取用于提取特征的模型部分,并使用它对数据集执行迁移学习。模型类型的一个例子是我在 kaggle 上做的一个:脑肿瘤分类(准确度~96%)

如果这些都不起作用,您可以在 CT 扫描图像上训练自动编码器(您可以从 kaggle 获取),然后使用自动编码器的编码器部分对您的数据集执行迁移学习


0
投票

您获取的数据集包含少量数据,您可以在其上应用 CNN 模型,因此它预计会过度拟合并给出相同的精度。您可以使用其他适合少量数据集的算法,例如:随机森林、支持向量机(SVM)。如果您只想处理此数据集,请尝试使您自己的模型与 kaggle 用户不同。

© www.soinside.com 2019 - 2024. All rights reserved.