翻訳者|Zhu Xianzhong
査読者|Sun Shujuan
転移学習は機械学習の一種であり、トレーニングまたは事前に訓練されたアプリケーションです。これらの事前トレーニング済みニューラル ネットワークは、数百万のデータ ポイントを使用してトレーニングされます。
このテクノロジーの最も有名な用途は、ディープ ニューラル ネットワークのトレーニングです。この方法は、ディープ ニューラル ネットワークのトレーニングに使用するデータが少ない場合に優れたパフォーマンスを示すためです。実際、ほとんどの実世界のデータには通常、堅牢な深層学習モデルをトレーニングするための数百万のデータ ポイントがないため、この手法はデータ サイエンスの分野でも役立ちます。
現在、数百万のデータポイントを使用してトレーニングされた多くのモデルが存在しており、これらのモデルを使用して、複雑な深層学習ニューラル ネットワークを最高の精度でトレーニングできます。
このチュートリアルでは、転移学習テクノロジーを使用してディープ ニューラル ネットワークをトレーニングする方法の完全なプロセスを学習します。
ディープ ニューラル ネットワークを構築またはトレーニングする前に、転移学習にどのようなオプションが利用可能で、どのオプションを使用する必要があるかを理解する必要があります。プロジェクト用に複雑なディープ ニューラル ネットワークをトレーニングします。
Keras アプリケーションは、予測、特徴抽出、微調整に使用できる事前トレーニングされた重みを提供する高度な深層学習モデルです。 Keras ライブラリには、すぐに使用できるモデルが多数組み込まれており、人気のあるモデルには、
この記事では、転移学習における MobileNet モデルの応用について学びます。
このセクションでは、コードを記述する代わりに、わずか数ステップで画像認識用のカスタム ディープ ラーニング モデルを構築する方法を学習します。どのシリーズの畳み込みニューラル ネットワーク (CNN) でも、事前トレーニングされたモデルを微調整するだけで、トレーニング データ セットでモデルをトレーニングできます。データ セットの取得
ディープ ラーニング モデルの構築プロセスを開始するには、まずデータを準備する必要があります。これを行うには、次の Web サイトにアクセスします。 Kaggle より、数百万のデータセットの中から適切なデータセットを簡単に選択できます。もちろん、深層学習または機械学習モデルを構築するために利用可能なデータセットを提供する Web サイトは他にもたくさんあります。データ前処理データセットをダウンロードしてローカル ストレージに保存した後、データセットに対して次のような前処理を実行します。データの準備、データのトレーニング ディレクトリ、有効なディレクトリ、テスト ディレクトリへの分割、パスの定義、トレーニング目的のバッチ処理の作成など。
データセットのフォルダー構造
さあ、「開始」から始めましょうデータセットを 3 つのサブディレクトリ (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 を作成し、有効にしてテストします。それぞれのサブディレクトリに移動します。
次に、サブディレクトリ 0 ~ 9 を作成し、すべてのデータを train ディレクトリに移動し、valid サブディレクトリと test サブディレクトリの下にサブディレクトリ 0 ~ 9 を作成します。
次に、train ディレクトリ内のサブディレクトリ 0 ~ 9 を反復処理し、各サブディレクトリから 90 個の画像データをランダムに取得し、有効なディレクトリ内の対応するサブディレクトリに移動します。
テスト ディレクトリ test にも同じことが当てはまります。
【補足】 Python で高度なファイル操作を実行する shutil モジュール (ファイルやフォルダーをあるディレクトリから別のディレクトリに手動でコピーまたは移動するのは非常に面倒な作業です。詳しいヒントについては、参考記事 https://medium .com/@geekpython/perform-high-level-file-operations-in-python-shutil-module-dfd71b149d32)。
必要なディレクトリを作成した後、train、valid、test の 3 つのサブディレクトリを定義する必要があります。パス。
#为三个子目录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 のサイズの画像に対してトレーニングされるため、ディレクトリへのパスとトレーニングする画像のサイズを指定します。
次に、バッチ サイズを定義します。つまり、1 回の繰り返しで処理できる画像の数を定義し、画像処理の順序をランダムにシャッフルします。ここでは、テスト データはトレーニングに使用されないため、テスト データの画像をランダムにシャッフルしません。
Jupyter ノートブックまたは Google Colab で上記のコード スニペットを実行すると、次の結果が表示されます。
#上記のコードの出力
ImageDataGenerator の一般的なアプリケーション シナリオは、データを拡張することです。以下は、Keras フレームワークの ImageDataGenerator を使用してデータ拡張を実行するためのガイドです。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 中国語 Web サイトの他の関連記事を参照してください。