PyTorchを䜿甚したプログラミングディヌプラヌニングアプリケヌションの構築

画像こんにちは䜏民 Ian Poynterは、クラりドでPyTorchをセットアップする方法、画像、音声、テキストを簡単に操䜜できるようにするニュヌラルアヌキテクチャを䜜成する方法を理解するのに圹立ちたす。この本は、移怍の孊習、モデルのデバッグ、およびPyTorchラむブラリの䜿甚に䞍可欠な抂念をカバヌしおいたす。次のこずを孊習したす。-深局孊習モデルの実装-倧芏暡プロゞェクトでのPyTorchの䜿甚-孊習転送の適甚-PyTorchtorchaudioず畳み蟌みモデルを䜿甚したオヌディオデヌタの分類-Wikipediaでトレヌニングされたモデルを䜿甚した最新のNLP技術の適甚-PyTorchモデルのデバッグTensorBoardずFlamegraphを䜿甚-コンテナにPyTorchアプリケヌションを展開する「PyTorchは、Googleの巚倧なTensorFlowに匹敵する、最も急速に成長しおいる深局孊習ラむブラリの1぀です。





PyTorchによる画像分類



深局孊習の教科曞には、専門的で理解できない甚語がたくさんありたす。私はそれを最小限に抑え、PyTorchの操䜜に慣れおきたら簡単に拡匵できる䟋を垞に1぀挙げたす。この䟋を本党䜓で䜿甚しお、モデルをデバッグする方法第7章たたはモデルを本番環境にデプロむする方法第8章を瀺したす。



これから第4章の終わりたで、画像分類子をコンパむルしたす。ニュヌラルネットワヌクは、䞀般的に画像分類子ずしお䜿甚されたす。ネットワヌクは画像を提䟛し、簡単な質問をしたす「これは䜕ですか」



PyTorchでアプリケヌションを䜜成するこずから始めたしょう。



分類問題



ここでは、魚ず猫を区別できる簡単な分類子を䜜成したす。モデルの蚭蚈ず開発プロセスを繰り返しお、モデルをより正確にしたす。

図では 2.1ず2.2は、魚ず猫の栄光を衚しおいたす。魚に名前があるかどうかはわかりたせんが、猫の名前はヘルベティカです。



暙準的な分類の問題のいく぀かに぀いお説明するこずから始めたしょう。



画像 画像



暙準的な難しさ



魚ず猫を区別できるプログラムの曞き方はおそらく、猫に尻尟があるのか​​、魚に鱗があるのか​​を説明する䞀連のルヌルを䜜成し、それらのルヌルを画像に適甚しお、プログラムが画像を分類できるようにしたす。しかし、これには時間、劎力、スキルが必芁です。 Manx猫に出くわしたらどうしたすか明らかに猫ですが、尻尟はありたせん。



これらのルヌルを䜿甚しお考えられるすべおのシナリオを説明しようずするず、これらのルヌルはたすたす耇雑になりたす。たた、ビゞュアルプログラミングは私にずっおひどいこずを認めなければならないので、これらすべおのルヌルのコヌドを手動で䜜成しなければならないずいう考えは恐ろしいものです。



画像を入力するず猫や魚を返す機胜が必芁です。すべおの基準を完党にリストするだけでは、このような関数を構築するこずは困難です。しかし、深い孊習は本質的に、構造を䜜成し、ネットワヌクに倧量のデヌタを提䟛し、それが正しい答えを䞎えたかどうかを知らせるずいう条件で、先ほど話したこれらすべおのルヌルを䜜成するずいう倧倉な䜜業をコンピュヌタヌに匷制したす。これが私たちがやろうずしおいるこずです。さらに、PyTorchを䜿甚するためのいく぀かの基本的なテクニックを孊びたす。



しかし、最初にデヌタ



たず、デヌタが必芁です。どのくらいのデヌタさたざたな芁因に䟝存したす。第4章でわかるように、ディヌプラヌニング手法ではニュヌラルネットワヌクをトレヌニングするために倧量のデヌタが必芁であるずいう考えは必ずしも真実ではありたせん。ただし、ここでは最初から始めたす。これには通垞、倧量のデヌタぞのアクセスが必芁です。魚や猫の画像がたくさん必芁です。



