Bootstrap

TensorFlow_T4 猴痘病识别

目录

 

一、前言

 二、前期准备

1、设置GPU

2、导入数据

3、查看数据

三、数据预处理

1、加载数据

2、可视化数据

3、再次检查数据

4、配置数据集

四、构建CNN网络

五、编译

六、训练模型

七、模型评估

1、Loss and Acurracy图

2、指定图片进行预测


一、前言

 二、前期准备

1、设置GPU

from tensorflow       import keras
from tensorflow.keras import layers,models
import os, PIL, pathlib
import matplotlib.pyplot as plt
import tensorflow        as tf

gpus = tf.config.list_physical_devices("GPU")

if gpus:
    gpu0 = gpus[0]                                        #如果有多个GPU,仅使用第0个GPU
    tf.config.experimental.set_memory_growth(gpu0, True)  #设置GPU显存用量按需使用
    tf.config.set_visible_devices([gpu0],"GPU")
gpus

2、导入数据

data_dir = "./P4/"

data_dir = pathlib.Path(data_dir)

3、查看数据

image_count = len(list(data_dir.glob('*/*.jpg')))

print("图片总数为:",image_count)

运行结果如下:

  

Monkeypox = list(data_dir.glob('Monkeypox/*.jpg'))
PIL.Image.open(str(Monkeypox[0]))

运行结果如下:

  

三、数据预处理

1、加载数据

batch_size = 32
img_height = 224
img_width = 224

(1)调大batchsize会使得模型训练速度更快,但可能会降低模型的泛化能力。因为较大的batchsize意味着每次更新参数时使用的训练样本更多,这会导致模型对训练数据的噪声更加敏感,从而降低了模型在未见过的数据上的性能。
(2)调小batchsize则会使得模型训练速度变慢,但可能会提高模型的泛化能力。较小的batchsize意味着每次更新参数时使用的训练样本较少,这会使模型对训练数据的细节更加敏感,从而提高了模型在未见过的数据上的性能。然而,过小的batchsize可能会导致训练不稳定或收敛速度较慢。

train_ds = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    shuffle=True,
    subset="training",
    seed=123,
    image_size=(img_height, img_width),
    batch_size=batch_size)

运行结果如下:

  

val_ds = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    shuffle=True,
    subset="validation",
    seed=123,
    image_size=(img_height, img_width),
    batch_size=batch_size)

运行结果如下:

  

2、可视化数据

plt.figure(figsize=(20, 10))

for images, labels in train_ds.take(1):
    for i in range(20):
        ax = plt.subplot(5, 10, i + 1)

        plt.imshow(images[i].numpy().astype("uint8"))
        plt.title(class_names[labels[i]])
        
        plt.axis("off")

运行结果如下:

  

3、再次检查数据

for image_batch, labels_batch in train_ds:
    print(image_batch.shape)
    print(labels_batch.shape)
    break #只处理一个批次的

运行结果如下:

  

4、配置数据集

prefetch()功能详细介绍:CPU 正在准备数据时,加速器处于空闲状态。相反,当加速器正在训练模型时,CPU 处于空闲状态。因此,训练所用的时间是 CPU 预处理时间和加速器训练时间的总和。prefetch()将训练步骤的预处理和模型执行过程重叠到一起。当加速器正在执行第 N 个训练步时,CPU 正在准备第 N+1 步的数据。这样做不仅可以最大限度地缩短训练的单步用时(而不是总用时),而且可以缩短提取和转换数据所需的时间。如果不使用prefetch(),CPU 和 GPU/TPU 在大部分时间都处于空闲状态:

  

使用prefetch()可显著减少空闲时间:

  

 cache() :将数据集缓存到内存当中,加速运行

AUTOTUNE = tf.data.AUTOTUNE

train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)

这段代码是用于优化数据加载和预处理过程:

(1)AUTOTUNE = tf.data.AUTOTUNE: tf.data.AUTOTUNE是一个特殊的值,用于告诉TensorFlow在运行时自动调整数据加载和预处理的参数,以获得最佳性能。

(2)train_ds = train_ds.cache(): 这行代码将训练数据集(train_ds)缓存到内存中。缓存可以将数据集存储在内存中,以便更快地访问和处理数据。这对于大型数据集非常有用,因为它可以避免重复读取和预处理数据。

(3)train_ds = train_ds.shuffle(1000): 这行代码对训练数据集进行随机洗牌。洗牌操作会随机打乱数据集中的样本顺序,有助于提高模型的泛化能力。这里的1000表示洗牌缓冲区的大小,即每次从数据集中抽取多少个样本进行洗牌。

(4)train_ds = train_ds.prefetch(buffer_size=AUTOTUNE): 这行代码使用prefetch方法预取训练数据集的下一个批次。预取操作可以在数据实际被模型使用之前将其加载到内存中,从而减少等待时间并提高数据处理速度。buffer_size=AUTOTUNE表示使用前面定义的AUTOTUNE变量作为预取缓冲区的大小。

