深度学习实战——CNN训练识别COVID-19肺炎肺部CT图模型

1. COVID-19肺炎肺部CT图特征简述

(以下内容为查阅资料后整理,本人并非医学影像专业,如有错误敬请指正)

主要为间质化改变,磨玻璃影

2.数据预处理

为减少GPU计算量,先使用crop函数裁去CT图黑边,并对图像进行resize

(此处处理后的图片大小为420*290)

训练集与测试集数据总数:

traintest
covid-192289572
normal1592398

3.使用卷积神经网络(CNN)

参数:

steps_per_epoch=10,
validation_steps=50,
verbose=1,
epochs=70

 代码如下:

​

import os, glob
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow import keras
from keras import backend as K
from tensorflow.keras.optimizers import Adam
from keras import layers, models
from tensorflow.keras import activations

####### Generatiiing Data

batch_size = 64
SIZE1 = 420
SIZE2 = 290

train_datagen = ImageDataGenerator(rescale=1. / 255)
# Change the training path '/home/idu/Desktop/COV19D/train/' to where your training set's directory is
train_generator = train_datagen.flow_from_directory(
    '../train_CNN',  ## COV19-CT-DB Training set (335672 Images)
    target_size=(SIZE1, SIZE2),
    batch_size=batch_size,
    color_mode='grayscale',
    classes=['class1', 'class2'],
    class_mode='binary')

val_datagen = ImageDataGenerator(rescale=1. / 255)
# Change the training path '/home/idu/Desktop/COV19D/validation/' to where your validaiton set's directory is
val_generator = val_datagen.flow_from_directory(
    '../test_CNN',  ## COV19-CT-DB Validation set (75532 images)
    target_size=(SIZE1, SIZE2),
    batch_size=batch_size,
    color_mode='grayscale',
    classes=['class1', 'class2'],
    class_mode='binary')


################ CNN Model Architecture
def make_model():
    model = models.Sequential()

    # Convulotional Layer 1
    model.add(layers.Conv2D(16, (3, 3), input_shape=(SIZE1, SIZE2, 1), padding="same"))
    model.add(layers.BatchNormalization())
    model.add(layers.ReLU())
    model.add(layers.MaxPooling2D((2, 2)))

    # Convulotional Layer 2
    model.add(layers.Conv2D(32, (3, 3), padding="same"))
    model.add(layers.BatchNormalization())
    model.add(layers.ReLU())
    model.add(layers.MaxPooling2D((2, 2)))

    # Convulotional Layer 3
    model.add(layers.Conv2D(64, (3, 3), padding="same"))
    model.add(layers.BatchNormalization())
    model.add(layers.ReLU())
    model.add(layers.MaxPooling2D((2, 2)))

    # Convulotional Layer 4
    model.add(layers.Conv2D(128, (3, 3), padding="same"))
    model.add(layers.BatchNormalization())
    model.add(layers.ReLU())
    model.add(layers.MaxPooling2D((2, 2)))

    # Fully Connected Layer
    model.add(layers.Flatten())
    model.add(layers.Dense(256))
    model.add(layers.BatchNormalization())
    model.add(layers.ReLU())
    model.add(layers.Dropout(0.1))

    # Dense Layer
    model.add(layers.Dense(1, activation='sigmoid'))

    return model


model = make_model()

###################################### Compiling and Training the model
n_epochs = 70

model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=[tf.keras.metrics.Precision(), tf.keras.metrics.Recall(), 'accuracy'])

history = model.fit(train_generator,
                    steps_per_epoch=10,
                    validation_data=val_generator,
                    validation_steps=50,
                    verbose=1,
                    epochs=n_epochs)

######################## Evaluating
print(history.history.keys())

Train_accuracy = history.history['accuracy']
print(Train_accuracy)
print(np.mean(Train_accuracy))
model.save("model_cnn.pkl")
val_accuracy = history.history['val_accuracy']
print(val_accuracy)
print(np.mean(val_accuracy))

epochs = range(1, len(Train_accuracy) + 1)
plt.figure(figsize=(12, 6))
plt.plot(epochs, Train_accuracy, 'g', label='Training acc')
plt.plot(epochs, val_accuracy, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('accuracy')
plt.ylim(0.45, 1)
plt.xlim(0, 50)
plt.legend()

plt.show()

val_recall = history.history['val_recall']
print(val_recall)
avg_recall = np.mean(val_recall)
avg_recall

val_precision = history.history['val_precision']
avg_precision = np.mean(val_precision)
avg_precision

epochs = range(1, len(Train_accuracy) + 1)
plt.figure(figsize=(12, 6))
plt.plot(epochs, val_recall, 'g', label='Validation Recall')
plt.plot(epochs, val_precision, 'b', label='Validation Prcision')
plt.title('Validation recall and Validation Percision')
plt.xlabel('Epochs')
plt.ylabel('Recall and Precision')
plt.legend()
plt.ylim(0, 1)

plt.show()

Macro_F1score = (2 * avg_precision * avg_recall) / (avg_precision + avg_recall)
Macro_F1score

4.训练模型结果

 如图所示accuracy为0.9958  ,val_recall为0.7577

4.问题

使用plt库显示召回率时,会显示报错

ValueError: x and y must have same first dimension, but have shapes (70,) and (1,)

这是由于plt库中规定X,Y的维度应该一致,而我设置的参数维度不一致,所以导致报错并且无法显示,但是此处不影响模型的训练

  • 6
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
TensorFlow是一个被广泛应用于机器学习和深度学习的开源框架,它提供了丰富的工具和库来构建和训练神经网络模型。其中,CNN(卷积神经网络)是一种特别适用于像处理任务的神经网络结构,而VGGNet19是其中一个经典的CNN模型。 在进行像风格转化任务时,我们可以利用VGGNet19来实现。像风格转化是一种将一张像的内容与另一张像的风格相结合的技术,常用于艺术创作和像处理领域。在这个实战项目中,我们可以使用Jupyter Notebook来编写并运行我们的代码。 首先,我们需要准备两张输入片,一张作为内容像,一张作为风格像。然后,我们可以使用VGGNet19模型来提取内容像和风格像的特征表示。接着,我们需要定义一个损失函数,该损失函数可以度量内容像与生成像之间的内容差异,以及风格像与生成像之间的风格差异。最后,我们可以使用梯度下降等优化算法来最小化损失函数,从而生成新的像,使得它既保留了内容像的内容特征,又融合了风格像的风格特征。 在Jupyter Notebook中,我们可以逐步编写和调试这些代码,并及时查看生成的像效果。通过这个实战项目,我们不仅能够深入理解CNN模型像风格转化的原理,还能够掌握如何使用TensorFlow和Jupyter Notebook进行实际的深度学习任务。这将为我们在像处理和艺术创作领域带来更多的应用和创新可能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值