深度学习训练营之灵笼人物识别

原文链接

环境介绍

  • 语言环境:Python3.9.13
  • 编译器:jupyter notebook
  • 深度学习环境:TensorFlow2

前置工作

设置GPU

如果使用的是CPU就不用设置了

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")

导入数据

对数据进行导入,首先是导入需要的包

import matplotlib.pyplot as plt
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

import os,PIL

# 设置随机种子尽可能使结果可以重现
import numpy as np
np.random.seed(1)

# 设置随机种子尽可能使结果可以重现
import tensorflow as tf
tf.random.set_seed(1)

from tensorflow import keras
from tensorflow.keras import layers,models

import pathlib

调整数据集所在的位置
在这里插入图片描述

data_dir = "D:\BaiduNetdiskDownload\sevenday\linglong_photos"

data_dir = pathlib.Path(data_dir)

数据查看

数据集一共分为白月魁、查尔斯、红蔻、马克、摩根、冉冰6个人物角色,分别存放于linglong_photos文件夹中以各自名字命名的子文件夹中。
对于每一个文件夹来说的含义如下

文件夹含义数量
baiyuekui白月魁40 张
chaersi查尔斯76 张
hongkou红蔻36 张
make马克38张
mogen摩根30 张
ranbing冉冰60张
image_count = len(list(data_dir.glob('*/*.jpg')))
print("图片总数为:",image_count)

图片总数为: 280

数据预处理

加载数据

使用image_dataset_from_directory方法将磁盘中的数据加载到tf.data.Dataset

batch_size = 16
img_height = 224
img_width = 224

"""
关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789
"""
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="training",
    seed=123,
    image_size=(img_height, img_width),
    batch_size=batch_size)

在这里插入图片描述
选择252进行训练

"""
关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789
"""
val_ds = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir,
    validation_split=0.1,
    subset="validation",
    seed=123,
    image_size=(img_height, img_width),
    batch_size=batch_size)

在这里插入图片描述
选择28张图片进行预测

通过class_names输出数据集的标签,标签按照字母顺序对应于目录名称

class_names=train_ds.class_names
print(class_names)

[‘baiyuekui’, ‘chaersi’, ‘hongkou’, ‘make’, ‘mogen’, ‘ranbing’]

可视化数据

plt.figure(figsize=(20, 10))  # 图形的宽为20高为10

for images, labels in train_ds.take(1):
    for i in range(8):
        
        ax = plt.subplot(2, 4, i + 1)  

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

![在这里请添加图片描述
展示其中一张图片

plt.imshow(images[7].numpy().astype("uint8"))

请添加图片描述

检查数据

for image_batch, labels_batch in train_ds:
    print(image_batch.shape)
    print(labels_batch.shape)
    break

(16, 224, 224, 3)
(16,)

  • Image_batch是形状的张量(32,180,180,3)。这是一批形状180x180x3的32张图片(最后一维指的是彩色通道RGB)。
  • Label_batch是形状(32,)的张量,这些标签对应32张图片

配置数据集

  • shuffle():打乱数据,关于此函数的详细介绍可以参考:https://zhuanlan.zhihu.com/p/42417456
  • prefetch():预取数据,加速运行

prefetch()功能详细介绍:

CPU 正在准备数据时,加速器处于空闲状态。相反,当加速器正在训练模型时,CPU 处于空闲状态。因此,训练所用的时间是 CPU 预处理时间和加速器训练时间的总和。prefetch()将训练步骤的预处理和模型执行过程重叠到一起。当加速器正在执行第 N 个训练步时,CPU 正在准备第 N+1 步的数据。这样做不仅可以最大限度地缩短训练的单步用时(而不是总用时),而且可以缩短提取和转换数据所需的时间。如果不使用prefetch(),CPU 和 GPU/TPU 在大部分时间都处于空闲状态
使用该函数的作用就在于尽可能的提高CPU等的使用性能,提高模型训练时候的速度
在这里插入图片描述
使用该函数可以减少空闲时间
在这里插入图片描述

  • 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)

归一化

normalization_layer = layers.experimental.preprocessing.Rescaling(1./255)

normalization_train_ds = train_ds.map(lambda x, y: (normalization_layer(x), y))
val_ds = val_ds.map(lambda x, y: (normalization_layer(x), y))

查看归一化后的数据

image_batch, labels_batch = next(iter(val_ds))
first_image = image_batch[0]

# 查看归一化后的数据
print(np.min(first_image), np.max(first_image))

构建VGG-19网络

在官方模型与自建模型之间进行二选一就可以啦,选着一个注释掉另外一个,都是正版的VGG-19哈。

VGG优缺点分析:

VGG优点