(5)val_ds = val_ds.cache(): 这行代码将验证数据集(val_ds)缓存到内存中。与训练数据集类似,缓存可以加速数据的访问和处理。

(6)val_ds = val_ds.prefetch(buffer_size=AUTOTUNE): 这行代码使用prefetch方法预取验证数据集的下一个批次。与训练数据集类似,这里也使用了buffer_size=AUTOTUNE来自动调整预取缓冲区的大小。

四、构建CNN网络

卷积神经网络(CNN)的输入是张量 (Tensor) 形式的 (image_height, image_width, color_channels),包含了图像高度、宽度及颜色信息。不需要输入batch size。color_channels 为 (R,G,B) 分别对应 RGB 的三个颜色通道(color channel)。在此示例中,我们的 CNN 输入的形状是 (224, 224, 3)即彩色图像。我们需要在声明第一层时将形状赋值给参数input_shape

  

num_classes = 2

model = models.Sequential([
    layers.experimental.preprocessing.Rescaling(1./255, input_shape=(img_height, img_width, 3)),
    
    layers.Conv2D(16, (3, 3), activation='relu', input_shape=(img_height, img_width, 3)),  
    layers.AveragePooling2D((2, 2)),              
    layers.Conv2D(32, (3, 3), activation='relu'),  
    layers.AveragePooling2D((2, 2)),               
    layers.Dropout(0.3),  
    layers.Conv2D(64, (3, 3), activation='relu'),  
    layers.Dropout(0.3),  
    
    layers.Flatten(),                       
    layers.Dense(128, activation='relu'),   
    layers.Dense(num_classes)               
])

model.summary() 

运行结果如下:

  

五、编译

在准备对模型进行训练之前,还需要再对其进行一些设置。以下内容是在模型的编译步骤中添加的:

  • 损失函数(loss):用于衡量模型在训练期间的准确率。
  • 优化器(optimizer):决定模型如何根据其看到的数据和自身的损失函数进行更新。
  • 指标(metrics):用于监控训练和测试步骤。以下示例使用了准确率,即被正确分类的图像的比率。
# 设置优化器
opt = tf.keras.optimizers.Adam(learning_rate=1e-4)

model.compile(optimizer=opt,
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

六、训练模型

from tensorflow.keras.callbacks import ModelCheckpoint

epochs = 50

checkpointer = ModelCheckpoint('best_model.h5',
                                monitor='val_accuracy',
                                verbose=1,
                                save_best_only=True,
                                save_weights_only=True)

history = model.fit(train_ds,
                    validation_data=val_ds,
                    epochs=epochs,
                    callbacks=[checkpointer])

(1) from tensorflow.keras.callbacks import ModelCheckpoint
这行代码导入了ModelCheckpoint类,它是Keras中用于在训练过程中保存模型权重和最佳性能的回调函数。
(2) checkpointer = ModelCheckpoint(……) 这行代码创建了一个ModelCheckpoint对象,用于在训练过程中保存模型的最佳性能。具体来说,它指定了以下参数:
'best_model.h5':保存模型的文件名;
monitor='val_accuracy':监控指标为验证集上的准确率;
verbose=1:在训练过程中输出详细信息;
save_best_only=True:仅保存具有最佳性能的模型;
save_weights_only=True:仅保存模型的权重,不保存整个模型结构。
(3)history = model.fit(train_ds, validation_data=val_ds, epochs=epochs, callbacks=[checkpointer]) 这行代码使用fit方法来训练模型。它传递了以下参数:
train_ds:训练数据集;
validation_data=val_ds:验证数据集;
epochs=epochs:训练轮数;
callbacks=[checkpointer]:回调函数列表,包括之前创建的checkpointer对象。

  

七、模型评估

1、Loss and Acurracy图

acc = history.history['accuracy']
val_acc = history.history['val_accuracy']

loss = history.history['loss']
val_loss = history.history['val_loss']

epochs_range = range(epochs)

plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')

plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

  

2、指定图片进行预测


model.load_weights('best_model.h5')

from PIL import Image
import numpy as np

# 打开图像并转换为RGB模式
image = Image.open("./P4/Monkeypox/M06_01_04.jpg").convert("RGB")

# 将图像转换为NumPy数组
numpy_image = np.array(image)

# 将NumPy数组转换为Tensor
tensor_image = tf.convert_to_tensor(numpy_image, dtype=tf.float32)


img_array = tf.expand_dims(tensor_image, 0) 

predictions = model.predict(img_array) # 这里选用你已经训练好的模型
print("预测结果为:",class_names[np.argmax(predictions)])

预测结果为: Monkeypox


👏觉得文章对自己有用的宝子可以收藏文章并给小编点个赞!

👏想了解更多统计学、数据分析、数据开发、机器学习算法、深度学习等有关知识的宝子们,可以关注小编,希望以后我们一起成长!

;