転移学習技術を使用した深層学習モデルのカスタマイズされたトレーニング
翻訳者|Zhu Xianzhong
査読者|Sun Shujuan
転移学習は機械学習の一種であり、トレーニングまたは事前に訓練されたアプリケーションです。これらの事前トレーニング済みニューラル ネットワークは、数百万のデータ ポイントを使用してトレーニングされます。
このテクノロジーの最も有名な用途は、ディープ ニューラル ネットワークのトレーニングです。この方法は、ディープ ニューラル ネットワークのトレーニングに使用するデータが少ない場合に優れたパフォーマンスを示すためです。実際、ほとんどの実世界のデータには通常、堅牢な深層学習モデルをトレーニングするための数百万のデータ ポイントがないため、この手法はデータ サイエンスの分野でも役立ちます。
現在、数百万のデータポイントを使用してトレーニングされた多くのモデルが存在しており、これらのモデルを使用して、複雑な深層学習ニューラル ネットワークを最高の精度でトレーニングできます。
このチュートリアルでは、転移学習テクノロジーを使用してディープ ニューラル ネットワークをトレーニングする方法の完全なプロセスを学習します。
Keras プログラムを使用した転移学習の実装
ディープ ニューラル ネットワークを構築またはトレーニングする前に、転移学習にどのようなオプションが利用可能で、どのオプションを使用する必要があるかを理解する必要があります。プロジェクト用に複雑なディープ ニューラル ネットワークをトレーニングします。
Keras アプリケーションは、予測、特徴抽出、微調整に使用できる事前トレーニングされた重みを提供する高度な深層学習モデルです。 Keras ライブラリには、すぐに使用できるモデルが多数組み込まれており、人気のあるモデルには、
- Xception
- VGG16 および VGG19
- ResNet シリーズ#などがあります。 ##MobileNet
この記事では、転移学習における MobileNet モデルの応用について学びます。
このセクションでは、コードを記述する代わりに、わずか数ステップで画像認識用のカスタム ディープ ラーニング モデルを構築する方法を学習します。どのシリーズの畳み込みニューラル ネットワーク (CNN) でも、事前トレーニングされたモデルを微調整するだけで、トレーニング データ セットでモデルをトレーニングできます。この記事では、ジェスチャー言語の数字の画像を認識できる深層学習モデルを構築します。次に、このカスタム深層学習モデルの構築を開始しましょう。
データ セットの取得
ディープ ラーニング モデルの構築プロセスを開始するには、まずデータを準備する必要があります。これを行うには、次の Web サイトにアクセスします。 Kaggle より、数百万のデータセットの中から適切なデータセットを簡単に選択できます。もちろん、深層学習または機械学習モデルを構築するために利用可能なデータセットを提供する Web サイトは他にもたくさんあります。ただし、この記事で使用するデータ セットは、Kaggle Web サイトが提供するアメリカ手話数字データ セットから取得したものです。
データ前処理データセットをダウンロードしてローカル ストレージに保存した後、データセットに対して次のような前処理を実行します。データの準備、データのトレーニング ディレクトリ、有効なディレクトリ、テスト ディレクトリへの分割、パスの定義、トレーニング目的のバッチ処理の作成など。
データの準備
データセットをダウンロードすると、0 から 9 までのデータのディレクトリと、入力画像、出力画像、および画像に対応する 3 つのサブフォルダーが含まれます。 name. CSV 用のフォルダー。 次に、出力画像と CSV フォルダーを各ディレクトリから削除し、入力画像フォルダーの内容をメイン ディレクトリに移動してから、入力画像フォルダーを削除します。データセットの各マスター ディレクトリには 500 個の画像が保持されるようになり、すべての画像を保持することを選択できます。ただし、デモの目的で、この記事では各ディレクトリの 200 枚の画像のみを使用します。
最終的に、データセットの構造は以下のようになります:データセットのフォルダー構造
データセットの分割
さあ、「開始」から始めましょうデータセットを 3 つのサブディレクトリ (train、valid、test) に分割します。
- train ディレクトリには、パターンと不規則性を学習するためのモデルへの入力データとして機能するトレーニング データが含まれます。
- valid ディレクトリには、モデルに供給される検証データが含まれます。これは、モデルが最初に認識する未確認のデータとなり、最大の精度を達成するのに役立ちます。
- テスト ディレクトリには、モデルのテストに使用されるテスト データが含まれます。
まず、コード内でさらに使用されるライブラリをインポートしましょう。
# 导入需要的库 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 を使用してデータ拡張を実行するためのガイドです。トレーニング データと検証データをモデルに適合させる前に、出力レイヤーを追加し、不要なレイヤーを削除して、深層学習モデル MobileNet を作成する必要があります。一部のレイヤーはトレーニングできないため、微調整の精度が向上します。
次のコードは、Keras から MobileNet モデルをダウンロードし、モバイル変数に保存します。次のコード スニペットを初めて実行するときは、インターネットに接続する必要があります。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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









機械学習とデータ サイエンスの分野では、モデルの解釈可能性が常に研究者や実務家に焦点を当ててきました。深層学習やアンサンブル手法などの複雑なモデルが広く適用されるようになったことで、モデルの意思決定プロセスを理解することが特に重要になってきました。 Explainable AI|XAI は、モデルの透明性を高めることで、機械学習モデルに対する信頼と自信を構築するのに役立ちます。モデルの透明性の向上は、複数の複雑なモデルの普及や、モデルを説明するための意思決定プロセスなどの方法によって実現できます。これらの方法には、特徴重要度分析、モデル予測間隔推定、ローカル解釈可能性アルゴリズムなどが含まれます。特徴重要度分析では、入力特徴に対するモデルの影響度を評価することで、モデルの意思決定プロセスを説明できます。モデルの予測間隔の推定

