TensorFlowKitを使用したニューラルネットワーク学習プロセスの視覚化

ヒント
この記事を読む前に、TensorFlowKitに関する以前の記事を読み、スターリポジトリを配置することをお勧めします



私は記事を読むのが好きではありません。すぐにGitHubに行きます
GitHub:TensorFlowKit

Github:例

GitHub:その他

TensorFlowKit API

リポジトリにアクセスした後、「スター」に追加すると、このトピックに関する記事をさらに書くことができます。



画像






機械学習の分野で働き始めてから、オブジェクトとその動作をベクトルと空間に切り替えるのは困難でした。 最初は、これはすべて頭に収まるのに十分なほど困難であり、すべてのプロセスとは程遠い透明で理解しやすいように見えました。 このため、開発中に起こっていたすべてを視覚化しようとしました。3Dモデル、グラフ、チャート、画像などを作成しました。



機械学習システムの効果的な開発については、学習速度の制御、学習プロセスの分析、さまざまな学習メトリックの収集などの問題が常に発生します。 特に難しいのは、私たち(人)が2次元および3次元空間の操作に慣れているという事実にあり、周囲のさまざまなプロセスを記述しています。 ニューラルネットワーク内のプロセスは多次元空間で発生するため、理解が著しく複雑になります。 これを実現するために、世界中のエンジニアは、多次元データをよりシンプルでわかりやすい形式に視覚化または変換するためのさまざまなアプローチを開発しようとしています。



このような問題を解決するコミュニティ全体があります。たとえば、 DistillWelch Labs3Blue1Brownです。



テンソルボード



TensorFlowの使用を開始する前から、TensorBoardパッケージの使用を開始していました。 これは、あらゆる種類のデータを視覚化するための非常に便利なクロスプラットフォームソリューションであることが判明しました。 TensorBoard形式でレポートを作成し、それをニューラルネットワークに統合するには、迅速なアプリケーションを「教える」のに数日かかりました



TensorBoardの開発は、Googleの研究所の1つとして2015年半ばに始まりました。 2015年の終わりに、Googleはソースコードを公開し、プロジェクトの作業が公開されました。

TensorBoardの現在のバージョンは、TensorFlowを支援するために作成されたpythonパッケージです。これにより、いくつかのタイプのデータを視覚化できます。





さらに、 プロジェクター(プロジェクター)プラグインを使用してTensorBoardを拡張する機能もありますが、この記事ではこれについて話す時間はありません。



仕事には、コンピューター(UbuntuまたはMac)にTensorBoardが必要です。 python3をインストールする必要があります。 TensorBoardをPythonのTensorFlowパッケージの一部としてインストールすることをお勧めします。



Linux: $ sudo apt-get install python3-pip python3-dev $ pip3 install tensorflow MacOS: $ brew install python3 $ pip3 install tensorflow
      
      





レポートを保存するフォルダーを指定して、TensorBoardを起動します。



 $ tensorboard --logdir=/tmp/example/
      
      





http://localhost:6006/









TensorFlowKit



GitHubの例

「開始」リポジトリを忘れずに置いてください。



例で直接いくつかのケースを検討してください。 TensorBoard形式のレポート(概要)の作成は、計算グラフの作成時に行われます。 TensorFlowKitでは、Pythonのアプローチとインターフェイスをできる限り繰り返して、将来一般的なドキュメントを使用できるようにしました。



上記で述べたように、私たちは各レポートをまとめて収集します。 これは、値配列が格納されるコンテナであり、それぞれが視覚化するイベントを表します。



要約は、後でTensorBoardが読み取るファイルシステム上のファイルに保存されます。



画像



したがって、視覚化するグラフを指定してFileWriterを作成し、値を追加するサマリーを作成する必要があります。



 let summary = Summary(scope: scope) let fileWriter = try FileWriter(folder: writerURL, identifier: "iMac", graph: graph)
      
      





