TensorFlow での CNN 画像分類と手順と例

畳み込みニューラルネットワークとは何ですか?

畳み込みニューラルネットワークconvnets または CNN とも呼ばれる、コンピューター ビジョン アプリケーションでよく知られた方法です。 これは、視覚画像の分析に使用されるディープ ニューラル ネットワークのクラスです。 このタイプのアーキテクチャは、画像やビデオからオブジェクトを認識する場合に主流です。 画像やビデオの認識、神経言語処理などのアプリケーションで使用されます。

畳み込みニューラル ネットワークのアーキテクチャ

数年前の Facebook を思い出してください。プロフィールに写真をアップロードした後、写真上の顔に名前を手動で追加するように求められました。 現在、Facebook は convnet を使用して、写真内の友達を自動的にタグ付けします。

画像分類のための畳み込みニューラル ネットワークを理解するのはそれほど難しくありません。 入力画像は畳み込みフェーズ中に処理され、後でラベルが付けられます。

典型的な convnet アーキテクチャは、以下の図に要約できます。 まず、イメージがネットワークにプッシュされます。 これを入力画像と呼びます。 次に、入力画像は無限のステップを経ます。 これはネットワークの畳み込み部分です。 最後に、ニューラル ネットワークは画像上の数字を予測できます。

畳み込みニューラル ネットワーク (CNN) のアーキテクチャ
畳み込みニューラル ネットワーク (CNN) のアーキテクチャ

画像は、高さと幅を持つピクセルの配列で構成されます。 グレースケール イメージには 0 つのチャネルしかありませんが、カラー イメージには 255 つのチャネル (それぞれが赤、緑、青に対応) があります。 チャネルは互いにスタックされます。 このチュートリアルでは、チャネルが 0 つだけあるグレースケール イメージを使用します。 各ピクセルには、色の強度を反映する 255 ~ XNUMX の値があります。 たとえば、XNUMX に等しいピクセルは白色を示し、XNUMX に近い値のピクセルはより暗くなります。

に保存されている画像を見てみましょう。 MNISTデータセット。 下の図は、左の図をマトリックス形式で表現する方法を示しています。 元の行列は 0 から 1 の間になるように標準化されていることに注意してください。暗い色の場合、行列の値は約 0.9 ですが、白いピクセルの値は 0 になります。

畳み込みニューラルネットワーク

畳み込み演算

モデルの最も重要なコンポーネントは畳み込み層です。 この部分は、重みの計算を高速化して一般化を改善するために画像のサイズを縮小することを目的としています。

畳み込み部分の間、ネットワークは画像の重要な特徴を維持し、無関係なノイズを除外します。 たとえば、モデルは、山を背景にした写真から象を認識する方法を学習しています。 従来のニューラル ネットワークを使用する場合、モデルはすべてのピクセルに重みを割り当てます。これには、必須ではなくネットワークを誤解させる可能性がある山のピクセルも含まれます。

代わりに、 ケラス 畳み込みニューラル ネットワークは数学的手法を使用して、最も関連性の高いピクセルのみを抽出します。 この数学的演算は畳み込みと呼ばれます。 この技術により、ネットワークはより多くの情報を学習できるようになります。plex 各層の特徴。 畳み込みは行列を小さな部分に分割し、各部分内の最も重要な要素を学習します。

畳み込みニューラル ネットワーク (ConvNet または CNN) のコンポーネント

Convnets には XNUMX つのコンポーネントがあります

  1. コンボリューション
  2. 非線形性 (ReLU)
  3. プーリングまたはサブサンプリング
  4. 分類 (完全接続層)

コンボリューション

畳み込みの目的は、画像上のオブジェクトの特徴を局所的に抽出することです。 これは、ネットワークが画像内の特定のパターンを学習し、画像内のどこにいてもそれを認識できることを意味します。

畳み込みは要素ごとの乗算です。 コンセプトは理解しやすいです。 コンピュータは、通常 3×3 の寸法で画像の一部をスキャンし、フィルタを掛け合わせます。 要素ごとの乗算の出力は、特徴マップと呼ばれます。 このステップは、すべての画像がスキャンされるまで繰り返されます。 畳み込み後、画像のサイズが縮小されることに注意してください。

