【发布时间】:2020-10-17 17:21:28
【问题描述】:
我已经构建并测试了两个卷积神经网络模型 (VGG-16 and 3-layer CNN) 来预测 COVID-19 的肺部 CT 扫描分类。
在分类之前,我通过k-means clustering对图像进行了图像分割,试图提高分类性能。
分割后的图像如下所示。
我已经分别在分段图像和原始图像上训练和评估了 VGG-16 模型。最后,仅在分割图像上训练和评估 3 层 CNN。以下是他们的训练/验证损失和准确性的结果。
对于简单的 3 层 CNN 模型,我可以清楚地看到该模型训练得很好,并且一旦 epoch 超过 2,它就会开始过度拟合。但是,我不明白 VGG 模型的验证准确性如何t 看起来像一条指数曲线,相反它看起来像一条水平直线或波动的水平线。 此外,简单的 3 层 CNN 模型似乎表现更好。这是由于 VGG 模型中的梯度消失造成的吗?或者图像本身很简单,深度架构不会受益? 如果您能分享您对模型的这种学习行为的了解,我将不胜感激。
这是 VGG-16 模型的代码:
# build model
img_height = 256
img_width = 256
model = Sequential()
model.add(Conv2D(input_shape=(img_height,img_width,1),filters=64,kernel_size=(3,3),padding="same", activation="relu"))
model.add(Conv2D(filters=64,kernel_size=(3,3),padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Flatten())
model.add(Dense(units=4096,activation="relu"))
model.add(Dense(units=4096,activation="relu"))
model.add(Dense(units=1, activation="sigmoid"))
opt = Adam(lr=0.001)
model.compile(optimizer=opt, loss=keras.losses.binary_crossentropy, metrics=['accuracy'])
这是 3 层 CNN 的代码。
# build model
model2 = Sequential()
model2.add(Conv2D(32, 3, padding='same', activation='relu',input_shape=(img_height, img_width, 1)))
model2.add(MaxPool2D())
model2.add(Conv2D(64, 5, padding='same', activation='relu'))
model2.add(MaxPool2D())
model2.add(Flatten())
model2.add(Dense(128, activation='relu'))
model2.add(Dense(1, activation='sigmoid'))
opt = Adam(lr=0.001)
model2.compile(optimizer=opt, loss=keras.losses.binary_crossentropy, metrics=['accuracy'])
谢谢!
【问题讨论】:
-
训练/测试集大小?
-
@CAFEBABE 有 598 张训练图像和 148 张测试图像,比例为 80-20。
-
两个班级的分布是80-20还是train test split?什么是班级分布?
-
@CAFEBABE 是 349 阳性和 397 阴性。类分布相当平衡。
标签: python machine-learning keras deep-learning neural-network