Python|Pandas|Tensorflow实现新冠病毒检测实战

共 9674字,需浏览 20分钟

 ·

2021-08-10 21:09

介绍
Covid 是一种致命的疾病,会影响呼吸系统。检测一个人是否患有新冠病毒非常重要。在本博客中,我们将确定一个人是否患有新冠肺炎。

输入

让我们导入执行任务所需的工具。
import pandas as pd
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.applications import ResNet50
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense, Flatten, GlobalAveragePooling2D
from tensorflow.keras.applications import ResNet50
import tensorflow as tf
import matplotlib.pyplot as plt

读取数据

train_data=pd.read_csv("Training_set_covid.csv")
print(train_data)

由于我们只有图像文件的名称和它们的标签,让我们添加一个由它们的文件路径组成的列。我们可以使用 ImageDataGenerator 加载图像。
train_data["filepath"]="train/"+train_data["filename"]
print(train_data)

我已经用“file-path”替换了实际的文件路径。

数据增强

由于我们的数据很少,我正在扩充我的数据并创建一个变量来存储训练和验证图像
train_datagen=ImageDataGenerator(validation_split=0.2,zoom_range=0.2,rescale=1./255.,horizontal_flip=True)
在这里,我们将缩放范围设置为 0.2,并将图像重新缩放为 1/255 大小,并制作了训练图像的 20% 的验证集。
train_data["label"]=train_data["label"].astype(str)
上面的代码会将我们的 int 标签转换为字符串类型。

加载图像

train_images=train_datagen.flow_from_dataframe(train_data,x_col="filepath",batch_size=8,target_size=(255,255),class_mode="binary",shuffle=True,subset='training',y_col="label")
valid_images=train_datagen.flow_from_dataframe(train_data,x_col="filepath",batch_size=8,target_size=(255,255),class_mode="binary",shuffle=True,subset='validation',y_col="label")
在这里,我们创建了 2 个数据流、1 个训练集和另一个验证集。为此我们设置了一些参数。参数如:
  1. Batch Size –> 8
  2. Target Size (Image size) –> (255,255)
  3. Shuffle –> True
  4. Class Mode –> Binary
由于我们只有 2 个目标属性,因此我们设置了类模式 Binary。
Resnet50 将 (255,255) 作为输入形状,因此我们的图像大小为 (255,255)。
Shuffle 设置为 True,以足够好地对图像进行打乱,以便两个集合都有不同的图像。

RESNET50

让我们加载我们的 ResNet50 模型。但在进入代码路径之前,请访问 https://www.mygreatlearning.com/blog/resnet/以了解 ResNet50 是什么以及它是如何工作的。
base_model = ResNet50(input_shape=(225225,3), include_top=False, weights="imagenet")
for layer in base_model.layers:
    layer.trainable = False

base_model = Sequential()
base_model.add(ResNet50(include_top=False, weights='imagenet', pooling='max'))
base_model.add(Dense(1, activation='sigmoid'))
base_model.compile(optimizer = tf.keras.optimizers.SGD(lr=0.0001), loss = 'binary_crossentropy', metrics = ['acc'])
base_model.summary()
让我们理解这个代码块。
首先,我们将使用我们的输入形状和权重加载一个基本模型。在这里,我们使用了image-net权重。我们已经移除了顶部,因为我们将添加我们的输出层。
然后,我们将所有基础模型层设置为不可训练,因为我们不想覆盖加载时导入的权重。
现在,我们正在创建我们的基础模型,我们添加一个 50 个单元的 Dense 层来创建一个全连接层,该层连接到我们的输出密集层,具有 1 个单元和 Sigmoid 作为激活函数。
然后我们用 SGD 优化器和一些微调和二进制交叉熵作为损失函数编译它。
这是我们的模型的外观:
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
resnet50 (Functional)        (None2048)              23587712  
_________________________________________________________________
dense_1 (Dense)              (None1)                 2049      
=================================================================
Total params: 23,589,761
Trainable params: 23,536,641
Non-trainable params: 53,120
_________________________________________________________________

训练

