我使用的数据集是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
我一直在尝试添加新图层并切换参数,但似乎没有任何效果。我相信问题可能是我增强数据和进行预处理的方式,但我不确定如何改进这一点。实施示例会很棒!
从数据集,我可以看到,
您需要训练的数据量非常少,因此模型预计会过度拟合。即使在增强和应用 dropout 层之后,可用数据的数量仍然太少,模型无法学习图像中的底层特征。
解决这个问题的一种可能方法是迁移学习。 (在互联网上)搜索经过训练可对 CT 扫描进行分类的模型,然后提取用于提取特征的模型部分,并使用它对数据集执行迁移学习。模型类型的一个例子是我在 kaggle 上做的一个:脑肿瘤分类(准确度~96%)
如果这些都不起作用,您可以在 CT 扫描图像上训练自动编码器(您可以从 kaggle 获取),然后使用自动编码器的编码器部分对您的数据集执行迁移学习
您获取的数据集包含少量数据,您可以在其上应用 CNN 模型,因此它预计会过度拟合并给出相同的精度。您可以使用其他适合少量数据集的算法,例如:随机森林、支持向量机(SVM)。如果您只想处理此数据集,请尝试使您自己的模型与 kaggle 用户不同。