Googleの画像怜玢から倧量の画像をダりンロヌドするのに時間を費やすこずができたすが、もっず簡単な方法がありたす。ニュヌラルネットワヌクのトレヌニングに䜿甚される画像の暙準コレクションはImageNetです。1,400䞇を超える画像ず2䞇の画像カテゎリが含たれおいたす。これは、すべおの画像分類子が比范する基準です。したがっお、必芁に応じお他のオプションを遞択するこずもできたすが、そこから画像を取埗したす。



デヌタに加えお、PyTorchには、猫ずは䜕か、魚ずは䜕かを定矩する方法が必芁です。それは私たちにずっおは十分に簡単ですが、コンピュヌタヌにずっおは難しいですそれが私たちがプログラムを䜜成する理由です。デヌタに添付されたラベリングを䜿甚したす。これは監芖付き孊習ず呌ばれたす。 どのラベルにもアクセスできない



堎合は、ご想像のずおり、監芖されおいない機械孊習が䜿甚されたす。ImageNetデヌタを䜿甚する堎合、ラベルには情報が倚すぎるため、圹に立ちたせん。タビヌキャットやトラりトをコンピュヌタヌにマヌクするこずは、猫や魚ず同じではありたせん。



それらのラベルを倉曎する必芁がありたす。ImageNetは膚倧な数の画像のコレクションであるため、魚ず猫の画像ずタグ付けURLをたずめたしたhttps://oreil.ly/NbtEU。



そのディレクトリでdownload.pyスクリプトを実行するず、URLから画像がダりンロヌドされ、適切なトレヌニング堎所に配眮されたす。再ラベル付けは簡単です。スクリプトは、猫の画像を列車/猫のディレクトリに保存し、魚の画像を列車/魚のディレクトリに保存したす。スクリプトを䜿甚しおダりンロヌドしたくない堎合は、これらのディレクトリを䜜成し、察応する画像を適切な堎所に配眮するだけです。これでデヌタができたしたが、PyTorchが理解できる圢匏に倉換する必芁がありたす。



PyTorchずデヌタロヌダヌ



デヌタの読み蟌みずトレヌニング察応圢匏ぞの倉換は、倚くの堎合、時間がかかりすぎるデヌタサむ゚ンスの1぀の領域です。 PyTorchは、画像、テキスト、たたはオヌディオのいずれで䜜業しおいる堎合でも、非垞に簡単にする確立されたデヌタ盞互䜜甚芁件を開発したした。



デヌタを操䜜するための2぀の䞻な条件は、デヌタセットずデヌタロヌダヌです。デヌタセットは、ニュヌラルネットワヌクに送信するデヌタを受信できるようにするPythonクラスです。



デヌタロヌダヌは、デヌタセットからネットワヌクにデヌタを転送するものです。 これには、次のような情報が含たれる堎合がありたすネットワヌクにデヌタをアップロヌドしおいるワヌカヌプロセスの数同時にアップロヌドしおいる画像の数



最初にデヌタセットを芋おみたしょう。各デヌタセットは、画像、音声、テキスト、3Dランドスケヌプ、株匏垂堎情報などが含たれおいるかどうかにかかわらず、この抜象的なPythonクラスの芁件を満たしおいる限り、PyTorchず察話できたす。



class Dataset(object):
     def __getitem__(self, index):
          raise NotImplementedError

     def __len__(self):
          raise NotImplementedError


非垞に簡単です。デヌタセットのサむズlenを返すメ゜ッドず、デヌタセットから芁玠をペアで取埗できるメ゜ッドlabel、tensorを䜿甚する必芁がありたす。これは、トレヌニングのためにデヌタをニュヌラルネットワヌクに䟛絊するずきに、デヌタロヌダヌによっお呌び出されたす。したがっお、PyTorchが凊理できるように、画像を取埗しおテン゜ルに倉換し、元に戻しおマヌクを付けるこずができるgetitemメ゜ッドの本䜓を䜜成する必芁がありたす。それはすべお明らかですが、明らかにこのシナリオは十分に䞀般的であるため、PyTorchを䜿甚するずタスクが簡単になるのではないでしょうか。



トレヌニングデヌタセットの䜜成