コンボリューション

以下に、畳み込みがどのように機能するかを実際に確認するための URL を示します。

コンボリューション

多数のチャンネルが利用可能です。 以下にいくつかのチャンネルをリストします。 各フィルターには特定の目的があることがわかります。 下の図に注意してください。 カーネルはフィルターの同義語です。

コンボリューション

畳み込みの背後にある演算

畳み込みフェーズでは、画像内の小さなピクセル配列にフィルターが適用されます。 フィルターは、3×3 または 5×5 の一般的な形状で入力画像に沿って移動します。 これは、ネットワークがこれらのウィンドウをすべての入力画像にわたってスライドさせて畳み込みを計算することを意味します。 下の図は、畳み込みがどのように動作するかを示しています。 パッチのサイズは 3×3 で、出力行列は画像行列とフィルター間の要素ごとの演算の結果です。

畳み込みの背後にある算術

出力の幅と高さが、入力の幅と高さと異なる場合があることがわかります。 それは境界効果によって起こります。

ボーダー効果

画像には 5×5 の特徴マップと 3×3 のフィルターが含まれています。 フィルターが 3×3 グリッドをスクリーンできるウィンドウは中央に 3 つだけあります。 出力フィーチャ マップは、3×XNUMX 次元とともに XNUMX タイル分縮小します。

ボーダー効果

入力次元と同じ出力次元を取得するには、パディングを追加する必要があります。 パディングは、行列の両側に正しい数の行と列を追加することで構成されます。 これにより、畳み込みをすべての入力タイルの中心に合わせることができます。 下の画像では、入力/出力行列は同じ次元 5×5 です。

ボーダー効果

ネットワークを定義するとき、畳み込み特徴は XNUMX つのパラメーターによって制御されます。

  1. 深さ: 畳み込み中に適用するフィルターの数を定義します。 前の例では、深さは 1 でしたが、これは XNUMX つのフィルターのみが使用されていることを意味します。 ほとんどの場合、複数のフィルターがあります。 下の図は、XNUMX つのフィルターがある状況で実行される操作を示しています。

ボーダー効果

  1. ストライド: 1 つのスライス間の「ピクセルのジャンプ」の数を定義します。 ストライドが 2 の場合、ウィンドウはピクセルの広がり XNUMX で移動します。 ストライドが XNUMX に等しい場合、ウィンドウは XNUMX ピクセルずつジャンプします。 ストライドを増やすと、特徴マップが小さくなります。

歩幅例1

歩幅の例

ストライド2

歩幅の例

  1. ゼロパディング: パディングは、入力特徴マップの両側に対応する数の行と列を追加する操作です。 この場合、出力は入力と同じ次元になります。

非線形性 (ReLU)

畳み込み演算の終了時に、出力は非線形性を許容するために活性化関数の影響を受けます。 convnet の通常のアクティベーション関数は Relu です。 負の値を持つピクセルはすべてゼロに置き換えられます。

プーリング操作

このステップは理解しやすいです。 プーリングの目的は、入力イメージの次元を削減することです。 この手順は、計算コストを削減するために実行されます。plex操作の内容。 次元を減らすことでネットワークの計算重みが減り、過学習が防止されます。

この段階では、サイズとストライドを定義する必要があります。 入力イメージをプールする標準的な方法は、特徴マップの最大値を使用することです。 下の写真を見てください。 「プーリング」は、4×4 特徴マップの 2 つの部分行列をスクリーニングし、最大値を返します。 プーリングは 2×3,1,3,2 配列の最大値を取得し、このウィンドウを 3 ピクセルずつ移動します。 たとえば、最初の部分行列は [XNUMX] であり、プーリングは最大値の XNUMX を返します。

プーリング操作

平均などの別のプーリング演算もあります。

この操作により、特徴マップのサイズが積極的に削減されます。

完全に接続されたレイヤー

最後のステップでは、従来の 人工ニューラルネットワーク 前のチュートリアルで行ったように。 前の層のすべてのニューロンを次の層に接続します。 ソフトマックス アクティベーション関数を使用して、入力画像上の数値を分類します。

要約:

