目录
使用Keras程序实现迁移学习" >使用Keras程序实现迁移学习
训练一个深度学习模型" >训练一个深度学习模型
获取数据集" >获取数据集
数据预处理" >数据预处理
准备数据" >准备数据
分割数据集" >分割数据集
定义到各目录的路径" >定义到各目录的路径
进行预处理" >进行预处理
创建模型" >创建模型
存储模型" >存储模型
测试模型" >测试模型
加载定制的模型" >加载定制的模型
准备输入图像" >准备输入图像
编写预测函数" >编写预测函数
显示与预测图像" >显示与预测图像
结论" >结论
译者介绍" >译者介绍
首页 科技周边 人工智能 使用迁移学习技术进行深度学习模型的定制训练

使用迁移学习技术进行深度学习模型的定制训练

Apr 23, 2023 am 08:13 AM
机器学习 数据集 迁移学习

​译者 | 朱先忠

审校 | 孙淑娟

迁移学习是机器学习的一种类型,它是一种应用于已经训练或预训练的神经网络的方法,而且这些预训练的神经元网络是使用数百万个数据点训练出来的。

使用迁移学习技术训练定制深度学习模型

该技术目前最著名的用法是用来训练深度神经网络,因为这种方法在使用较少的数据训练深度神经网络时表现出良好的性能。实际上,这种技术在数据科学领域也是很有用的,因为大多数真实世界的数据通常没有数百万个数据点来训练出稳固的深度学习模型。

目前,已经存在许多使用数百万个数据点训练出来的模型,并且这些模型可以用于以最大精度来训练复杂的深度学习神经网络。

在本教程中,您将学习到如何使用迁移学习技术来训练一个深度神经网络的完整过程。

使用Keras程序实现迁移学习

在构建或训练深度神经网络之前,您必须搞清楚有哪些选择方案可用于迁移学习,以及必须使用哪个方案来为项目训练复杂的深度神经网络。

Keras应用程序是一种高级的深度学习模型,它提供了可用于预测、特征提取和微调的预训练权重。Keras库中内置提供了许多现成可用的模型,其中一些流行的模型包括:

  • Xception
  • VGG16 and VGG19
  • ResNet Series
  • MobileNet

【补充】Keras应用程序提供了一组深度学习模型,它们可与预先训练的权重一起使用。有关这些模型的更具体的内容,请参考​​Keras官网内容​​。

在本文中,您将学习​​MobileNet模型​​在迁移学习中的应用。

训练一个深度学习模型

在本节中,您将学习如何在短短的几个步骤内为图像识别构建一个自定义深度学习模型,而无需编写任何一系列卷积神经网络(CNN),您只需对预训练的模型加以微调,即可使得您的模型在训练数据集上进行训练。

在本文中,我们构建的深度学习模型将能够识别手势语言数字的图像。接下来,让我们开始着手构建这个自定义深度学习模型。

获取数据集

要开始构建一个深度学习模型的过程,您首先需要准备好数据,您可以通过访问一个名为Kaggle的网站,从数百万个数据集中轻松选择合适的数据集。当然,也存在不少其他网站为构建深度学习或机器学习模型提供可用的数据集。

但本文将使用的数据集取自Kaggle网站提供的​​美国手语数字数据集​​。

数据预处理

在下载数据集并将其保存到本地存储之后,现在是时候对数据集执行一些预处理了,比如准备数据、将数据拆分为train目录、valid目录和test目录、定义它们的路径以及为训练目的创建批处理,等等。

准备数据

下载数据集时,它包含从0到9数据的目录,其中有三个子文件夹分别对应输入图像、输出图像以及一个名称为CSV的文件夹。

接着,从每个目录中删除输出图像和CSV文件夹,将输入图像文件夹下的内容移动到主目录下,然后删除输入图像文件夹。

数据集的每个主目录现在都拥有500幅图像,您可以选择保留所有图像。但出于演示目的,本文中每个目录中只使用其中的200幅图像。

最终,数据集的结构将如下图所示:

使用迁移学习技术训练定制深度学习模型

数据集的文件夹结构

分割数据集

现在,让我们从将数据集拆分为train、valid和test三个子目录开始。

  • train目录将包含训练数据,这些数据将作为我们输入模型的输入数据,用于学习模式和不规则性。
  • valid目录将包含将被输入到模型中的验证数据,并且将是模型所看到的第一个未看到的数据,这将有助于获得最大的准确性。
  • test目录将包含用于测试模型的测试数据。

