TensorFlow での CNN 画像分類と手順と例
畳み込みニューラルネットワークとは何ですか?
畳み込みニューラルネットワークは、コンブネットまたは CNN とも呼ばれ、コンピューター ビジョン アプリケーションでよく知られている方法です。これは、視覚イメージを分析するために使用されるディープ ニューラル ネットワークの一種です。このタイプのアーキテクチャは、画像やビデオからオブジェクトを認識するために主に使用されます。画像やビデオの認識、ニューラル言語処理などのアプリケーションで使用されます。
Archi畳み込みニューラル ネットワークの構造
数年前の Facebook を思い出してください。プロフィールに写真をアップロードした後、写真上の顔に名前を手動で追加するように求められました。 現在、Facebook は convnet を使用して、写真内の友達を自動的にタグ付けします。
画像分類用の畳み込みニューラル ネットワークを理解するのはそれほど難しくありません。入力画像は畳み込みフェーズで処理され、その後ラベルが付けられます。
典型的な畳み込みネットワークのアーキテクチャは、以下の図にまとめられています。まず、画像がネットワークにプッシュされます。これは入力画像と呼ばれます。次に、入力画像は無限の数のステップを経ます。これがネットワークの畳み込み部分です。最後に、ニューラル ネットワークは画像上の数字を予測できます。