TensorFlow 畳み込みニューラル ネットワークは、予測を行う前にさまざまなレイヤーをコンパイルします。 ニューラル ネットワークには次の機能があります。

  • 畳み込み層
  • Reluアクティベーション機能
  • プーリングレイヤー
  • 密に接続された層

畳み込み層は、画像のサブ領域にさまざまなフィルターを適用します。 Relu 活性化関数は非線形性を追加し、プーリング層は特徴マップの次元を削減します。

これらすべてのレイヤーは、画像から重要な情報を抽出します。 最後に、特徴マップはソフトマックス関数を使用してプライマリ完全接続層に供給され、予測が行われます。

TensorFlow を使用して CNN をトレーニングする

convnet の構成要素については理解できたので、次は convnet を構築する準備ができています。 TensorFlow。 CNN 画像分類には MNIST データセットを使用します。

データの準備は前のチュートリアルと同じです。 コードを実行して、CNN のアーキテクチャに直接ジャンプできます。

CNN を使用して画像を分類するには、次の手順に従います。

ステップ 1: データセットをアップロードする

ステップ 2: 入力レイヤー

ステップ 3: 畳み込み層

ステップ 4: プーリング層

ステップ 5: XNUMX 番目の畳み込み層とプーリング層

ステップ6: 緻密な層

ステップ 7: ロジット層

ステップ 1: データセットをアップロードする

MNIST データセットは scikit で利用でき、ここで学習できます。 URL。 ダウンロードして「ダウンロード」に保存してください。 fetch_mldata('MNIST オリジナル') でアップロードできます。

トレーニング/テスト セットを作成する

train_test_split を使用してデータセットを分割する必要があります

機能を拡張する

最後に、TensorFlow CNN の例を使用した以下の画像分類に示すように、MinMaxScaler を使用して特徴をスケーリングできます。

import numpy as np
import tensorflow as tf
from sklearn.datasets import fetch_mldata

#Change USERNAME by the username of your machine
## Windows USER
mnist = fetch_mldata('C:\\Users\\USERNAME\\Downloads\\MNIST original')
## Mac User
mnist = fetch_mldata('/Users/USERNAME/Downloads/MNIST original')

print(mnist.data.shape)
print(mnist.target.shape)
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42)
y_train  = y_train.astype(int)
y_test  = y_test.astype(int)
batch_size =len(X_train)

print(X_train.shape, y_train.shape,y_test.shape )
## resclae
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
# Train
X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))
# test
X_test_scaled = scaler.fit_transform(X_test.astype(np.float64))
feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]
X_train_scaled.shape[1:]

CNN を定義する

CNN は、画像の生のピクセルにフィルターを使用して、画像を学習します。tails パターンを従来のニューラル ネットワークを使用したグローバル パターンと比較します。 CNN を構築するには、以下を定義する必要があります。

  1. 畳み込み層: n 個のフィルターを特徴マップに適用します。 畳み込み後、Relu アクティベーション関数を使用してネットワークに非線形性を追加する必要があります。
  2. プーリング層: 畳み込み後の次のステップは、特徴量の最大値をダウンサンプリングすることです。 目的は、特徴マップの次元を削減して過剰適合を防止し、計算速度を向上させることです。 最大プーリングは、特徴マップをサブ領域 (通常は 2×2 サイズ) に分割し、最大値のみを保持する従来の手法です。
  3. 完全に接続された層: 前の層のすべてのニューロンが次の層に接続されます。 CNN は、畳み込み層からの特徴に従ってラベルを分類し、プーリング層で削減します。

CNN アーキテクチャ

  • 畳み込み層: 14 個の 5×5 フィルターを適用 (5×5 ピクセルのサブ領域を抽出)、ReLU 活性化関数付き
  • プーリング層: 2×2 フィルターと 2 のストライドを使用して最大プーリングを実行します (プールされた領域が重ならないように指定します)。
  • 畳み込み層: 36 個の 5×5 フィルターを適用、ReLU 活性化関数付き
  • プーリング層 #2: 再度、2×2 フィルターと 2 のストライドを使用して最大プーリングを実行します。
  • 1,764 個のニューロン、ドロップアウト正則化率は 0.4 (トレーニング中に特定の要素がドロップされる確率は 0.4)
  • 密層 (ロジッツ層): 10 個のニューロン (数字のターゲット クラス (0 ~ 9) ごとに XNUMX つずつ)。