VGG的结构非常简洁,整个网络都使用了同样大小的卷积核尺寸(3x3)和最大池化尺寸(2x2)。

VGG缺点

1)训练时间过长,调参难度大。2)需要的存储容量大,不利于部署。例如存储VGG-16权重值文件的大小为500多MB,不利于安装到嵌入式系统中。

利用官方给到的网络

# model = keras.applications.VGG19(weights='imagenet')
# model.summary()

自建模型

from tensorflow.keras import layers, models, Input
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Flatten, Dropout

def VGG19(nb_classes, input_shape):
    input_tensor = Input(shape=input_shape)
    # 1st block
    x = Conv2D(64, (3,3), activation='relu', padding='same',name='block1_conv1')(input_tensor)
    x = Conv2D(64, (3,3), activation='relu', padding='same',name='block1_conv2')(x)
    x = MaxPooling2D((2,2), strides=(2,2), name = 'block1_pool')(x)
    # 2nd block
    x = Conv2D(128, (3,3), activation='relu', padding='same',name='block2_conv1')(x)
    x = Conv2D(128, (3,3), activation='relu', padding='same',name='block2_conv2')(x)
    x = MaxPooling2D((2,2), strides=(2,2), name = 'block2_pool')(x)
    # 3rd block
    x = Conv2D(256, (3,3), activation='relu', padding='same',name='block3_conv1')(x)
    x = Conv2D(256, (3,3), activation='relu', padding='same',name='block3_conv2')(x)
    x = Conv2D(256, (3,3), activation='relu', padding='same',name='block3_conv3')(x)
    x = Conv2D(256, (3,3), activation='relu', padding='same',name='block3_conv4')(x)
    x = MaxPooling2D((2,2), strides=(2,2), name = 'block3_pool')(x)
    # 4th block
    x = Conv2D(512, (3,3), activation='relu', padding='same',name='block4_conv1')(x)
    x = Conv2D(512, (3,3), activation='relu', padding='same',name='block4_conv2')(x)
    x = Conv2D(512, (3,3), activation='relu', padding='same',name='block4_conv3')(x)
    x = Conv2D(512, (3,3), activation='relu', padding='same',name='block4_conv4')(x)
    x = MaxPooling2D((2,2), strides=(2,2), name = 'block4_pool')(x)
    # 5th block
    x = Conv2D(512, (3,3), activation='relu', padding='same',name='block5_conv1')(x)
    x = Conv2D(512, (3,3), activation='relu', padding='same',name='block5_conv2')(x)
    x = Conv2D(512, (3,3), activation='relu', padding='same',name='block5_conv3')(x)
    x = Conv2D(512, (3,3), activation='relu', padding='same',name='block5_conv4')(x)
    x = MaxPooling2D((2,2), strides=(2,2), name = 'block5_pool')(x)
    # full connection
    x = Flatten()(x)
    x = Dense(4096, activation='relu',  name='fc1')(x)
    x = Dense(4096, activation='relu', name='fc2')(x)
    output_tensor = Dense(nb_classes, activation='softmax', name='predictions')(x)

    model = Model(input_tensor, output_tensor)
    return model

model=VGG19(1000, (img_width, img_height, 3))
model.summary()

在这里插入图片描述

网络结构

结构说明:

  • 16个卷积层(Convolutional Layer),分别用blockX_convX表示
  • 3个全连接层(Fully connected Layer),分别用fcX与predictions表示
  • 5个池化层(Pool layer),分别用blockX_pool表示
    VGG-19包含了19个隐藏层(16个卷积层和3个全连接层),故称为VGG-19

在这里插入图片描述

编译

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

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

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

模型训练

epochs = 10

history = model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=epochs
)

在这里插入图片描述

结果可视化

对模型进行评估

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()

这个学习率设置了1e-6,train的不好
在这里插入图片描述

预测

没有进行归一化的操作的预测结果:
在这里插入图片描述
一开始整的时候忘记设置了归一化

保存和加载模型

# 保存模型
model.save('model/my_model.h5')
# 加载模型
new_model = keras.models.load_model('model/my_model.h5')

预测

# 采用加载的模型(new_model)来看预测结果

plt.figure(figsize=(20, 10))  # 图形的宽为10高为5

for images, labels in val_ds.take(1):
    for i in range(8):
        ax = plt.subplot(2, 4, i + 1)  
        
        # 显示图片
        plt.imshow(images[i])
        
        # 需要给图片增加一个维度
        img_array = tf.expand_dims(images[i], 0) 
        
        # 使用模型预测图片中的人物
        predictions = new_model.predict(img_array)
        plt.title(class_names[np.argmax(predictions)])


        plt.axis("off")

