深層学習ネットワーク モデルの全体的なアーキテクチャは、主にデータ セット、モデル ネットワーキング、学習最適化プロセスの 3 つの部分で構成されます。この章では主に、古典的な深層学習から始めて、深層学習ネットワーク モデルのアルゴリズム アーキテクチャと共通モデルを詳細に紹介します。学習ネットワークモデルをCNNに、RNNはメモリ不足やリアルタイム性能などの問題を解決する軽量ネットワーク設計に代表されるほか、近年の主要なコンピュータビジョンタスクに関与している最先端のネットワークモデルTransformerやMLPにも対応しています。 。深層学習ネットワーク モデルの構築プロセスをさらに分析するために、最後に、LeNet モデル アルゴリズムを例として、フライング パドル深層学習フレームワークの下でネットワーク構築ケースを実証しました。この章を学習した後、読者が次の知識ポイントを習得できることを願っています。
- 古典的なネットワーク モデル (CNN および RNN) を理解する。
- 最先端のネットワーク モデル (Transformer および MLP) に精通している。
- フライング パドルの使用をマスターして、深層学習ネットワーク モデル LeNet を構築します。
前回の学習で、国内外のコンピュータビジョンの現状と歴史、深層学習のアルゴリズムの基礎を大まかに理解し、深層学習の枠組みについても一通り理解できたはずです。上記のことについては、ご自身でお答えください。それほど難しいことではありません。この記事ではディープラーニングのネットワークモデルを中心に説明します。古典的なネットワーク モデルを理解しながら、最先端のネットワーク モデルも理解できます。簡単な例を使用して、ディープ ラーニング ネットワークの概要を皆さんに説明します。
深層学習開発フレームワークのサポートにより、深層学習ネットワーク モデルは常に更新および反復され、そのモデル アーキテクチャは、古典的な畳み込みニューラル ネットワーク CNN からリカレント ニューラル ネットワーク RNN まで多岐にわたります。現在の Transformer、多層パーセプトロン MLP は、ネットワーク コンポーネントの活性化関数の設定や最適化戦略などの一連の操作を通じて深層学習ネットワーク モデルを構築し、非線形複素マッピングを使用して元のデータをより高次のデータに変換するものと総称されます。抽象的な表現のレベル。
深層学習ネットワーク モデルの全体的なアーキテクチャは主に 3 つの部分、つまりデータ セット、モデル ネットワーキング、学習最適化プロセスで構成されます。深層学習ネットワーク モデルのトレーニング プロセスは最適化プロセスであり、モデル最適化の最も直接的な目的は、複数の反復更新を通じて損失関数を可能な限り小さくする最適なモデル パラメーターを見つけることです。一般に、ニューラル ネットワークの最適化プロセスは 2 つの段階に分けることができ、第 1 段階では、順伝播によってモデルの予測値を取得し、その予測値と陽性ラベルを比較し、その差を損失として計算します。値; 第 2 段階では、バックプロパゲーションを通じて各パラメーターの損失関数の勾配を計算し、事前に設定された学習率と運動量に従って各パラメーターの値を更新します。
つまり、優れたネットワーク モデルは、通常、次のような特徴を備えています: 1. モデルはトレーニングが簡単で、トレーニング手順がシンプルで収束しやすい; 2. モデルの精度が高く、データの本質的な性質をよく把握でき、 3. 、このモデルは強力な汎化能力を備えており、既知のデータに対して優れたパフォーマンスを発揮するだけでなく、既知のデータが一貫して分布している未知のデータセットに対しても堅牢性を示すことができます。
場合:
1. タスクの紹介
手書き数字認識は、光学式文字認識技術 (光学式文字認識、OCR) の一分野です。若手研究者にとっての入門レベルの基礎であり、実際の業界でも非常に重要な位置を占めています。主な研究内容は次のとおりです。コンピューターと画像分類技術を使用して、人が紙に書いたアラビア数字(0〜9)を自動的に識別します。したがって、この実験タスクを簡単に説明すると、次の図のようになります。
2. モデル原理
近年来,神经网络模型一直层出不穷,在各个计算机视觉任务中都呈现百花齐放的态势。为了让开发者更清楚地了解网络模型的搭建过程,以及为了在后续的各项视觉子任务实战中奠定基础。下面本节将以MNIST手写数字识别为例,在PaddlePaddle深度学习开发平台下构建一个LeNet网络模型并进行详细说明。
LeNet是第一个将卷积神经网络推上计算机视觉舞台的算法模型,它由LeCun在1998年提出。在早期应用于手写数字图像识别任务。该模型采用顺序结构,主要包括7层(2个卷积层、2个池化层和3个全连接层),卷积层和池化层交替排列。以mnist手写数字分类为例构建一个LeNet-5模型。每个手写数字图片样本的宽与高均为28像素,样本标签值是0~9,代表0至9十个数字。
以下は、LeNet-5 モデルのネットワーク構造と原理の詳細な分析です。
図 1 LeNet-5 全体のネットワーク モデル
(1) 畳み込み層 L1
L1 層の入力データの形状とサイズは��×1×28×28Rm×1×28×28 です。これは、サンプルバッチサイズが m、チャネル数が 1、行と列のサイズがどちらも28。L1 層の出力データ形状サイズは��×6×24×24Rm×6×24×24 です。これは、サンプル バッチが m、チャネル数が 6、行と列の次元が 24 であることを意味します。
ここには 2 つの重要な疑問があります。まず、なぜチャネル数が 1 から 6 に変更されたのでしょうか? これは、モデルの畳み込み層 L1 に 6 つの畳み込みカーネルが設定されており、各畳み込みカーネルが入力データに対して演算を行い、最終的に 6 セットのデータが得られるためです。次に、なぜ行と列のサイズが 28 から 24 に変更されたのでしょうか? その理由は、各コンボリューション カーネルの行と列の次元が 5 であるためです。コンボリューション カーネル (5×5) は入力データ (28×28) 上で移動し、各移動のステップ サイズは 1 であり、行と列は出力データのサイズはそれぞれ 28-5+1=24 となります。
(2) プーリング層 L2
L2 層の入力データ形状サイズは��×6×24×24Rm×6×24×24 です。これは、サンプルバッチサイズが m、チャネル数が 6、行サイズと列サイズが両方ともであることを意味します。 24. L2 層の出力データ形状サイズは��×6×12×12Rm×6×12×12 です。これは、サンプルバッチサイズが m、チャネル数が 6、行と列の次元が 12 であることを意味します。 。
ここで、なぜ行と列のサイズが 24 から 12 に変わるのでしょうか? その理由は、プーリング層のフィルター形状サイズが 2×2 で、入力データ (24×24) 上を移動し、各移動のステップ サイズ (スパン) が 2、4 つの数値 (2×24) であるためです。 2) の最大値が出力として使用され、出力データの行と列のサイズはそれぞれ 24÷2=12 になります。
(3) 畳み込み層 L3
L3 層の入力データの形状サイズは��×6×12×12Rm×6×12×12 です。これは、サンプルバッチサイズが m、チャネル数が 6、行サイズと列サイズが両方ともであることを意味します。 12. L3 層の出力データ形状サイズは��×16×8×8Rm×16×8×8 です。これは、サンプルバッチサイズが m、チャネル数が 16、行と列の次元が両方ともであることを意味します。 8.
(4) プーリング層 L4
L4 層の入力データ形状サイズは��×16×8×8Rm×16×8×8 です。これは、サンプルバッチサイズが m、チャネル数が 16、行サイズと列サイズが両方ともであることを意味します。 8. L4 層の出力データ形状サイズは��×16×4×4Rm×16×4×4 です。これは、サンプルバッチサイズが m、チャネル数が 16、行と列の次元が両方ともであることを意味します。 4. プーリング層L4のフィルタ形状サイズは2×2で、入力データ(形状サイズ24×24)上を移動し、各移動のステップサイズ(スパン)は2で、毎回4つの番号(形状)が選択されます。 . サイズ 2 × 2) の最大値が出力として使用されます。
(5) リニア層 L5
L5 層の入力データの形状サイズは��×256Rm×256 です。これは、サンプルバッチサイズが m で、入力特徴の数が 256 であることを意味します。出力データの形状サイズは��×120Rm×120です。これは、サンプルバッチサイズがmで、出力特徴の数が120であることを意味します。
(6) リニア層 L6
L6 層の入力データの形状サイズは��×120Rm×120 です。これは、サンプル バッチが m で、入力特徴の数が 120 であることを意味します。L6 層の出力データ形状サイズは��×84Rm×84 です。これは、サンプルバッチサイズが m で、出力特徴量の数が 84 であることを意味します。
(7) リニア層 L7
L7 層の入力データの形状サイズは��×84Rm×84 です。これは、サンプルバッチサイズが m で、入力特徴の数が 84 であることを意味します。L7 層の出力データ形状サイズは��×10Rm×10 です。これは、サンプルバッチサイズが m で、出力特徴の数が 10 であることを意味します。
3. MNIST データセット
3.1 データセットの概要
手書き数字分類データ セットは、無料で公開されている MNIST データ セットから取得されます。このデータ セット内のトレーニング セット サンプルの数は 60,000、テスト セット サンプルの数は 10,000 です。各サンプルは 28×28 ピクセルで構成される行列であり、各ピクセルの値は 0 から 255 の範囲の値を持つスカラーです。このデータ セットのカラー チャネルの数は 1 であると考えることができます。データはピクチャとラベルに分かれており、ピクチャは28*28ピクセルのマトリクス、ラベルは0から9までの10個の数字です。
3.2 データの読み込み
(1) 変換関数はデータを正規化および標準化します。
(2)train_datasetとtest_dataset
paddle.vision.datasets.MNIST() の mode='train' と mode='test' は、それぞれ mnist トレーニング セットとテスト セットを取得するために使用されます。
#导入数据集Compose的作用是将用于数据集预处理的接口以列表的方式进行组合。
#导入数据集Normalize的作用是图像归一化处理,支持两种方式: 1. 用统一的均值和标准差值对图像的每个通道进行归一化处理; 2. 对每个通道指定不同的均值和标准差值进行归一化处理。
import paddle
from paddle.vision.transforms import Compose, Normalize
import os
import matplotlib.pyplot as plt
transform = Compose([Normalize(mean=[127.5],std=[127.5],data_format='CHW')])
# 使用transform对数据集做归一化
print('下载并加载训练数据')
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)
val_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform)
print('加载完成')
データセット内の画像がどのように見えるかを見てみましょう
train_data0, train_label_0 = train_dataset[0][0],train_dataset[0][1]
train_data0 = train_data0.reshape([28,28])
plt.figure(figsize=(2,2))
print(plt.imshow(train_data0, cmap=plt.cm.binary))
print('train_data0 的标签为: ' + str(train_label_0))
AxesImage(18,18;111.6x108.72) train_data0 のラベルは次のとおりです: [5]
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/cbook/__init__.py:2349: DeprecationWarning: 「コレクション」からではなく「コレクション」から ABC を使用またはインポートしています。 abc' は非推奨であり、3.8 では isinstance(obj, collections.Iterator): /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/cbook/__init__の場合に動作を停止します。 .py:2366: 非推奨警告: 'collections.abc' からではなく 'collections' から ABC を使用またはインポートすることは非推奨であり、3.8 では動作を停止します return list(data) if isinstance(data, collections.MappingView) else data opt/conda/envs/python35-paddle120-env/lib/python3 .7/site-packages/numpy/lib/type_check.py:546: 非推奨警告: np.asscalar(a) は NumPy v1.16 以降非推奨です。代わりに a.item() を使用してください 。非推奨警告、スタックレベル = 1)
<フィギュアサイズ 144x144 1軸>
データがどのようなものかをもう一度見てみましょう。
print(train_data0)
4. LeNetモデルの構築
MNIST 手書き数字分類用の LeNet-5 モデルの構築
#导入需要的包
import paddle
import paddle.nn.functional as F
from paddle.vision.transforms import Compose, Normalize
#定义模型
class LeNetModel(paddle.nn.Layer):
def __init__(self):
super(LeNetModel, self).__init__()
# 创建卷积和池化层块,每个卷积层后面接着2x2的池化层
#卷积层L1
self.conv1 = paddle.nn.Conv2D(in_channels=1,
out_channels=6,
kernel_size=5,
stride=1)
#池化层L2
self.pool1 = paddle.nn.MaxPool2D(kernel_size=2,
stride=2)
#卷积层L3
self.conv2 = paddle.nn.Conv2D(in_channels=6,
out_channels=16,
kernel_size=5,
stride=1)
#池化层L4
self.pool2 = paddle.nn.MaxPool2D(kernel_size=2,
stride=2)
#线性层L5
self.fc1=paddle.nn.Linear(256,120)
#线性层L6
self.fc2=paddle.nn.Linear(120,84)
#线性层L7
self.fc3=paddle.nn.Linear(84,10)
#正向传播过程
def forward(self, x):
x = self.conv1(x)
x = F.sigmoid(x)
x = self.pool1(x)
x = self.conv2(x)
x = F.sigmoid(x)
x = self.pool2(x)
x = paddle.flatten(x, start_axis=1,stop_axis=-1)
x = self.fc1(x)
x = F.sigmoid(x)
x = self.fc2(x)
x = F.sigmoid(x)
out = self.fc3(x)
return out
model=paddle.Model(LeNetModel())
5. モデル最適化プロセス
5.1 損失関数
これは分類問題であるため、クロスエントロピー損失関数を選択します。クロスエントロピーは主に推定値と真の値の間のギャップを測定するために使用されます。クロスエントロピー値が小さいほど、モデル予測効果が高くなります。*
�(��,�^�)=−∑�=1������(�^�)E(yi,y^ i)=-∑j=1q yji ln(y^ジ)
このうち、��∈��yi∈Rq は実数値、����yji は��yi の要素(値は 0 または 1)、�=1,...,��j=1、 .. .、q. �^�∈��y^ i∈Rq は予測値 (各カテゴリのサンプルの確率) です。このうち、paddleにおけるクロスエントロピーロスに対応するAPIがpaddle.nn.CrossEntropyLoss()です。
5.2 パラメータの最適化
順伝播プロセスが定義された後、初期パラメータがランダム化され、各層の結果が計算されます。毎回、m × 10 行列が予測結果として取得されます (m はミニバッチの数)サンプル。次にバックプロパゲーション処理を行い、予測結果と実際の結果には差が生じるはずで、その差を小さくすることを目的としてモデルパラメータの勾配を計算します。複数の反復を通じて、予測結果が真の結果に近づくようにモデルを最適化できます。
6. モデルのトレーニングと評価
トレーニング構成: トレーニングのハイパーパラメータを設定します。
1. バッチ サイズbatch_size は 64 に設定されます。これは、毎回 64 枚の画像が入力されることを意味します。
2. 反復エポック数は 5 に設定されます。これは、5 ラウンドのトレーニングを意味します。
3. ログ表示詳細 = 1。出力ログ情報を進行状況バーで示します。
model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),
paddle.nn.CrossEntropyLoss(),
paddle.metric.Accuracy())
model.fit(train_dataset,
epochs=5,
batch_size=64,
verbose=1)
model.evaluate(val_dataset,verbose=1)
ログに出力される損失値は現在のステップであり、メトリックは前のステップの平均値です。 エポック 1/5 ステップ 10/938 [................................................] - 損失: 2.3076 - acc: 0.1062 - ETA : 21s~23ms/ステップ
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/layers/utils.py:77: DeprecationWarning: ' からではなく 'コレクション' から ABC を使用またはインポートしていますcollections.abc' は非推奨であり、3.8 では機能しなくなります 。
ステップ 20/938 [................................] - 損失: 2.3023 - acc: 0.1023 - ETA: 18 秒 - 20 ミリ秒/ステップ
ステップ 938/938 [==============================] - 損失: 0.1927 - acc: 0.7765 - 16ms/ステップ エポック 2 /5 ステップ 938/938 [==============================] - 損失: 0.0913 - acc: 0.9584 - 17ms/ステップ エポック 3/5 ステップ 938/938 [=============================] - 損失: 0.0232 - acc: 0.9700 - 17ms /ステップ エポック 4/5 ステップ 938/938 [==============================] - 損失: 0.0057 - acc: 0.9763 - 18ms/ステップ エポック 5/5 ステップ 938/938 [==============================] - 損失: 0.0907 - acc : 0.9798 - 17ms/ステップ Eval begin... ログに出力される損失値は現在のバッチであり、メトリックは前のステップの平均値です。 ステップ 10000/10000 [==============================] - 損失: 7.5607e-04 - acc: 0.9794 - 2ms/ステップ 評価サンプル: 10000
{'損失': [0.00075607264]、'acc': 0.9794}
エポック生成を 5 回繰り返した後、MNIST 画像分類タスクにおける LeNet5 モデルの精度は約 98% に達しました。
7. モデルの視覚化
model.summary((1,1,28,28))
-------------------------------------------------- ------------------------- レイヤ (タイプ) 入力形状 出力形状 パラメータ番号 =============== ================================================= ========== Conv2D-1 [[1, 1, 28, 28]] [1, 6, 24, 24] 156 MaxPool2D-1 [[1, 6, 24, 24]] [1 、6、12、12] 0 Conv2D-2 [[1、6、12、12]] [1、16、8、8] 2,416 MaxPool2D-2 [[1、16、8、8]] [1、16 、4、4] 0 線形-1 [[1, 256]] [1, 120] 30,840 線形-2 [[1, 120]] [1, 84] 10,164 Linear-3 [[1, 84]] [1, 10] 850 ================================== ========================================= 合計パラメータ: 44,426 トレーニング可能なパラメータ: 44,426 非-トレーニング可能なパラメータ: 0 ------------------------------------------- ---------------------------- 入力サイズ (MB): 0.00 前方/後方パス サイズ (MB): 0.04 Params サイズ ( MB): 0.17 推定合計サイズ (MB): 0.22 -------------------------------------- -------------------------------------
{'total_params': 44426, 'trainable_params': 44426}