CNN の作成に使用する重要なモジュールが XNUMX つあります。

  • conv2d()。 フィルター数、フィルターカーネルサイズ、パディング、活性化関数を引数として二次元畳み込み層を構築します。
  • max_pooling2d()。 max-pooling アルゴリズムを使用して XNUMX 次元プーリング層を構築します。
  • 密集()。 非表示のレイヤーとユニットを使用して高密度のレイヤーを構築します

CNN を構築する関数を定義します。 すべてを関数にラップする前に、各構成要素を構築する方法を詳しく見てみましょう。

ステップ 2: 入力レイヤー

def cnn_model_fn(features, labels, mode):
    input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])

データの形状を使用してテンソルを定義する必要があります。 そのためには、モジュール tf.reshape を使用できます。 このモジュールでは、再形成するテンソルとテンソルの形状を宣言する必要があります。 最初の引数はデータの特徴であり、関数の引数で定義されます。

画像には高さ、幅、チャンネルがあります。 MNIST データセットは、28×28 サイズのモノクロ画像です。 形状引数でバッチ サイズを -1 に設定して、features[“x”] の形状を取るようにします。 利点は、バッチ サイズのハイパーパラメータを調整できることです。 バッチ サイズが 7 に設定されている場合、テンソルは 5,488 個の値 (28*28*7) をフィードします。

ステップ 3: 畳み込み層

# first Convolutional Layer
  conv1 = tf.layers.conv2d(
      inputs=input_layer,
      filters=14,
      kernel_size=[5, 5],
      padding="same",
      activation=tf.nn.relu)

最初の畳み込み層には、カーネル サイズが 14×5 で同じパディングを持つ 5 個のフィルターがあります。 同じパディングは、出力テンソルと入力テンソルの両方が同じ高さと幅を持つ必要があることを意味します。 Tensorflow は行と列にゼロを追加して、同じサイズを確保します。

Relu アクティベーション関数を使用します。 出力サイズは[28, 28, 14]となります。

ステップ 4: プーリング層

畳み込みの次のステップはプーリング計算です。 プーリング計算により、データの次元が削減されます。 サイズ 2×2、ストライド 2 のモジュール max_pooling2d を使用できます。前のレイヤーを入力として使用します。 出力サイズは [batch_size, 14, 14, 14] になります。

# first Pooling Layer 
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)

ステップ 5: XNUMX 番目の畳み込み層とプーリング層

32 番目の畳み込み層には 14 個のフィルターがあり、出力サイズは [batch_size, 14, 32, 14] です。 プーリング層のサイズは以前と同じで、出力形状は [batch_size, 14, 18, XNUMX] です。

conv2 = tf.layers.conv2d(
      inputs=pool1,
      filters=36,
      kernel_size=[5, 5],
      padding="same",
      activation=tf.nn.relu)
pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)

ステップ6: 緻密な層

次に、全結合層を定義する必要があります。 フィーチャ マップは、密なレイヤーに接続する前に平坦化する必要があります。 7*7*36 のサイズでモジュールの変形を使用できます。

高密度層は 1764 個のニューロンを接続します。 Relu アクティベーション関数を追加します。 さらに、レート 0.3 のドロップアウト正則化項を追加します。これは、重みの 30 パーセントが 0 に設定されることを意味します。ドロップアウトはトレーニング フェーズ中にのみ発生することに注意してください。 関数 cnn_model_fn には、以下の CNN 画像分類 TensorFlow の例に示すように、モデルのトレーニングまたは評価が必要かどうかを宣言するための引数 mode があります。

pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36])

dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu)
dropout = tf.layers.dropout(
      inputs=dense, rate=0.3, training=mode == tf.estimator.ModeKeys.TRAIN)

ステップ 7: ロジット層

最後に、TensorFlow 画像分類の例では、モデルの予測を使用して最後のレイヤーを定義できます。 出力形状はバッチ サイズとイメージの総数 10 に等しくなります。