resnet_history = base_model.fit(train_images, validation_data = valid_images, steps_per_epoch =int(train_images.n/8), epochs = 20)
让我们用验证集训练我们的模型,训练图像并验证它们。有 20 个 epoch,每个 epoch 的步数设置为训练样本数/8 以进行平衡,批量大小为 8。
Epoch 1/20
348/348 [==============================] - 162453ms/step - loss: 0.7703 - acc: 0.8588 - val_loss: 1.2608 - val_acc: 0.8791
Epoch 2/20
348/348 [==============================] - 84242ms/step - loss: 0.3550 - acc: 0.9198 - val_loss: 2.8488 - val_acc: 0.4518
Epoch 3/20
348/348 [==============================] - 84241ms/step - loss: 0.3501 - acc: 0.9229 - val_loss: 1.0196 - val_acc: 0.7007
Epoch 4/20
348/348 [==============================] - 84241ms/step - loss: 0.3151 - acc: 0.9207 - val_loss: 0.5498 - val_acc: 0.8633
Epoch 5/20
348/348 [==============================] - 85245ms/step - loss: 0.2376 - acc: 0.9281 - val_loss: 0.4247 - val_acc: 0.9094
Epoch 6/20
348/348 [==============================] - 86246ms/step - loss: 0.2273 - acc: 0.9248 - val_loss: 0.3911 - val_acc: 0.8978
Epoch 7/20
348/348 [==============================] - 86248ms/step - loss: 0.2166 - acc: 0.9319 - val_loss: 0.2936 - val_acc: 0.9295
Epoch 8/20
348/348 [==============================] - 87251ms/step - loss: 0.2016 - acc: 0.9389 - val_loss: 0.3025 - val_acc: 0.9281
Epoch 9/20
348/348 [==============================] - 87249ms/step - loss: 0.1557 - acc: 0.9516 - val_loss: 0.2762 - val_acc: 0.9281
Epoch 10/20
348/348 [==============================] - 85243ms/step - loss: 0.1802 - acc: 0.9418 - val_loss: 0.3382 - val_acc: 0.9353
Epoch 11/20
348/348 [==============================] - 84242ms/step - loss: 0.1430 - acc: 0.9586 - val_loss: 0.3222 - val_acc: 0.9324
Epoch 12/20
348/348 [==============================] - 85243ms/step - loss: 0.0977 - acc: 0.9695 - val_loss: 0.2110 - val_acc: 0.9410
Epoch 13/20
348/348 [==============================] - 85245ms/step - loss: 0.1227 - acc: 0.9572 - val_loss: 0.2738 - val_acc: 0.9281
Epoch 14/20
348/348 [==============================] - 86246ms/step - loss: 0.1396 - acc: 0.9558 - val_loss: 0.2508 - val_acc: 0.9439
Epoch 15/20
348/348 [==============================] - 86247ms/step - loss: 0.1173 - acc: 0.9578 - val_loss: 0.2025 - val_acc: 0.9381
Epoch 16/20
348/348 [==============================] - 86246ms/step - loss: 0.1038 - acc: 0.9604 - val_loss: 0.2658 - val_acc: 0.9439
Epoch 17/20
348/348 [==============================] - 86247ms/step - loss: 0.0881 - acc: 0.9707 - val_loss: 0.2997 - val_acc: 0.9309
Epoch 18/20
348/348 [==============================] - 87249ms/step - loss: 0.1036 - acc: 0.9627 - val_loss: 0.2527 - val_acc: 0.9367
Epoch 19/20
348/348 [==============================] - 87251ms/step - loss: 0.0848 - acc: 0.9736 - val_loss: 0.2461 - val_acc: 0.9439
Epoch 20/20
348/348 [==============================] - 87250ms/step - loss: 0.0742 - acc: 0.9736 - val_loss: 0.2483 - val_acc: 0.9439
我们有很好的结果。让我们看看它的图表。

性能图

精度图

plt.plot(resnet_history.history["acc"],label="train")
plt.plot(resnet_history.history["val_acc"],label="val")
plt.title("Training Accuracy and Validation Accuracy")
plt.legend()
我们有很好的训练和验证准确性。

损失

plt.plot(resnet_history.history["loss"],label="train")
plt.plot(resnet_history.history["val_loss"],label="val")
plt.title("Training Loss and Validation Loss")
plt.legend()
而且损失少。

结论

即使如此少的数据,ResNet50 也给出了令人满意的结果。
数据取自 https://dphi.tech/challenges/data-sprint-15-covid-19-x-ray-dataset/44/overview/about
···  END  ···


长按加群,交流学习

推荐阅读:
一、Number(数字)
全面掌握Python基础,这一篇就够了,建议收藏
Python基础之数字(Number)超级详解
Python随机模块22个函数详解
Python数学math模块55个函数详解
二、String(字符串)
Python字符串的45个方法详解
Pandas向量化字符串操作
三、List(列表)
超级详解系列-Python列表全面解析
Python轻量级循环-列表推导式
四、Tuple(元组)
Python的元组,没想象的那么简单
五、Set(集合)
全面理解Python集合,17个方法全解,看完就够了
六、Dictionary(字典)
Python字典详解-超级完整版
七、内置函数
Python初学者必须吃透这69个内置函数!
八、正则模块
Python正则表达式入门到入魔
笔记 | 史上最全的正则表达式
八、系统操作
Python之shutil模块11个常用函数详解
Python之OS模块39个常用函数详解
九、进阶模块
【万字长文详解】Python库collections,让你击败99%的Pythoner
高手如何在Python中使用collections模块

扫描关注本号↓

浏览 49
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报