首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Val_accuracy保持不变,用于CNN模型来检测脑肿瘤;我认为我增强数据和预处理的方式是错误的

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

Stack Overflow用户
提问于 2022-02-20 21:22:41
回答 1查看 19关注 0票数 0

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

代码语言:javascript
复制
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

我一直试图添加新的层和切换参数,但似乎没有任何工作。我相信问题可能在于我增强数据和进行预处理的方式,但我不知道如何改进。实现的例子会很棒!

EN

回答 1

Stack Overflow用户

发布于 2022-02-21 10:41:57

数据集,我可以看到,

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

您有一个非常少的数据培训,所以模型预计将过分适合。即使在增强和应用掉层之后,对于模型来说,可用数据的数量也太少,无法了解图像中的基本特性。

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

如果所有这些都不起作用,您可以在CT扫描图像上训练自动编码器(可以从kaggle获得),然后将自动编码器的编码器部分用于对数据集执行传输学习。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71198909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档