我使用的数据集是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我一直试图添加新的层和切换参数,但似乎没有任何工作。我相信问题可能在于我增强数据和进行预处理的方式,但我不知道如何改进。实现的例子会很棒!
发布于 2022-02-21 10:41:57
从数据集,我可以看到,
您有一个非常少的数据培训,所以模型预计将过分适合。即使在增强和应用掉层之后,对于模型来说,可用数据的数量也太少,无法了解图像中的基本特性。
解决这一问题的一种可能方法是转移学习。搜索(在互联网上)经过训练的模型,以便对CT扫描进行分类,然后提取用于提取特征的部分,并使用该部分对数据集执行传输学习。这种类型的模型的一个例子是我在kaggle上做的一个例子:脑肿瘤分类(准确率~96%)
如果所有这些都不起作用,您可以在CT扫描图像上训练自动编码器(可以从kaggle获得),然后将自动编码器的编码器部分用于对数据集执行传输学习。
https://stackoverflow.com/questions/71198909
复制相似问题