请添加图片描述

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: 基于Python深度学习训练中文语音识别的方法如下: 首先,需要准备大量的中文语音数据集,包括不同人的发音、不同风格的语音素材等等。这些数据集可以是已经标注好的语音文件,每个文件对应一个标签,表示该语音的内容。 接下来,将这些语音数据进行预处理。这包括对语音进行分割,提取特征等。分割语音可以使用语音信号处理技术或者是预先设定好的固定长度。特征的提取可以使用常见的技术如MFCC(梅尔频率倒谱系数)等。这些特征将被用来训练模型。 然后,需要构建深度学习模型。常见的模型包括卷积神经网络(CNN)、循环神经网络(RNN)和端到端模型等。这些模型将接收语音特征作为输入,并输出对应的标签。根据实际需求,可以选择不同的模型结构进行训练。 接下来,使用预处理后的数据集来训练模型。训练过程包括将数据集分为训练集和验证集,使用优化算法(如梯度下降)来调整模型参数,以使模型能够准确地对输入的语音进行识别。可以通过计算识别准确率和损失函数的值来评估模型的性能。 在训练完成后,可以使用测试集对模型进行评估。这可以通过计算模型在测试集上的准确率、召回率等指标来实现。 最后,可以将训练好的模型用于实际的中文语音识别任务中。对于新的语音输入,模型将输出对应的标签,从而实现中文语音识别的功能。 总之,基于Python深度学习训练中文语音识别包括数据准备、预处理、模型构建、模型训练和模型评估等步骤。这些步骤需要合理选择和处理数据,选择适当的模型结构,并通过训练和评估来优化模型性能,从而实现准确的中文语音识别。 ### 回答2: 基于Python深度学习训练中文语音识别可以使用多种方法和技术。下面我将以300字来回答这个问题。 首先,为了进行中文语音识别的训练,我们需要一个大规模的中文语音数据集。这个数据集应该包含各种不同的中文口音和语言特点,以及不同的背景噪声场景。我们可以从公开的语音数据集中获取这些数据,也可以通过语音采集设备自己收集数据。 然后,我们可以使用Python中的深度学习库,如TensorFlow或PyTorch,来构建中文语音识别模型。常见的模型包括循环神经网络(RNN)和卷积神经网络(CNN)。RNN可以捕捉语音信号中的时序信息,而CNN可以提取语音信号中的频谱特征。 在训练模型之前,我们需要对语音数据进行预处理。这可能包括去除静音部分、音频特征提取(如MFCC等)和标签的生成。可以使用Python中的音频处理库,如Librosa或pydub,来帮助我们完成这些任务。 接下来,我们可以使用预处理的语音数据来训练我们的中文语音识别模型。训练的过程通常包括将数据分成训练集和验证集,使用随机梯度下降(SGD)算法来更新模型参数,并监控模型的验证准确率。 一旦模型训练完成,我们可以使用它来进行中文语音识别。给定一个未知语音输入,我们可以使用模型预测其对应的文本输出。我们可以使用Python中的推理库,如TensorFlow Serving或ONNX Runtime,来将训练好的模型部署到生产环境中。 综上所述,基于Python深度学习训练中文语音识别需要一个大规模的数据集、深度学习库、音频处理库和推理库。通过适当的预处理和模型训练,我们可以使用训练好的模型进行中文语音识别任务。 ### 回答3: 基于Python深度学习方法可以用于中文语音识别的训练。 首先,我们可以利用Python中的深度学习库,如TensorFlow或PyTorch,来构建一个语音识别模型。该模型可以包括卷积神经网络(CNN)或循环神经网络(RNN)的层,用于提取语音特征。然后,我们可以添加一些全连接层和输出层,通过梯度下降算法来训练模型,以便识别给定的中文语音。 其次,为了为模型提供训练数据,我们可以利用大规模的中文语音数据集。这些数据集可以包含各种不同的中文语音样本,以及它们的对应标签。我们可以使用Python的数据处理库,如NumPy或Pandas,来加载和处理这些数据集。 在训练过程中,我们可以使用Python中的深度学习框架提供的优化器和损失函数来调整模型的参数。通过迭代训练数据集的每个样本,并根据模型的预测结果进行反向传播更新参数,我们可以逐渐提高模型的准确性。 除了训练模型外,我们还可以使用Python的可视化库,如Matplotlib或Seaborn,来绘制和分析模型的性能指标。这些指标可以包括识别准确率、损失函数值等。 总而言之,借助Python深度学习工具,我们可以构建一个中文语音识别模型,并利用大规模的中文语音数据集对其进行训练。通过不断优化模型的参数,我们可以提高模型的准确性,并对其性能进行可视化和分析。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值