# Logits Layer
logits = tf.layers.dense(inputs=dropout, units=10)

クラスと各クラスの確率を含む辞書を作成できます。 モジュール tf.argmax() は、ロジット層の場合に最高値を返します。 ソフトマックス関数は、各クラスの確率を返します。

predictions = {				
	# Generate predictions				
    "classes": tf.argmax(input=logits, axis=1),				
    "probabilities": tf.nn.softmax(logits, name="softmax_tensor")  }			

モードが予測に設定されている場合にのみ、辞書の予測を返します。 予測を表示するには、このコードを追加します

if mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

次のステップでは、モデルの損失を計算します。 前回のチュートリアルでは、マルチクラス モデルの損失関数がクロス エントロピーであることを学びました。 損失は​​次のように簡単に計算できます。wing コー​​ド:

# Calculate Loss (for both TRAIN and EVAL modes)
loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)

TensorFlow CNN サンプルの最後のステップは、モデルを最適化すること、つまり、重みの最適な値を見つけることです。 そのためには、学習率 0.001 の勾配降下オプティマイザーを使用します。 目的は損失を最小限に抑えることです

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
train_op = optimizer.minimize(
        loss=loss,
        global_step=tf.train.get_global_step())

これで CNN は終わりです。 ただし、評価モード中にパフォーマンス メトリックを表示したいと考えています。 マルチクラス モデルのパフォーマンス メトリックは、精度メトリックです。 Tensorflow には、ラベルと予測値という XNUMX つの引数を持つモジュール精度が装備されています。

eval_metric_ops = {
      "accuracy": tf.metrics.accuracy(labels=labels, predictions=predictions["classes"])}
return tf.estimator.EstimatorSpec(mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)

それでおしまい。 最初の CNN を作成しました。モデルのトレーニングと評価に使用するために、すべてを関数にラップする準備が整いました。

def cnn_model_fn(features, labels, mode):
  """Model function for CNN."""
  # Input Layer
  input_layer = tf.reshape(features["x"], [-1, 28, 28, 1])

  # Convolutional Layer
  conv1 = tf.layers.conv2d(
      inputs=input_layer,
      filters=32,
      kernel_size=[5, 5],
      padding="same",
      activation=tf.nn.relu)

  # Pooling Layer
  pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)

  # Convolutional Layer #2 and Pooling Layer
  conv2 = tf.layers.conv2d(
      inputs=pool1,
      filters=36,
      kernel_size=[5, 5],
      padding="same",
      activation=tf.nn.relu)
  pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)

  # Dense Layer
  pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36])
  dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu)
  dropout = tf.layers.dropout(
      inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN)

  # Logits Layer
  logits = tf.layers.dense(inputs=dropout, units=10)

  predictions = {
      # Generate predictions (for PREDICT and EVAL mode)
      "classes": tf.argmax(input=logits, axis=1),
      "probabilities": tf.nn.softmax(logits, name="softmax_tensor")
  }

  if mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

  # Calculate Loss
  loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)

  # Configure the Training Op (for TRAIN mode)
  if mode == tf.estimator.ModeKeys.TRAIN:
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
    train_op = optimizer.minimize(
        loss=loss,
        global_step=tf.train.get_global_step())
    return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)

  # Add evaluation metrics Evaluation mode
  eval_metric_ops = {
      "accuracy": tf.metrics.accuracy(
          labels=labels, predictions=predictions["classes"])}
  return tf.estimator.EstimatorSpec(
      mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)

以下の手順は前のチュートリアルと同じです。

まず、画像分類用の CNN モデルを使用して推定器を定義します。

# Create the Estimator
mnist_classifier = tf.estimator.Estimator(
    model_fn=cnn_model_fn, model_dir="train/mnist_convnet_model")

CNN はトレーニングに何度もかかるため、50 回の反復ごとにソフトマックス層の値を保存するロギング フックを作成します。

# Set up logging for predictions
tensors_to_log = {"probabilities": "softmax_tensor"}
logging_hook = tf.train.LoggingTensorHook(tensors=tensors_to_log, every_n_iter=50)