torchvisionパッケヌゞには、各ディレクトリがラベルである構造に画像があるず仮定しお、ほずんどすべおを実行するImageFolderクラスが含たれおいたすたずえば、すべおの猫はcatずいう名前のディレクトリにありたす。猫ず魚の䟋に必芁なものは次のずおりです。



import torchvision
from torchvision import transforms

train_data_path = "./train/"
transforms = transforms.Compose([
      transforms.Resize(64),
      transforms.ToTensor(),
      transforms.Normalize(mean=[0.485, 0.456, 0.406],
                                std=[0.229, 0.224, 0.225] )
      ])

train_data = torchvision.datasets.ImageFolder
(root=train_data_path,transform=transforms)


torchvisionでは、画像がニュヌラルネットワヌクに入る前に画像に適甚する倉換のリストを指定できるため、ここに他の䜕かが远加されたす。デフォルトの倉換では、画像デヌタを取埗しおテン゜ルに倉換したす前のコヌドで瀺したtrans forms.ToTensorメ゜ッドが、それほど明癜ではない可胜性のある他のいく぀かの凊理も実行したす。



たず、GPUは、高速で暙準サむズの蚈算を実行するように構築されおいたす。しかし、おそらく倚くの解像床の画像の品揃えがありたす。凊理パフォヌマンスを向䞊させるために、サむズ倉曎倉換64を䜿甚しお、各入力画像を同じ64x64解像床にスケヌリングしたす。次に、画像をテン゜ルに倉換し、最埌に特定の平均点ず暙準偏差点のセットを䞭心にテン゜ルを正芏化したす。



入力がニュヌラルネットワヌクのレむダヌを通過するずきに倚数の乗算が実行されるこずが予想されるため、正芏化は重芁です。入力倀を0から1の間に保぀こずで、孊習フェヌズ䞭の倀の倧幅な増加を防ぎたす爆発募配問題ずしお知られおいたす。この魔法の化身は、ImageNetデヌタセット党䜓の平均ず暙準偏差にすぎたせん。あなたは魚ず猫のサブセットのためにそれを特別に蚈算するこずができたすが、これらの倀はかなり信頌できたす。 たったく異なるデヌタセットで䜜業しおいる堎合、この平均ず分散を蚈算する必芁がありたすが、倚くは単にImageNet定数を䜿甚し、蚱容可胜な結果を​​報告したす。



構成可胜な倉換により、デヌタ拡匵のための画像回転や画像シフトなどのアクションを簡単に実行するこずもできたす。これに぀いおは、第4章で説明したす。



この䟋では、画像のサむズを64x64に倉曎しおいたす。最初のネットワヌクでの蚈算を高速化するために、このランダムな遞択を行いたした。第3章で説明する既存のアヌキテクチャのほずんどは、入力むメヌゞに224x224たたは299x299を䜿甚したす。䞀般に、入力ファむルサむズが倧きいほど、ネットワヌクはより倚くのデヌタを孊習できたす。コむンの裏偎は通垞、より小さなバッチの画像をGPUメモリに収めるこずができたす。


デヌタセットに関する情報は他にもたくさんありたすが、それだけではありたせん。しかし、トレヌニングデヌタセットに぀いおすでに知っおいるのに、なぜ必芁以䞊に知っおいる必芁があるのでしょうか。



怜蚌および参照デヌタセット



トレヌニングデヌタセットが蚭定されたしたが、怜蚌デヌタセットで同じ手順を繰り返す必芁がありたす。ここでの違いは䜕ですか深局孊習そしお実際にはすべおの機械孊習の萜ずし穎の1぀は、過剰適合です。モデルは、トレヌニングされた内容を認識するのに非垞に優れおいたすが、芋たこずのない䟋では機胜したせん。モデルは猫の写真を芋お、他のすべおの猫の写真がこれずあたり䌌おいない堎合、モデルはそれが猫ではないず刀断したすが、反察は明らかです。ニュヌラルネットワヌクがこのように動䜜するのを防ぐために、コントロヌルサンプルをdownload.pyにロヌドしたす。぀たり、トレヌニングデヌタセットにない猫ず魚の䞀連の画像にロヌドしたす。各トレヌニングサむクル゚ポックずも呌ばれたすの最埌に、このセットを比范しお、ネットワヌクに問題がないこずを確認したす。心配しないでください。このチェックのコヌドは非垞に単玔です。これは、いく぀かの倉数名が倉曎された同じコヌドです。



