ワンホットエンコーディングでは、バイナリ値のベクトルを使用して数値またはカテゴリ値を表します。ラベルは0〜9の数字に対応しているため、ベクトルには10の値が含まれており、それぞれの数字が1つに対応しています。これらの値の1つは1に設定され、ベクトルのそのインデックスの桁を表し、残りは0に設定されます。+`を使用して表されます。インデックス3の値は1として格納されるため、ベクトルは数字3を表します。実際の画像自体を表すために、28×28ピクセルはサイズが784ピクセルの1Dベクトルに平坦化されます。画像を構成する784ピクセルのそれぞれは、0〜255の値として保存されます。画像は白黒のみで表示されるため、これによりピクセルのグレースケールが決まります。したがって、黒いピクセルは255で、白いピクセルは0で表され、中間のどこかにさまざまなグレーの陰影があります。`変数を使用して、インポートしたデータセットのサイズを確認できます。+`を見ると、トレーニング用に55,000個の画像、検証用に5000個、テスト用に10,000個のデータセットに分割されていることがわかります。ファイルに次の行を追加します。10,000データがインポートされたので、次はニューラルネットワークについて考えます。ステップ3-ニューラルネットワークアーキテクチャの定義ニューラルネットワークのアーキテクチャは、ネットワーク内のレイヤー数、各レイヤー内のユニット数、ユニットがレイヤー間でどのように接続されているかなどの要素を指します。ニューラルネットワークは人間の脳の働きに大まかに触発されているため、ここではユニットという用語を使用して、生物学的にニューロンと考えるものを表します。ニューロンが脳の周りに信号を渡すように、ユニットは以前のユニットからいくつかの値を入力として受け取り、計算を実行してから、新しい値を出力として他のユニットに渡します。これらのユニットは、値を入力するための1つのレイヤーと値を出力するための1つのレイヤーから最低でも始まるネットワークを形成するために階層化されます。layer_という用語は、入力レイヤーと出力レイヤーの間のすべてのレイヤーに使用されます。現実の世界から「隠された」もの。パフォーマンスは、パラメーター、データ、トレーニング期間などのアーキテクチャの関数として考えることができるため、アーキテクチャが異なると劇的に異なる結果が得られます。次のコード行をファイルに追加して、レイヤーごとのユニット数をグローバル変数に保存します。これにより、ネットワークアーキテクチャを1か所で変更できます。チュートリアルの最後で、レイヤーとユニットの数がモデルの結果にどのように影響するかを自分でテストできます。digits)次の図は、設計したアーキテクチャの視覚化を示しています。各レイヤーは周囲のレイヤーに完全に接続されています。[ニューラルネットワークの図]「ディープニューラルネットワーク」という用語は隠れ層の数に関連し、「浅い」は通常1つの隠れ層を意味し、「深い」は複数の隠れ層を指します。十分なトレーニングデータが与えられた場合、十分な数のユニットを備えた浅いニューラルネットワークは、理論的には、ディープニューラルネットワークが可能なあらゆる機能を表すことができるはずです。深いディープニューラルネットワークを使用して、指数関数的により隠れたユニットを持つ浅いネットワークを必要とする同じタスクを達成する方が、多くの場合、計算効率が高くなります。浅いニューラルネットワークは、しばしば過剰適合に遭遇します。この場合、ネットワークは、見たトレーニングデータを基本的に記憶し、知識を新しいデータに一般化することはできません。これが、ディープニューラルネットワークがより一般的に使用される理由です。生の入力データと出力ラベルの間の複数のレイヤーにより、ネットワークはさまざまな抽象化レベルで機能を学習でき、ネットワーク自体をより一般化できるようになります。ここで定義する必要があるニューラルネットワークの他の要素は、ハイパーパラメーターです。トレーニング中に更新されるパラメーターとは異なり、これらの値は最初に設定され、プロセス全体を通して一定のままです。ファイルで、次の変数と値を設定します。0.5学習率は、学習プロセスの各ステップでパラメーターが調整される度合いを表します。これらの調整は、トレーニングの重要な要素です。ネットワークを通過するたびに、損失を減らすために重みをわずかに調整します。ラーニングレートを大きくすると、収束が速くなりますが、最適値が更新されるとオーバーシュートする可能性もあります。反復回数とは、トレーニングステップを何回行うかを指し、バッチサイズとは、各ステップで使用するトレーニングサンプルの数を指します。`変数は、ランダムにいくつかのユニットを削除するしきい値を表します。+」を使用して、各ユニットに各トレーニングステップで50%の確率で排除されるようにします。これは、過剰適合の防止に役立ちます。これで、ニューラルネットワークのアーキテクチャと、学習プロセスに影響を与えるハイパーパラメーターを定義しました。次のステップは、ネットワークをTensorFlowグラフとして構築することです。ステップ4-TensorFlowグラフの構築ネットワークを構築するために、TensorFlowが実行する計算グラフとしてネットワークを設定します。TensorFlowのコアコンセプトは、_tensor_です。これは、配列またはリストに似たデータ構造です。初期化され、グラフを通過するときに操作され、学習プロセスを通じて更新されます。3つのテンソルを_placeholders_として定義します。これは、後で値をフィードするテンソルです。以下をファイルに追加します。tf.placeholder(tf.float32)宣言時に指定する必要がある唯一のパラメーターは、フィードするデータのサイズです。」の形状を使用します。」は任意の量を表し、定義されていない数の784ピクセル画像をフィードします。これは、10の可能なクラスで、未定義のラベル出力に使用するためです。`に設定されている場合)。したがって、これらの場合、空のプレースホルダーではなく初期値を設定する必要があります。これらの値は、ユニットの接続の強さを表すニューロンの活性化関数で使用されるため、基本的にネットワークが学習を行う場所です。値はトレーニング中に最適化されるため、今のところはゼロに設定できます。実際には初期値はモデルの最終的な精度に大きな影響を与えます。切り捨てられた正規分布のランダムな値を重みに使用します。それらをゼロに近づけて、正または負の方向に調整でき、わずかに異なるようにして、異なるエラーを生成します。これにより、モデルが有用なものを学習することが保証されます。以下の行を追加してください。stddev=0.1)),}バイアスについては、小さな定数値を使用して、テンソルが初期段階でアクティブになり、伝播に寄与することを保証します。重みとバイアステンソルは、アクセスしやすいように辞書オブジェクトに保存されます。このコードをファイルに追加して、バイアスを定義します。shape=[n_output]))}次に、テンソルを操作する操作を定義して、ネットワークのレイヤーをセットアップします。これらの行をファイルに追加します。biases['out']各非表示レイヤーは、前のレイヤーの出力と現在のレイヤーの重みで行列乗算を実行し、これらの値にバイアスを追加します。+`値0.5を使用してドロップアウト操作を適用します。グラフ作成の最後のステップは、最適化する損失関数を定義することです。TensorFlowプログラムで一般的に選択される損失関数は、_log-loss_としても知られる_cross-entropy_です。これは、2つの確率分布(予測とラベル)の差を定量化します。完全な分類では、クロスエントロピーが0になり、損失が完全に最小化されます。損失関数を最小化するために使用される最適化アルゴリズムを選択する必要があります。Optimization_という名前のプロセスは、負の(下降)方向の勾配に沿って反復ステップを実行することにより、関数の(局所的な)最小値を見つける一般的な方法です。optimizer]を使用します。これは、勾配の指数関数的に加重平均を計算し、それを調整に使用することにより、運動量を使用してプロセスを高速化することにより、勾配降下の最適化を拡張します。ファイルに次のコードを追加します。tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)ネットワークを定義し、TensorFlowで構築しました。次のステップでは、グラフを介してデータをフィードしてトレーニングし、実際に何かを学んだことをテストします。ステップ5-トレーニングとテストトレーニングプロセスには、グラフを通してトレーニングデータセットを供給し、損失関数を最適化することが含まれます。ネットワークがさらに多くのトレーニングイメージを繰り返し処理するたびに、パラメータを更新して損失を減らし、表示される数字をより正確に予測します。テストプロセスでは、トレーニング済みのグラフを介してテストデータセットを実行し、正確に予測される画像の数を追跡して、精度を計算できるようにします。トレーニングプロセスを開始する前に、精度を評価する方法を定義して、トレーニング中にデータのミニバッチに印刷できるようにします。これらの印刷されたステートメントにより、最初の反復から最後の反復まで、損失が減少し、精度が向上することを確認できます。一貫性のある最適な結果に到達するのに十分な反復を実行したかどうかを追跡できます。+`これをhttps://www.digitalocean.com/community/tutorials/understanding-data-types-in-python-3#booleans[Booleans]のリストとして返す関数。次に、このリストを浮動小数点数にキャストし、平均を計算して合計精度スコアを取得できます。これで、グラフを実行するためのセッションを初期化する準備が整いました。このセッションでは、トレーニングサンプルをネットワークにフィードし、トレーニング後、同じグラフに新しいテストサンプルをフィードして、モデルの精度を決定します。次のコード行をファイルに追加します。tf.Session()sess.run(init)ディープラーニングのトレーニングプロセスの本質は、損失関数を最適化することです。ここでは、画像の予測ラベルと画像の真のラベルとの差を最小限に抑えることを目指しています。このプロセスには、設定された反復回数だけ繰り返される4つのステップが含まれます。ネットワークを介して値を転送する損失を計算するネットワークを通じて後方に値を伝播するパラメーターを更新する各トレーニングステップで、次のステップの損失を減らすために、パラメータがわずかに調整されます。学習が進むにつれて、損失が減少するはずです。最終的に、トレーニングを停止し、新しいデータをテストするためのモデルとしてネットワークを使用できます。このコードをファイルに追加します。)ネットワークを介して画像のミニバッチをフィードする各トレーニングステップを100回繰り返した後、そのバッチの損失と精度を出力します。値はモデル全体ではなくバッチごとであるため、ここでは損失の減少と精度の向上を期待しないでください。個別にフィードするのではなく、画像のミニバッチを使用して、トレーニングプロセスを高速化し、ネットワークがパラメーターを更新する前にさまざまな例を確認できるようにします。トレーニングが完了したら、テストイメージでセッションを実行できます。」ドロップアウトレート「+1.0」を使用しています。このコードをファイルに追加します。test_accuracy)プログラムを実行し、ニューラルネットワークがこれらの手書き数字をどれだけ正確に認識できるかを確認します。+`ファイルを保存し、ターミナルで次のコマンドを実行してスクリプトを実行します。main.py次のような出力が表示されますが、個々の損失と精度の結果はわずかに異なる場合があります。0.9206モデルの精度を向上させるため、またはハイパーパラメーターの調整の影響についてさらに学習するために、学習率、ドロップアウトしきい値、バッチサイズ、および反復回数の変更の効果をテストできます。隠れ層のユニット数を変更し、隠れ層自体の量を変更して、異なるアーキテクチャがモデルの精度をどのように増減させるかを確認できます。ネットワークが実際に手描きの画像を認識していることを示すために、独自の単一の画像でテストしてみましょう。ローカルマシンを使用していて、独自の手書き番号を使用したい場合は、グラフィックエディタを使用して、28×28ピクセルの数字の独自の画像を作成できます。+`を使用して、次のサンプルテストイメージをサーバーまたはコンピューターにダウンロードできます。+`ファイルを開き、ファイルの先頭に次のコード行を追加して、画像操作に必要な2つのライブラリをインポートします。Image...次に、ファイルの最後に、次のコード行を追加して、手書き数字のテストイメージを読み込みます。+`関数は、テスト画像を3つのRGBカラーチャンネルとアルファ透明度を含む4D配列としてロードします。これは、TensorFlowを使用してデータセットを読み込むときに以前に使用した表現とは異なるため、形式に合わせて追加の作業を行う必要があります。`を使用して反転します。現在のマトリックスは黒を0として、白を255として表していますが、反対に必要です。+`を呼び出して配列をフラット化します。画像データが正しく構造化されたので、以前と同じ方法でセッションを実行できますが、今回はテスト用に単一の画像のみをフィードします。次のコードをファイルに追加して、イメージをテストし、出力されたラベルを印刷します。[2]から2)に移動します。結果の出力は、ネットワークがこの画像を数字2として認識したことを示しています。2より複雑な画像(たとえば、他の数字のように見える数字、または不十分にまたは誤って描かれた数字)を使用してネットワークをテストして、運命を確認できます。結論このチュートリアルでは、MNISTデータセットを約92%の精度で分類するためにニューラルネットワークを正常にトレーニングし、独自の画像でテストしました。現在の最先端の研究では、畳み込み層を含むより複雑なネットワークアーキテクチャを使用して、この同じ問題について約99%を達成しています。これらは、すべてのピクセルを784単位の1つのベクトルにフラット化する方法とは異なり、画像の2D構造を使用してコンテンツをより適切に表現します。[TensorFlowウェブサイト]をご覧ください。StreetViewなどの他の一般的なデータセットでテストしたりできます。家番号]、またはより一般的な画像認識用のhttp://www.cs.utoronto.ca/%7Ekriz/cifar.html[CIFAR-10]データセット。