Python 畳み込みニューラル ネットワーク CNN
提示:前言
Python 畳み込みニューラル ネットワーク CNN
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
記事ディレクトリ
序文
提示:以下是本篇文章正文内容,下面案例可供参考
1. パッケージをインポートする
import numpy as np
from itertools import product
def show_kernel(kernel, label=True, digits=None, text_size=28):
# Format kernel
kernel = np.array(kernel)
if digits is not None:
kernel = kernel.round(digits)
# Plot kernel
cmap = plt.get_cmap('Blues_r')
plt.imshow(kernel, cmap=cmap)
rows, cols = kernel.shape
thresh = (kernel.max()+kernel.min())/2
# Optionally, add value labels
if label:
for i, j in product(range(rows), range(cols)):
val = kernel[i, j]
color = cmap(0) if val > thresh else cmap(255)
plt.text(j, i, val,
color=color, size=text_size,
horizontalalignment='center', verticalalignment='center')
plt.xticks([])
plt.yticks([])
2. はじめに
畳み込み分類器には、畳み込みベースと密層ヘッドの 2 つの部分があることがわかります。基地の仕事は画像から視覚的特徴を抽出することであり、頭部はそれを使用して画像を分類することを学びました。
次のいくつかのレッスンでは、畳み込み画像分類器の基礎で通常見られる 2 つの最も重要なタイプのレイヤーについて学習します。これらは、ReLU アクティベーションを備えた畳み込み層と最大プーリング層です。
このレッスンは、ReLU 活性化関数を使用した畳み込み層についてです。
畳み込みの詳細に入る前に、ネットワークにおけるこれらの層の目的について説明します。これら 3 つの操作 (Convolution、ReLU、Max Pooling) を使用して特徴抽出プロセスを実装する方法を見ていきます。
Base によって実行される特徴抽出は、次の 3 つの基本操作で構成されます。
- 特定の特徴に合わせて画像をフィルター処理します (畳み込み)
- フィルタリングされた画像内のこの特徴を検出します (ReLU)
- 画像を圧縮して機能を強化します(最大プーリング)
以下の図は、このプロセスを示しています。これら 3 つの操作によって、元の画像のいくつかの特定の特徴 (この場合は水平線) がどのように分離できるかがわかります。
通常、ネットワークは 1 つの画像に対して複数の抽出を並行して実行します。最新の畳み込みニューラル ネットワークでは、基本的な最後の層が 1000 を超える固有の視覚的特徴を生成することは珍しくありません。
3. 畳み込みフィルタリング
畳み込み層はフィルタリング ステップを実行します。Keras モデルで畳み込み層を次のように定義できます。
from tensorflow import keras
from tensorflow.keras import layers
model = keras.Sequential([
layers.Conv2D(filters=64, kernel_size=3), # activation is None
# More layers follow
])
これらのパラメーターは、レイヤーの重みやアクティベーションとの関係を調べることで理解できます。今すぐしましょう。
4. 重量
トレーニング中に convnet によって学習された重みは、主に畳み込み層に含まれます。これらの重みをカーネルと呼びます。それらは小さな配列として表すことができます。
カーネルは、画像をスキャンし、ピクセル値の加重合計を生成することによって動作します。このようにして、カーネルは偏光子のように機能し、情報の特定のパターンを強調したり弱めたりします。
カーネルは、畳み込み層が後続の層にどのように接続されるかを定義します。上記のカーネルは、出力の各ニューロンを入力の 9 つのニューロンに接続します。kernel_size でカーネルのサイズを設定することにより、これらの接続を形成する方法を convnet に指示します。ほとんどの場合、カーネルの寸法は kernel_size=(3, 3) や (5, 5) など、奇数であるため、単一のピクセルが中央にありますが、これは必須ではありません。
畳み込み層のカーネルは、それが作成する特徴のタイプを決定します。畳み込みニューラル ネットワークは、トレーニング中に、分類問題を解決するために必要な特徴を学習しようとします。これは、カーネルの最適な値を見つけることを意味します。
5. 機能マップの表示
ネットワーク内のアクティベーションを機能マップと呼びます。画像にフィルターを適用すると、その結果としてカーネルによって抽出された視覚的特徴が含まれます。以下に、カーネルと生成される機能マップをいくつか示します。
トレーニングセット
カーネル内の数値のパターンから、カーネルが作成する特徴マップの種類がわかります。一般に、畳み込みがその入力で強調するものは、カーネル内の正の数の形状と一致します。上の左側と中央のカーネルは両方とも、水平形状をフィルタリングします。
filters パラメーターを使用して、出力として作成する特徴マップの数を畳み込み層に伝えます。
6. ReLUでアクティベートする
フィルタリング後、特徴マップはアクティベーション関数に渡されます。整流関数には次のようなグラフがあります。
ReLU活性化関数のグラフ。
整流関数のグラフは、負の部分が 0 に「整流」された線のように見えます。
整流器が取り付けられたニューロンは、整流線形ユニットと呼ばれます。このため、Rectifier 関数を ReLU アクティベーション関数、または ReLU 関数と呼ぶこともあります。
ReLU アクティベーションは独自のアクティベーション レイヤーで定義できますが、ほとんどの場合、Conv2D のアクティベーション関数としてのみ含めることになります。
model = keras.Sequential([
layers.Conv2D(filters=64, kernel_size=3, activation='relu')
# More layers follow
])
他の活性化関数と同様に、ReLU 関数は非線形です。本質的に、これは、ネットワーク内のすべての層の合計の効果が、それらの効果を加算することによって得られるものとは異なること、つまり 1 つの層だけを使用して得られる効果と同じになることを意味します。非線形性により、ネットワークが深くなるにつれて、機能が興味深い方法で結合されます。(この「特徴構成」については、レッスン 5 で詳しく説明します。)
6. 畳み込みと ReLU を適用する
この例では、畳み込みネットワークが「舞台裏」で何を行っているかをよりよく理解するために、自分たちで抽出を行います。
この例で使用する画像は次のとおりです。
import tensorflow as tf
import matplotlib.pyplot as plt
plt.rc('figure', autolayout=True)
plt.rc('axes', labelweight='bold', labelsize='large',
titleweight='bold', titlesize=18, titlepad=10)
plt.rc('image', cmap='magma')
image_path = '../input/computer-vision-resources/car_feature.jpg'
image = tf.io.read_file(image_path)
image = tf.io.decode_jpeg(image)
plt.figure(figsize=(6, 6))
plt.imshow(tf.squeeze(image), cmap='gray')
plt.axis('off')
plt.show();
フィルタリングのステップでは、カーネルを定義し、それが畳み込みに適用されます。この場合のカーネルは「エッジ検出」カーネルです。Numpy で np.array を使用して配列を定義するのと同じように、tf.constant を使用して定義します。これにより、TensorFlow で使用される種類のテンソルが作成されます。
import tensorflow as tf
kernel = tf.constant([
[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1],
])
plt.figure(figsize=(3, 3))
show_kernel(kernel)
TensorFlow には、その tf.nn モジュールにニューラル ネットワークによって実行される多くの一般的な操作が含まれています。使用するのは conv2d と relu の 2 つです。これらは Keras レイヤーの単なる機能バージョンです。
次の非表示セルは、TensorFlow と互換性があるように再フォーマットされます。この例では詳細は重要ではありません。
それでは、カーネルを適用して何が起こるか見てみましょう
image_filter = tf.nn.conv2d(
input=image,
filters=kernel,
# we'll talk about these two in lesson 4!
strides=1,
padding='SAME',
)
plt.figure(figsize=(6, 6))
plt.imshow(tf.squeeze(image_filter))
plt.axis('off')
plt.show();
次に、ReLU 関数を使用した検出ステップが続きます。この関数はパラメータを設定しないため、畳み込み関数よりもはるかに単純です。
これで機能マップが作成されました。これらの画像は、頭が分類問題を解決するために使用するものです。一部の機能はより自動車に似ているかもしれないし、他の機能はよりトラックに似ているかもしれないと想像できます。トレーニング中の畳み込みネットワークの仕事は、これらの特徴を見つけることができるカーネルを作成することです。