val_data_path = "./val/"
val_data = torchvision.datasets.ImageFolder(root=val_data_path,
                                                                  transform=transforms)


再定矩する代わりに、倉換チェヌンを䜿甚したした。



怜蚌デヌタセットに加えお、怜蚌デヌタセットも䜜成する必芁がありたす。これは、すべおのトレヌニングを完了した埌にモデルをテストするために䜿甚されたす。



test_data_path = "./test/"
test_data = torchvision.datasets.ImageFolder(root=test_data_path,
                                                                   transform=transforms)


䞀芋するず、さたざたな皮類のセットが耇雑で混乱する可胜性があるため、トレヌニングのどの郚分で各セットを䜿甚するかを瀺す衚をたずめたした衚2.1。



画像


これで、Pythonコヌドをさらに数行䜿甚しおデヌタロヌダヌを䜜成できたす。



batch_size=64
train_data_loader = data.DataLoader(train_data, batch_size=batch_size)
val_data_loader = data.DataLoader(val_data, batch_size=batch_size)
test_data_loader = data.DataLoader(test_data, batch_size=batch_size)


このコヌドで新しく泚目に倀するのは、batch_sizeコマンドです。圌女は、トレヌニングず曎新を行う前に、ネットワヌクを通過する画像の数を瀺しおいたす。理論的には、テストデヌタセットずトレヌニングデヌタセットの䞀連の画像にbatch_sizeを割り圓おお、ネットワヌクが曎新する前に各画像を確認できるようにするこずができたす。実際には、これは通垞行われたせん。これは、小さいパケット文献ではミニパケットずしおより䞀般的に知られおいるが必芁ずするメモリが少なく、各画像に関するすべおの情報をデヌタセットに栌玍する必芁がないためです。パケットサむズが小さいほど、ネットワヌクからの孊習が速くなりたす。はるかに高速に曎新したす。 PyTorchデヌタロヌダヌの堎合、batch_sizeはデフォルトで1に蚭定されおいたす。おそらく、これを倉曎するこずをお勧めしたす。私は64を遞びたしたが、あなたは理解するために実隓するこずができたすGPUメモリを䜿い果たすこずなく䜿甚できるミニパッケヌゞの数。いく぀かの远加パラメヌタを詊しおください。たずえば、デヌタセットのフェッチ方法、実​​行するたびにデヌタセット党䜓をシャッフルするかどうか、デヌタセットからデヌタを取埗するために必芁なワヌクフロヌの数を指定できたす。このすべおはで芋぀けるこずができたすPyTorchドキュメント。



これはPyTorchにデヌタを枡すこずに関するものなので、画像の分類を開始する単玔なニュヌラルネットワヌクを想像しおみたしょう。



最埌に、ニュヌラルネットワヌク



たず、最も単玔な深局孊習ネットワヌク、぀たり入力テンサヌ画像ず連携する入力レむダヌから始めたす。出力局2の出力クラスの数のサむズ。そしおその間に隠された局。最初の䟋では、完党にリンクされたレむダヌを䜿甚したす。図では 2.3は、3぀のノヌドの入力レむダヌ、3぀のノヌドの非衚瀺

レむダヌ、および2぀のノヌドの出力を瀺しおいたす。



この䟋では、1぀のレむダヌの各ノヌドが次のレむダヌのノヌドに圱響を䞎え、各接続には、そのノヌドから次のレむダヌぞの信号の匷床を決定する重みがありたす。これらは、通垞はランダムな初期化から、ネットワヌクをトレヌニングするずきに曎新される重みです。入力がネットワヌクを通過するずき、私たちたたはPyTorchは、そのレむダヌの重みずバむアスに入力を単玔にマトリックス乗算できたす。それらを次の関数に枡す前に、この結果はアクティベヌション関数に入りたす。これは、システムに非線圢性を導入する方法にすぎたせん。



画像


アクティベヌション機胜



アクティベヌション機胜はトリッキヌに聞こえたすが、珟圚芋぀けるこずができる最も䞀般的なアクティベヌション機胜は、ReLU、぀たり修正された線圢ナニットです。再び賢いただし、これはmax0、xを実装する関数であるため、入力が負の堎合は結果が0になり、xが正の堎合は入力xのみになりたす。ずおも簡単です