平たく言えば、機械学習モデルは、入力データを予測された出力にマッピングする数学関数です。より具体的には、機械学習モデルは、予測出力と真のラベルの間の誤差を最小限に抑えるために、トレーニング データから学習することによってモデル パラメーターを調整する数学関数です。機械学習には、ロジスティック回帰モデル、デシジョン ツリー モデル、サポート ベクター マシン モデルなど、多くのモデルがあります。各モデルには、適用可能なデータ タイプと問題タイプがあります。同時に、異なるモデル間には多くの共通点があったり、モデル進化の隠れた道が存在したりすることがあります。コネクショニストのパーセプトロンを例にとると、パーセプトロンの隠れ層の数を増やすことで、それをディープ ニューラル ネットワークに変換できます。パーセプトロンにカーネル関数を追加すると、SVM に変換できます。これです

この記事では、学習曲線を通じて機械学習モデルの過学習と過小学習を効果的に特定する方法を紹介します。過小適合と過適合 1. 過適合 モデルがデータからノイズを学習するためにデータ上で過学習されている場合、そのモデルは過適合していると言われます。過学習モデルはすべての例を完璧に学習するため、未確認の新しい例を誤って分類してしまいます。過適合モデルの場合、完璧/ほぼ完璧なトレーニング セット スコアとひどい検証セット/テスト スコアが得られます。若干修正: 「過学習の原因: 複雑なモデルを使用して単純な問題を解決し、データからノイズを抽出します。トレーニング セットとしての小さなデータ セットはすべてのデータを正しく表現できない可能性があるため、2. 過学習の Heru。」

1950 年代に人工知能 (AI) が誕生しました。そのとき、研究者たちは、機械が思考などの人間と同じようなタスクを実行できることを発見しました。その後、1960 年代に米国国防総省は人工知能に資金を提供し、さらなる開発のために研究所を設立しました。研究者たちは、宇宙探査や極限環境での生存など、多くの分野で人工知能の応用を見出しています。宇宙探査は、地球を超えた宇宙全体を対象とする宇宙の研究です。宇宙は地球とは条件が異なるため、極限環境に分類されます。宇宙で生き残るためには、多くの要素を考慮し、予防策を講じる必要があります。科学者や研究者は、宇宙を探索し、あらゆるものの現状を理解することが、宇宙の仕組みを理解し、潜在的な環境危機に備えるのに役立つと信じています。

C++ の機械学習アルゴリズムが直面する一般的な課題には、メモリ管理、マルチスレッド、パフォーマンスの最適化、保守性などがあります。解決策には、スマート ポインター、最新のスレッド ライブラリ、SIMD 命令、サードパーティ ライブラリの使用、コーディング スタイル ガイドラインの遵守、自動化ツールの使用が含まれます。実践的な事例では、Eigen ライブラリを使用して線形回帰アルゴリズムを実装し、メモリを効果的に管理し、高性能の行列演算を使用する方法を示します。

翻訳者 | Li Rui によるレビュー | 今日、人工知能 (AI) および機械学習 (ML) モデルはますます複雑になっており、これらのモデルによって生成される出力はブラックボックスになっており、関係者に説明することができません。 Explainable AI (XAI) は、利害関係者がこれらのモデルがどのように機能するかを理解できるようにし、これらのモデルが実際に意思決定を行う方法を確実に理解できるようにし、AI システムの透明性、信頼性、およびこの問題を解決するための説明責任を確保することで、この問題を解決することを目指しています。この記事では、さまざまな説明可能な人工知能 (XAI) 手法を検討して、その基礎となる原理を説明します。説明可能な AI が重要であるいくつかの理由 信頼と透明性: AI システムが広く受け入れられ、信頼されるためには、ユーザーは意思決定がどのように行われるかを理解する必要があります

編集者 |ScienceAI 質問応答 (QA) データセットは、自然言語処理 (NLP) 研究を促進する上で重要な役割を果たします。高品質の QA データ セットは、モデルの微調整に使用できるだけでなく、大規模言語モデル (LLM) の機能、特に科学的知識を理解し推論する能力を効果的に評価することもできます。現在、医学、化学、生物学、その他の分野をカバーする多くの科学 QA データ セットがありますが、これらのデータ セットにはまだいくつかの欠点があります。まず、データ形式は比較的単純で、そのほとんどが多肢選択式の質問であり、評価は簡単ですが、モデルの回答選択範囲が制限され、科学的な質問に回答するモデルの能力を完全にテストすることはできません。対照的に、自由回答型の Q&A

機械学習は人工知能の重要な分野であり、明示的にプログラムしなくてもコンピューターにデータから学習して能力を向上させる機能を提供します。機械学習は、画像認識や自然言語処理から、レコメンデーションシステムや不正行為検出に至るまで、さまざまな分野で幅広く応用されており、私たちの生活様式を変えつつあります。機械学習の分野にはさまざまな手法や理論があり、その中で最も影響力のある 5 つの手法は「機械学習の 5 つの流派」と呼ばれています。 5 つの主要な学派は、象徴学派、コネクショニスト学派、進化学派、ベイジアン学派、およびアナロジー学派です。 1. 象徴主義は、象徴主義とも呼ばれ、論理的推論と知識の表現のためのシンボルの使用を強調します。この学派は、学習は既存の既存の要素を介した逆演繹のプロセスであると信じています。