首先,我们来导入将在代码中进一步使用的库。

# 导入需要的库
import os
import shutil
import random
登录后复制

下面是生成所需目录并将数据移动到特定目录的代码。

#创建三个子目录:train、valid和test,并把数据组织到其下
os.chdir('D:SACHINJupyterHand Sign LanguageHand_Sign_Language_DL_ProjectAmerican-Sign-Language-Digits-Dataset')

#如果目录不存在则创建相应的子目录
if os.path.isdir('train/0/') is False:
os.mkdir('train')
os.mkdir('valid')
os.mkdir('test')

for i in range(0, 10):
#把0-9子目录移动到train子目录下
shutil.move(f'{i}', 'train')
os.mkdir(f'valid/{i}')
os.mkdir(f'test/{i}')

#从valid子目录下取90个样本图像
valid_samples = random.sample(os.listdir(f'train/{i}'), 90)
for j in valid_samples:
#把样本图像从子目录train移动到valid子目录
shutil.move(f'train/{i}/{j}', f'valid/{i}')

#从test子目录下取90个样本图像
test_samples = random.sample(os.listdir(f'train/{i}'), 10)
for k in test_samples:
#把样本图像从子目录train移动到test子目录
shutil.move(f'train/{i}/{k}', f'test/{i}')

os.chdir('../..')
登录后复制

在上面的代码中,我们首先更改了数据集在本地存储中对应的目录,然后检查是否已经存在train/0目录;如果没有,我们将分别创建train、valid和test子目录。

然后,我们创建子目录0到9,并将所有数据移动到train目录中,同时创建了valid和test这两个子目录下各自的子目录0至9。

然后,我们在train目录内的子目录0到9上进行迭代,并从每个子目录中随机获取90个图像数据,并将它们移动到valid目录内的相应子目录。

对于测试目录test也是如此。