遭遇する可胜性が最も高いもう1぀のアクティベヌション関数は、倚倉量ロゞスティック関数softmaxです。これは、数孊的な意味でもう少し耇雑です。基本的に、0から1たでの倀のセットを生成し、合蚈で1確率になり、差が倧きくなるように倀に重みを付けたす。぀たり、他のすべおよりも倧きいベクトルで1぀の結果を生成したす。分類ネットワヌクの最埌で、入力デヌタがどのクラスであるずネットワヌクが刀断するかを確実に予枬するために䜿甚されるこずがよくありたす。



これらすべおのビルディングブロックができたので、最初のニュヌラルネットワヌクの構築を開始できたす。



ニュヌラルネットワヌクの䜜成



PyTorchでニュヌラルネットワヌクを構築するこずは、Pythonでプログラミングするこずに䌌おいたす。 torch.nn.Networkずいうクラスから継承し、__ init__メ゜ッドずforwardメ゜ッドにデヌタを入力したす。



class SimpleNet(nn.Module):

def __init__(self):
     super(Net, self).__init__()
     self.fc1 = nn.Linear(12288, 84)
     self.fc2 = nn.Linear(84, 50)
     self.fc3 = nn.Linear(50,2)

def forward(self):
     x = x.view(-1, 12288)
     x = F.relu(self.fc1(x))
     x = F.relu(self.fc2(x))
     x = F.softmax(self.fc3(x))
     return x
simplenet = SimpleNet()


繰り返したすが、これは難しいこずではありたせん。 initで必芁な蚭定を行いたす。この堎合、スヌパヌクラスコンストラクタヌず3぀の完党に接続されたレむダヌPyTorchではLinearず呌ばれ、KerasではDenseず呌ばれたすを呌び出したす。 forwardメ゜ッドは、トレヌニングず予枬掚論の䞡方で、デヌタがネットワヌクを介しおどのように送信されるかを瀺したす。たず、画像内の3Dテン゜ルxずyに加えお3チャンネルの色情報赀、緑、青を倉換する必芁がありたす-泚意 -最初の線圢レむダヌに枡すこずができるように1次元テン゜ルに倉換したす。これは、viewを䜿甚しお行いたす。したがっお、レむダヌずアクティベヌション関数を順番に適甚し、softmax出力を返し、この画像の予枬を取埗したす。



隠しレむダヌの番号は任意ですが、最埌のレむダヌの出力である2は、猫たたは魚の2぀のクラスに䞀臎したす。スタック内で瞮小するに぀れお、レむダヌ内のデヌタを瞮小する必芁がありたす。たずえば、レむダヌが50入力から100出力に移行する堎合、ネットワヌクは50接続を100出力のうち50に枡すだけで孊習し、䜜業が完了したず芋なすこずができたす。入力に関連しお出力のサむズを瞮小するこずにより、ネットワヌクのこの郚分に、より少ないリ゜ヌスで元の入力の代衚性を孊習させるようにしおいたす。これは、おそらく、ネットワヌクが画像のいく぀かの際立った特城を定矩するこずを意味したす。たずえば、フィンやテヌルを認識するこずを孊習したした。



予枬があり、元の画像の実際のラベルず比范しお、それが正しいかどうかを確認できたす。ただし、PyTorchが予枬の正しさや䞍正確さだけでなく、予枬の正しさや䞍正確さも定量化できるようにするための䜕らかの方法が必芁です。損倱関数はこれを行いたす。



著者に぀いお



Ian PoynterIan Pointer-Fortune 100の倚数のクラむアント向けの機械孊習詳现な教育方法を含むの゜リュヌションを専門ずする゚ンゞニアデヌタサむ゚ンス。珟圚、YangはLucidworksで働いおおり、高床なアプリケヌションずNLPの開発に埓事しおいたす。



»本の詳现に぀いおは、出版瀟のりェブサむトをご芧ください

»目次

» 䜏民向けの抜粋



クヌポンの25割匕-PyTorch



玙版の本の支払い時に、電子曞籍が電子メヌルで送信されたす。



All Articles