画像は、高さと幅を持つピクセルの配列で構成されます。 グレースケール イメージには 0 つのチャネルしかありませんが、カラー イメージには 255 つのチャネル (それぞれが赤、緑、青に対応) があります。 チャネルは互いにスタックされます。 このチュートリアルでは、チャネルが 0 つだけあるグレースケール イメージを使用します。 各ピクセルには、色の強度を反映する 255 ~ XNUMX の値があります。 たとえば、XNUMX に等しいピクセルは白色を示し、XNUMX に近い値のピクセルはより暗くなります。
に保存されている画像を見てみましょう。 MNISTデータセット。 下の図は、左の図をマトリックス形式で表現する方法を示しています。 元の行列は 0 から 1 の間になるように標準化されていることに注意してください。暗い色の場合、行列の値は約 0.9 ですが、白いピクセルの値は 0 になります。
畳み込み演算
モデルの最も重要なコンポーネントは畳み込み層です。 この部分は、重みの計算を高速化して一般化を改善するために画像のサイズを縮小することを目的としています。
畳み込み部分の間、ネットワークは画像の重要な特徴を維持し、無関係なノイズを除外します。 たとえば、モデルは、山を背景にした写真から象を認識する方法を学習しています。 従来のニューラル ネットワークを使用する場合、モデルはすべてのピクセルに重みを割り当てます。これには、必須ではなくネットワークを誤解させる可能性がある山のピクセルも含まれます。
代わりに、 ケラス 畳み込みニューラル ネットワークは、数学的手法を使用して、最も関連性の高いピクセルのみを抽出します。この数学的操作は畳み込みと呼ばれます。この手法により、ネットワークは各レイヤーでますます複雑な特徴を学習できます。畳み込みは、マトリックスを小さな部分に分割して、各部分内の最も重要な要素を学習します。
畳み込みニューラル ネットワーク (ConvNet または CNN) のコンポーネント
Convnets には XNUMX つのコンポーネントがあります
- コンボリューション
- 非線形性 (ReLU)
- Poolingまたはサブサンプリング
- 分類 (完全接続層)
コンボリューション
畳み込みの目的は、画像上のオブジェクトの特徴を局所的に抽出することです。 これは、ネットワークが画像内の特定のパターンを学習し、画像内のどこにいてもそれを認識できることを意味します。
畳み込みは要素ごとの乗算です。概念は簡単に理解できます。コンピューターは、通常 3×3 の次元で画像の一部をスキャンし、それをフィルターに乗算します。要素ごとの乗算の出力は、特徴マップと呼ばれます。この手順は、画像全体がスキャンされるまで繰り返されます。畳み込みの後、画像のサイズが縮小されることに注意してください。
以下に、畳み込みがどのように機能するかを実際に確認するための URL を示します。
多数のチャンネルが利用可能です。 以下にいくつかのチャンネルをリストします。 各フィルターには特定の目的があることがわかります。 下の図に注意してください。 カーネルはフィルターの同義語です。
畳み込みの背後にある演算
畳み込みフェーズでは、画像内の小さなピクセル配列にフィルターを適用します。フィルターは、3×3 または 5×5 の一般的な形状で入力画像に沿って移動します。つまり、ネットワークはこれらのウィンドウをすべての入力画像にわたってスライドさせ、畳み込みを計算します。下の画像は、畳み込みがどのように動作するかを示しています。パッチのサイズは 3×3 で、出力マトリックスは、画像マトリックスとフィルター間の要素ごとの操作の結果です。
出力の幅と高さが、入力の幅と高さと異なる場合があることがわかります。 それは境界効果によって起こります。
ボーダー効果
画像には 5×5 の特徴マップと 3×3 のフィルターが含まれています。 フィルターが 3×3 グリッドをスクリーンできるウィンドウは中央に 3 つだけあります。 出力フィーチャ マップは、3×XNUMX 次元とともに XNUMX タイル分縮小します。
入力次元と同じ出力次元を取得するには、パディングを追加する必要があります。 パディングは、行列の両側に正しい数の行と列を追加することで構成されます。 これにより、畳み込みをすべての入力タイルの中心に合わせることができます。 下の画像では、入力/出力行列は同じ次元 5×5 です。
ネットワークを定義するとき、畳み込み特徴は XNUMX つのパラメーターによって制御されます。
- 深さ: 畳み込み中に適用するフィルターの数を定義します。前の例では、深さが 1 で、XNUMX つのフィルターのみが使用されることを意味しています。ほとんどの場合、フィルターは複数あります。下の図は、XNUMX つのフィルターがある場合に実行される操作を示しています。
- ストライド: 1 つのスライス間の「ピクセルのジャンプ」数を定義します。ストライドが 2 の場合、ウィンドウは XNUMX ピクセルの広がりで移動します。ストライドが XNUMX の場合、ウィンドウは XNUMX ピクセルずつジャンプします。ストライドを大きくすると、特徴マップが小さくなります。
歩幅例1
ストライド2
- ゼロパディングパディングは、入力フィーチャマップの各側に対応する数の行と列を追加する操作です。この場合、出力は入力と同じ次元になります。
非線形性 (ReLU)
畳み込み演算の最後に、出力は非線形性を可能にするために活性化関数の対象となります。convnet の通常の活性化関数は Relu です。負の値を持つすべてのピクセルはゼロに置き換えられます。
Pooling Opera生産
このステップは簡単に理解できます。プーリングの目的は、入力画像の次元を減らすことです。このステップは、操作の計算の複雑さを軽減するために行われます。次元を減らすことで、ネットワークが計算する重みが低くなり、オーバーフィッティングを防止します。
この段階では、サイズとストライドを定義する必要があります。入力画像をプールする標準的な方法は、特徴マップの最大値を使用することです。下の図をご覧ください。「プーリング」は、4×4 特徴マップの 2 つのサブマトリックスをスクリーニングし、最大値を返します。プーリングは、2×3,1,3,2 配列の最大値を取得し、このウィンドウを 3 ピクセルずつ移動します。たとえば、最初のサブマトリックスが [XNUMX] の場合、プーリングは最大値である XNUMX を返します。
平均などの別のプーリング操作もあります。
この操作により、特徴マップのサイズが積極的に縮小されます。
完全に接続されたレイヤー
最後のステップでは、従来の 人工ニューラルネットワーク 前のチュートリアルで行ったように。 前の層のすべてのニューロンを次の層に接続します。 ソフトマックス アクティベーション関数を使用して、入力画像上の数値を分類します。
要約:
TensorFlow 畳み込みニューラル ネットワークは、予測を行う前にさまざまなレイヤーをコンパイルします。 ニューラル ネットワークには次の機能があります。
- 畳み込み層
- Reluアクティベーション機能
- Pooling層
- 密に接続された層
畳み込み層は、画像のサブ領域にさまざまなフィルターを適用します。Relu 活性化関数は非線形性を追加し、プーリング層は特徴マップの次元を削減します。
これらすべてのレイヤーは、画像から重要な情報を抽出します。 最後に、特徴マップはソフトマックス関数を使用してプライマリ完全接続層に供給され、予測が行われます。
TensorFlow を使用して CNN をトレーニングする
convnet の構成要素については理解できたので、次は convnet を構築する準備ができています。 TensorFlow。 CNN 画像分類には MNIST データセットを使用します。
データの準備は前回のチュートリアルと同じです。コードを実行して、CNN のアーキテクチャに直接ジャンプできます。
CNN を使用して画像を分類するには、次の手順に従います。
ステップ 1: データセットをアップロードする
ステップ 2: 入力レイヤー
ステップ 3: 畳み込み層
ステップ4: Pooling層
ステップ 5: XNUMX 番目の畳み込み層と Pooling レイヤー
ステップ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 は、画像の生のピクセルにフィルターを使用して、従来のニューラル ネットの全体的なパターンと比較した詳細なパターンを学習します。CNN を構築するには、以下を定義する必要があります。
- 畳み込み層: n 個のフィルターを特徴マップに適用します。 畳み込み後、Relu アクティベーション関数を使用してネットワークに非線形性を追加する必要があります。
- Pooling レイヤー: 畳み込み後の次のステップは、特徴の最大値のダウンサンプリングです。その目的は、特徴マップの次元を減らしてオーバーフィッティングを防ぎ、計算速度を向上させることです。最大プーリングは、特徴マップをサブ領域 (通常は 2×2 サイズ) に分割し、最大値のみを保持する従来の手法です。
- 完全に接続された層: 前の層のすべてのニューロンが次の層に接続されます。CNN は、畳み込み層からの特徴とプーリング層で削減された特徴に従ってラベルを分類します。
CNNアーキテクチャ
- 畳み込み層: 14 個の 5×5 フィルターを適用 (5×5 ピクセルのサブ領域を抽出)、ReLU 活性化関数付き
- Pooling レイヤー: 2×2 フィルターとストライド 2 で最大プーリングを実行します (プールされた領域が重複しないように指定します)
- 畳み込み層: 36 個の 5×5 フィルターを適用、ReLU 活性化関数付き
- Pooling レイヤー2: 再び、2×2フィルターとストライド2で最大プーリングを実行します。
- 1,764 個のニューロン、ドロップアウト正則化率は 0.4 (トレーニング中に特定の要素がドロップされる確率は 0.4)
- 密層 (ロジッツ層): 10 個のニューロン (数字のターゲット クラス (0 ~ 9) ごとに XNUMX つずつ)。
CNN の作成に使用する重要なモジュールが XNUMX つあります。
- conv2d()。 フィルター数、フィルターカーネルサイズ、パディング、活性化関数を引数として二次元畳み込み層を構築します。
- max_pooling2d()。最大プーリング アルゴリズムを使用して 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: Pooling層
畳み込みの後の次のステップはプーリング計算です。プーリング計算はデータの次元を削減します。サイズ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 番目の畳み込み層と Pooling レイヤー
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)
次のステップは、モデルの損失を計算することです。前回のチュートリアルでは、マルチクラス モデルの損失関数はクロス エントロピーであることを学習しました。損失は次のコードで簡単に計算できます。
# 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: Pooling層
3,1,3,2 番目のステップでは、プーリング レイヤーを追加します。このレイヤーは入力のサイズを縮小します。これは、サブマトリックスの最大値を取得することによって行われます。たとえば、サブマトリックスが [3] の場合、プーリングは最大値である XNUMX を返します。
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
ステップ 5: 畳み込み層を追加し、 Pooling レイヤー
このステップでは、必要なだけ conv レイヤーと pooling レイヤーを追加できます。Google は 20 を超える conv レイヤーを備えたアーキテクチャを使用します。
ステップ 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)