モデルを推定する準備ができました。 バッチ サイズを 100 に設定し、データをシャッフルします。 トレーニング ステップを 16.000 に設定しているため、トレーニングにはかなりの時間がかかる場合があることに注意してください。 我慢して。

# Train the model
train_input_fn = tf.estimator.inputs.numpy_input_fn(
    x={"x": X_train_scaled},
    y=y_train,
    batch_size=100,
    num_epochs=None,
    shuffle=True)
mnist_classifier.train(
    input_fn=train_input_fn,
    steps=16000,
    hooks=[logging_hook])

モデルがトレーニングされたので、モデルを評価して結果を出力できます。

# Evaluate the model and print results
eval_input_fn = tf.estimator.inputs.numpy_input_fn(
    x={"x": X_test_scaled},
    y=y_test,
    num_epochs=1,
    shuffle=False)
eval_results = mnist_classifier.evaluate(input_fn=eval_input_fn)
print(eval_results)
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-08-05-12:52:41
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train/mnist_convnet_model/model.ckpt-15652
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-08-05-12:52:56
INFO:tensorflow:Saving dict for global step 15652: accuracy = 0.9589286, global_step = 15652, loss = 0.13894269
{'accuracy': 0.9689286, 'loss': 0.13894269, 'global_step': 15652}

現在のアーキテクチャでは、97% の精度が得られます。 アーキテクチャ、バッチ サイズ、反復回数を変更して、精度を向上させることができます。 CNN ニューラル ネットワークは、ANN やロジスティック回帰よりもはるかに優れたパフォーマンスを示しています。 人工ニューラル ネットワークに関するチュートリアルでは、精度は 96% でしたが、これは CNN よりも低い値です。 CNN のパフォーマンスは大きな画像で印象的です セッションに、計算速度と精度の両方の点で。

まとめ

畳み込みニューラル ネットワークは画像を評価するのに非常にうまく機能します。 このタイプのアーキテクチャは、画像やビデオからオブジェクトを認識する場合に主流です。

TensorFlow CNN を構築するには、次の XNUMX つの手順に従う必要があります。

ステップ 1: データセットをアップロード:

MNIST データセットは、scikit で学習するために利用できます。 ダウンロードして「ダウンロード」に保存してください。 fetch_mldata('MNIST オリジナル') でアップロードできます。

ステップ 2: 入力レイヤー:

このステップではデータを再形成します。 形状はピクセル数の平方根に等しい。 たとえば、画像のピクセル数が 156 の場合、形状は 26×26 になります。 画像に色があるかどうかを指定する必要があります。 「はい」の場合、シェイプには 3 が設定されています (RGB の場合は 3)。それ以外の場合は 1 です。

input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])

ステップ 3: 畳み込み層

次に、畳み込み層を作成する必要があります。 さまざまなフィルターを適用して、ネットワークが重要な機能を学習できるようにします。 カーネルのサイズとフィルターの量を指定します。

conv1 = tf.layers.conv2d(
      inputs=input_layer,
      filters=14,
      kernel_size=[5, 5],
      padding="same",
      activation=tf.nn.relu)

ステップ 4: プーリング層

3,1,3,2 番目のステップでは、プーリング層を追加します。 このレイヤーにより、入力のサイズが減少します。 これは、部分行列の最大値を取得することによって行われます。 たとえば、部分行列が [3] の場合、プーリングは最大値の XNUMX を返します。

pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)

ステップ 5: 畳み込み層とプーリング層を追加

このステップでは、コンバージョン レイヤーとプーリング レイヤーを必要なだけ追加できます。 Google は 20 を超えるコンバージョン レイヤーを備えたアーキテクチャを使用しています。

ステップ 6: 緻密な層

ステップ 6 では、前のレイヤーを平坦化して、完全に接続されたレイヤーを作成します。 このステップでは、別のアクティベーション関数を使用し、ドロップアウト効果を追加できます。

pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36])

dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu)
dropout = tf.layers.dropout(
      inputs=dense, rate=0.3, training=mode == tf.estimator.ModeKeys.TRAIN)

ステップ 7: ロジットレイヤー

最後のステップは予測です。

logits = tf.layers.dense(inputs=dropout, units=10)