アプリケーションを起動してページを更新すると、コードで作成したグラフがすでに表示されています。 それはあなたがそれを通してナビゲートできるようにインタラクティブです。



画像



次に、損失関数またはコスト関数の値やニューラルネットワークの精度など、特定のスカラー量の時間変化を確認する必要があります。 これを行うには、操作の出力をサマリーに追加します。



 try summary.scalar(output: accuracy, key: "scalar-accuracy") try summary.scalar(output: cross_entropy, key: "scalar-loss")
      
      





したがって、セッションを計算する各ステップの後、TensorFlowは操作の値を自動的に減算し、結果の概要の入力に渡します。これをFileWriterに保存します(これを行う方法については後述します)。



画像



また、ニューラルネットワークにはより多くの重みとバイアスがあります。 原則として、これらは十分に大きな次元のさまざまな行列であり、印刷時にそれらの値を分析することは非常に困難です 分布をプロットすると良いでしょう。 また、トレーニングの各ステップ後にネットワークが行う重みの変化の大きさに関する情報も概要に追加します。



 try summary.histogram(output: bias.output, key: "bias") try summary.histogram(output: weights.output, key: "weights") try summary.histogram(output: gradientsOutputs[0], key: "GradientDescentW") try summary.histogram(output: gradientsOutputs[1], key: "GradientDescentB")
      
      





これで、ウェイトがどのように変化し、トレーニング中にどのような変化があったかを視覚化できます。



画像



画像



しかし、それだけではありません。 ニューラルネットワークのデバイスを実際に見てみましょう。

入り口で受け取った手書きテキストの各写真は、それぞれのスケールに反映されます。 つまり、入力に送信された画像は特定のニューロンを活性化することができ、それによりネットワーク内に特定のインプリントを持ちます。 10個のうち各ニューロンの784個の重みがあることを思い出させてください。したがって、7840個の重みがあります。 それらはすべて784x10マトリックスの形式で表示されます。 マトリックス全体をベクトルに拡張し、その後、個々のクラスに適用される重みを「引き出し」てみましょう。



 let flattenConst = try scope.addConst(values: [Int64(7840)], dimensions: [1], as: "flattenShapeConst") let imagesFlattenTensor = try scope.reshape(operationName: "FlattenReshape", tensor: weights.variable, shape: flattenConst.defaultOutput, tshape: Int64.self) try extractImage(from: imagesFlattenTensor, scope: scope, summary: summary, atIndex: 0) try extractImage(from: imagesFlattenTensor, scope: scope, summary: summary, atIndex: 1) … try extractImage(from: imagesFlattenTensor, scope: scope, summary: summary, atIndex: 8) try extractImage(from: imagesFlattenTensor, scope: scope, summary: summary, atIndex: 9)
      
      





これを行うには、さらに数個のstridedSliceを追加し、グラフに形状を変更します。 次に、結果の各ベクトルを図に要約として追加します。



 try summary.images(name: "Image-\(String(index))", output: imagesTensor, maxImages: 255, badColor: Summary.BadColor.default)
      
      





TensorBoardの画像セクションに、トレーニングプロセス中のスケールの「指紋」が表示されます。



画像



要約を処理するだけです。 これを行うには、作成されたすべての概要を1つにまとめ、トレーニングネットワークで処理する必要があります。



 let _ = try summary.merged(identifier: "simple")
      
      





私たちのネットワークの時:



 let resultOutput = try session.run(inputs: [x, y], values: [xTensorInput, yTensorInput], outputs: [loss, applyGradW, applyGradB, mergedSummary, accuracy], targetOperations: []) let summary = resultOutput[3] try fileWriter?.addSummary(tensor: summary, step: Int64(index))
      
      





この例では、精度の計算の問題は考慮せず、トレーニングデータに基づいて計算されることに注意してください。 トレーニング用のデータで計算するのは正しくありません。



画像



画像



次の記事では、1つのニューラルネットワークを組み立て、Ubuntu、MacOS、iOSで1つのリポジトリから実行する方法を説明します。



All Articles