【补充】在Python中执行高级文件操作的shutil模块(手动将文件或文件夹从一个目录复制或移动到另一个目录可能是一件非常痛苦的事情。有关详细技巧,请参考文章https://medium.com/@geekpython/perform-high-level-file-operations-in-python-shutil-module-dfd71b149d32)。

定义到各目录的路径

创建所需的目录后,现在需要定义train、valid和test这三个子目录的路径。

#为三个子目录train、valid和test分别指定路径
train_path = 'D:/SACHIN/Jupyter/Hand Sign Language/Hand_Sign_Language_DL_Project/American-Sign-Language-Digits-Dataset/train'
valid_path = 'D:/SACHIN/Jupyter/Hand Sign Language/Hand_Sign_Language_DL_Project/American-Sign-Language-Digits-Dataset/valid'
test_path = 'D:/SACHIN/Jupyter/Hand Sign Language/Hand_Sign_Language_DL_Project/American-Sign-Language-Digits-Dataset/test'
登录后复制

进行预处理

预训练的深度学习模型需要一些预处理的数据,这些数据非常适合训练。因此,数据需要采用预训练模型所需的格式。

在应用任何预处理之前,让我们导入TensorFlow及其实用程序,这些实用程序将在代码中进一步使用。

#导入TensorFlow及其实用程序
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.layers import Dense, Activation
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.metrics import categorical_crossentropy
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.preprocessing import image
from tensorflow.keras.models import Model
from tensorflow.keras.models import load_model
登录后复制

#创建训练、校验和测试图像的批次,并使用Mobilenet的预处理模型进行预处理
train_batches = ImageDataGenerator(preprocessing_function=tf.keras.applications.mobilenet.preprocess_input).flow_from_directory(
directory=train_path, target_size=(224,224), batch_size=10, shuffle=True)
valid_batches = ImageDataGenerator(preprocessing_function=tf.keras.applications.mobilenet.preprocess_input).flow_from_directory(
directory=valid_path, target_size=(224,224), batch_size=10, shuffle=True)
test_batches = ImageDataGenerator(preprocessing_function=tf.keras.applications.mobilenet.preprocess_input).flow_from_directory(
directory=test_path, target_size=(224,224), batch_size=10, shuffle=False)
登录后复制

我们使用了ImageDatagenerator,它采用了一个参数preprocessing_function,在该函数参数中,我们对MobileNet模型提供的图像进行了预处理。

接下来,调用flow_from_directory函数,其中我们提供了要训练图像的目录和维度的路径,因为MobileNet模型是为具有224x224维度的图像训练使用的。

再接下来,定义了批量大小——定义一次迭代中可以处理多少图像,然后我们对图像处理顺序进行随机打乱。在此,我们没有针对测试数据的图像进行随机乱序,因为测试数据不会用于训练。

在Jupyter笔记本或Google Colab中运行上述代码片断后,您将看到如下结果。

使用迁移学习技术训练定制深度学习模型

上述代码的输出结果

ImageDataGenerator的一般应用场景是用于增广数据,以下是使用Keras框架中ImageDataGenerator执行数据增广的​​指南​​。

创建模型

在将训练和验证数据拟合到模型中之前,深度学习模型MobileNet需要通过添加输出层、删除不必要的层以及使某些层不可训练,从而获得更好的准确性来进行微调。

以下代码将从Keras下载MobileNet模型并将其存储在mobile变量中。您需要在第一次运行以下代码片断时连接到因特网。

mobile = tf.keras.applications.mobilenet.MobileNet()
登录后复制

如果您运行以下代码,那么您将看到模型的摘要信息,在其中你可以看到一系列神经网络层的输出信息。

mobile.summary()
登录后复制

现在,我们将在模型中添加以10为单位的全连接输出层(也称“稠密层”)——因为从0到9将有10个输出。此外,我们从MobileNet模型中删除了最后六个层。

# 删除最后6层并添加一个输出层
x = mobile.layers[-6].output
output = Dense(units=10, activation='softmax')(x)
登录后复制

然后,我们将所有输入和输出层添加到模型中。

model = Model(inputs=mobile.input, outputs=output)
登录后复制

现在,我们将最后23层设置成不可训练的——其实这是一个相对随意的数字。一般来说,这一具体数字是通过多次试验和错误获得的。该代码的唯一目的是通过使某些层不可训练来提高精度。

#我们不会训练最后23层——这里的23是一个相对随意的数字
for layer in mobile.layers[:-23]:
layer.trainable=False
登录后复制

如果您看到了微调模型的摘要输出,那么您将注意到与前面看到的原始摘要相比,不可训练参数和层的数量存在一些差异。

model.summary()
登录后复制

接下来,我们要编译名为Adam的优化器,选择学习率为0.0001,以及损失函数,还有衡量模型的准确性的度量参数。

model.compile(optimizer=Adam(learning_rate=0.0001), loss='categorical_crossentropy', metrics=['accuracy'])
登录后复制

现在是准备好模型并根据训练和验证数据来开始训练的时候了。在下面的代码中,我们提供了训练和验证数据以及训练的总体轮回数。详细信息只是为了显示准确性进度,在这里您可以指定一个数字参数值为0、1或者2。

# 运行共10个轮回(epochs)
model.fit(x=train_batches, validation_data=valid_batches, epochs=10, verbose=2)
登录后复制

如果您运行上面的代码片断,那么您将看到训练数据丢失和准确性的轮回的每一步的输出内容。对于验证数据,您也能够看到这样的输出结果。

使用迁移学习技术训练定制深度学习模型

显示有精度值的训练轮回步数

存储模型

该模型现在已准备就绪,准确度得分为99%。现在请记住一件事:这个模型可能存在过度拟合,因此有可能对于给定数据集图像以外的图像表现不佳。

#检查模型是否存在;否则,保存模型
if os.path.isfile("D:/SACHIN/Models/Hand-Sign-Digit-Language/digit_model.h5") is False:
model.save("D:/SACHIN/Models/Hand-Sign-Digit-Language/digit_model.h5")
登录后复制

上面的代码将检查是否已经有模型的副本。如果没有,则通过调用save函数在指定的路径中保存模型。

测试模型

至此,模型已经经过训练,可以用于识别图像了。本节将介绍加载模型和编写准备图像、预测结果以及显示和打印预测结果的函数。

在编写任何代码之前,需要导入一些将在代码中进一步使用的必要的库。

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
登录后复制

加载定制的模型

对图像的预测将使用上面使用迁移学习技术创建的模型进行。因此,我们首先需要加载该模型,以供后面使用。

my_model = load_model("D:/SACHIN/Models/Hand-Sign-Digit-Language/digit_model.h5")
登录后复制

在此,我们通过使用load_model函数,实现从指定路径加载模型,并将其存储在my_model变量中,以便在后面代码中进一步使用。

准备输入图像

在向模型提供任何用于预测或识别的图像之前,我们需要提供模型所需的格式。

def preprocess_img(img_path):
open_img = image.load_img(img_path, target_size=(224, 224))
img_arr = image.img_to_array(open_img)/255.0
img_reshape = img_arr.reshape(1, 224,224,3)
return img_reshape
登录后复制

首先,我们要定义一个获取图像路径的函数preprocess_img,然后使用image实用程序中的load_img函数加载该图像,并将目标大小设置为224x224。然后将该图像转换成一个数组,并将该数组除以255.0,这样就将图像的像素值转换为0和1,然后将图像数组重新调整为形状(224,224,3),最后返回转换形状后的图像。

编写预测函数

def predict_result(predict):
pred = my_model.predict(predict)
return np.argmax(pred[0], axis=-1)
登录后复制

这里,我们定义了一个函数predict_result,它接受predict参数,此参数基本上是一个预处理的图像。然后,我们调用模型的predict函数来预测结果。最后,从预测结果中返回最大值。

显示与预测图像

首先,我们将创建一个函数,它负责获取图像的路径,然后显示图像和预测结果。

#显示和预测图像的函数
def display_and_predict(img_path_input):
display_img = Image.open(img_path_input)
plt.imshow(display_img)
plt.show()
img = preprocess_img(img_path_input)
pred = predict_result(img)
print("Prediction: ", pred)
登录后复制

上面这个函数display_and_predict首先获取图像的路径并使用PIL库中的Image.open函数打开该图像,然后使用matplotlib库来显示图像,然后将图像传递给preprep_img函数以便输出预测结果,最后使用predict_result函数获得结果并最终打印。

img_input = input("Enter the path of an image: ")
display_and_predict(img_input)
登录后复制

如果您运行上面的程序片断并输入数据集中图像的路径,那么您将得到所期望的输出。

使用迁移学习技术训练定制深度学习模型

预测结果示意图

请注意,到目前为止该模型是使用迁移学习技术成功创建的,而无需编写任何一系列神经网络层相关代码。

现在,这个模型可以用于开发能够进行图像识别的Web应用程序了。文章的最后所附链接处提供了如何将该模型应用到Flask应用程序中的完整实现源码。

结论

本文中我们介绍了使用预先训练的模型或迁移学习技术来制作一个定制的深度学习模型的过程。

到目前为止,您已经了解了创建一个完整的深度学习模型所涉及的每一步。归纳起来看,所使用的总体步骤包括:

  • 准备数据集
  • 预处理数据
  • 创建模型
  • 保存自定义模型
  • 测试自定义模型

最后,您可以从​​GitHub​​上获取本文示例项目完整的源代码。

译者介绍

朱先忠,51CTO社区编辑,51CTO专家博客、讲师,潍坊一所高校计算机教师,自由编程界老兵一枚。

原文标题:Trained A Custom Deep Learning Model Using A Transfer Learning Technique​,作者:Sachin Pal​

以上是使用迁移学习技术进行深度学习模型的定制训练的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

一文带您了解SHAP:机器学习的模型解释 一文带您了解SHAP:机器学习的模型解释 Jun 01, 2024 am 10:58 AM

在机器学习和数据科学领域,模型的可解释性一直是研究者和实践者关注的焦点。随着深度学习和集成方法等复杂模型的广泛应用,理解模型的决策过程变得尤为重要。可解释人工智能(ExplainableAI|XAI)通过提高模型的透明度,帮助建立对机器学习模型的信任和信心。提高模型的透明度可以通过多种复杂模型的广泛应用等方法来实现,以及用于解释模型的决策过程。这些方法包括特征重要性分析、模型预测区间估计、局部可解释性算法等。特征重要性分析可以通过评估模型对输入特征的影响程度来解释模型的决策过程。模型预测区间估计

通过学习曲线识别过拟合和欠拟合 通过学习曲线识别过拟合和欠拟合 Apr 29, 2024 pm 06:50 PM

本文将介绍如何通过学习曲线来有效识别机器学习模型中的过拟合和欠拟合。欠拟合和过拟合1、过拟合如果一个模型对数据进行了过度训练,以至于它从中学习了噪声,那么这个模型就被称为过拟合。过拟合模型非常完美地学习了每一个例子,所以它会错误地分类一个看不见的/新的例子。对于一个过拟合的模型,我们会得到一个完美/接近完美的训练集分数和一个糟糕的验证集/测试分数。略有修改:"过拟合的原因:用一个复杂的模型来解决一个简单的问题,从数据中提取噪声。因为小数据集作为训练集可能无法代表所有数据的正确表示。"2、欠拟合如

人工智能在太空探索和人居工程中的演变 人工智能在太空探索和人居工程中的演变 Apr 29, 2024 pm 03:25 PM

20世纪50年代,人工智能(AI)诞生。当时研究人员发现机器可以执行类似人类的任务,例如思考。后来,在20世纪60年代,美国国防部资助了人工智能,并建立了实验室进行进一步开发。研究人员发现人工智能在许多领域都有用武之地,例如太空探索和极端环境中的生存。太空探索是对宇宙的研究,宇宙涵盖了地球以外的整个宇宙空间。太空被归类为极端环境,因为它的条件与地球不同。要在太空中生存,必须考虑许多因素,并采取预防措施。科学家和研究人员认为,探索太空并了解一切事物的现状有助于理解宇宙的运作方式,并为潜在的环境危机

通透!机器学习各大模型原理的深度剖析! 通透!机器学习各大模型原理的深度剖析! Apr 12, 2024 pm 05:55 PM

通俗来说,机器学习模型是一种数学函数,它能够将输入数据映射到预测输出。更具体地说,机器学习模型就是一种通过学习训练数据,来调整模型参数,以最小化预测输出与真实标签之间的误差的数学函数。在机器学习中存在多种模型,例如逻辑回归模型、决策树模型、支持向量机模型等,每一种模型都有其适用的数据类型和问题类型。同时,不同模型之间存在着许多共性,或者说有一条隐藏的模型演化的路径。将联结主义的感知机为例,通过增加感知机的隐藏层数量,我们可以将其转化为深度神经网络。而对感知机加入核函数的话就可以转化为SVM。这一

使用C++实现机器学习算法:常见挑战及解决方案 使用C++实现机器学习算法:常见挑战及解决方案 Jun 03, 2024 pm 01:25 PM

C++中机器学习算法面临的常见挑战包括内存管理、多线程、性能优化和可维护性。解决方案包括使用智能指针、现代线程库、SIMD指令和第三方库,并遵循代码风格指南和使用自动化工具。实践案例展示了如何利用Eigen库实现线性回归算法,有效地管理内存和使用高性能矩阵操作。

你所不知道的机器学习五大学派 你所不知道的机器学习五大学派 Jun 05, 2024 pm 08:51 PM

机器学习是人工智能的重要分支,它赋予计算机从数据中学习的能力,并能够在无需明确编程的情况下改进自身能力。机器学习在各个领域都有着广泛的应用,从图像识别和自然语言处理到推荐系统和欺诈检测,它正在改变我们的生活方式。机器学习领域存在着多种不同的方法和理论,其中最具影响力的五种方法被称为“机器学习五大派”。这五大派分别为符号派、联结派、进化派、贝叶斯派和类推学派。1.符号学派符号学(Symbolism),又称为符号主义,强调利用符号进行逻辑推理和表达知识。该学派认为学习是一种逆向演绎的过程,通过已有的

Flash Attention稳定吗?Meta、哈佛发现其模型权重偏差呈现数量级波动 Flash Attention稳定吗?Meta、哈佛发现其模型权重偏差呈现数量级波动 May 30, 2024 pm 01:24 PM

MetaFAIR联合哈佛优化大规模机器学习时产生的数据偏差,提供了新的研究框架。据所周知,大语言模型的训练常常需要数月的时间,使用数百乃至上千个GPU。以LLaMA270B模型为例,其训练总共需要1,720,320个GPU小时。由于这些工作负载的规模和复杂性,导致训练大模型存在着独特的系统性挑战。最近,许多机构在训练SOTA生成式AI模型时报告了训练过程中的不稳定情况,它们通常以损失尖峰的形式出现,比如谷歌的PaLM模型训练过程中出现了多达20次的损失尖峰。数值偏差是造成这种训练不准确性的根因,

可解释性人工智能:解释复杂的AI/ML模型 可解释性人工智能:解释复杂的AI/ML模型 Jun 03, 2024 pm 10:08 PM

译者|李睿审校|重楼人工智能(AI)和机器学习(ML)模型如今变得越来越复杂,这些模型产生的输出是黑盒——无法向利益相关方解释。可解释性人工智能(XAI)致力于通过让利益相关方理解这些模型的工作方式来解决这一问题,确保他们理解这些模型实际上是如何做出决策的,并确保人工智能系统中的透明度、信任度和问责制来解决这个问题。本文探讨了各种可解释性人工智能(XAI)技术,以阐明它们的基本原理。可解释性人工智能至关重要的几个原因信任度和透明度:为了让人工智能系统被广泛接受和信任,用户需要了解决策是如何做出的

See all articles