私はGoogleTensorboardに取り組んでいますが、ヒストグラムプロットの意味について混乱しています。チュートリアルを読みましたが、よくわかりません。 Tensorboard HistogramPlotの各軸の意味を誰かが理解するのを手伝ってくれたら本当にありがたいです。
TensorBoardでヒストグラムプロットを解釈する方法についての情報も求めているときに、私は以前にこの質問に出くわしました。私にとって、答えは既知の分布をプロットする実験から来ました。したがって、平均= 0およびシグマ= 1の従来の正規分布は、次のコードを使用してTensorFlowで生成できます。
import tensorflow as tf
cwd = "test_logs"
W1 = tf.Variable(tf.random_normal([200, 10], stddev=1.0))
W2 = tf.Variable(tf.random_normal([200, 10], stddev=0.13))
w1_hist = tf.summary.histogram("weights-stdev_1.0", W1)
w2_hist = tf.summary.histogram("weights-stdev_0.13", W2)
summary_op = tf.summary.merge_all()
init = tf.initialize_all_variables()
sess = tf.Session()
writer = tf.summary.FileWriter(cwd, session.graph)
sess.run(init)
for i in range(2):
writer.add_summary(sess.run(summary_op),i)
writer.flush()
writer.close()
sess.close()
結果は次のようになります。 1.0標準偏差の正規分布のヒストグラム 。横軸は時間ステップを表します。プロットは等高線プロットであり、縦軸の値が-1.5、-1.0、-0.5、0.0、0.5、1.0、および1.5の等高線があります。
プロットは平均= 0およびシグマ= 1の正規分布を表すため(シグマは標準偏差を意味することに注意してください)、0の等高線はサンプルの平均値を表します。
-0.5と+0.5の等高線の間の領域は、平均から+/- 0.5標準偏差内でキャプチャされた正規分布曲線の下の領域を表しており、サンプリングの38.3%であることを示しています。
-1.0と+1.0の等高線の間の領域は、平均から+/- 1.0標準偏差内でキャプチャされた正規分布曲線の下の領域を表しており、サンプリングの68.3%であることを示しています。
-1.5と+ 1-.5の等高線の間の領域は、平均から+/- 1.5標準偏差内でキャプチャされた正規分布曲線の下の領域を表しており、サンプリングの86.6%であることを示しています。
最も薄い領域は、平均から+/- 4.0標準偏差を少し超えて広がり、1,000,000サンプルあたり約60のみがこの範囲外になります。
ウィキペディアには非常に徹底的な説明がありますが、最も関連性の高いナゲットを入手できます ここ 。
実際のヒストグラムプロットには、いくつかのことが示されます。プロット領域は、監視値の変動が増減するにつれて、垂直方向の幅が拡大および縮小します。監視値の平均が増加または減少すると、プロットが上下にシフトすることもあります。
(コードが実際に0.13の標準偏差で2番目のヒストグラムを生成することに気付いたかもしれません。これは、プロットの等高線と縦軸の目盛りの間の混乱を解消するために行いました。)
@marc_alain、あなたは結核のためのそのような単純なスクリプトを作るためのスターです、それは見つけるのが難しいです。
彼が言ったことに加えて、重みの分布の1,2,3シグマを示すヒストグラム。これは、68パーセンタイル、95パーセンタイル、および98パーセンタイルに相当します。したがって、モデルに784の重みがある場合、ヒストグラムはそれらの重みの値がトレーニングによってどのように変化するかを示しています。
これらのヒストグラムは、浅いモデルではおそらくそれほど興味深いものではありません。深いネットワークでは、ロジスティック関数が飽和しているため、高層の重みが大きくなるまでに時間がかかる場合があることを想像できます。もちろん、私は無意識のうちにオウムをしているだけです GlorotとBengioによるこの論文 ここでは、トレーニングを通じて重みの分布を研究し、ロジスティック関数がかなり長い間上位層でどのように飽和しているかを示しています。
ルーファン、
ヒストグラムプロットを使用すると、グラフから変数をプロットできます。
w1 = tf.Variable(tf.zeros([1]),name="a",trainable=True)
tf.histogram_summary("firstLayerWeight",w1)
上記の例では、縦軸にw1変数の単位が含まれます。横軸には、ここでキャプチャされていると思うステップの単位があります。
summary_str = sess.run(summary_op, feed_dict=feed_dict)
summary_writer.add_summary(summary_str, **step**)
テンソルボードの summaries の作成方法についてこれを確認すると便利な場合があります。
ドン
グラフの各線は、データ全体の分布のパーセンタイルを表します。たとえば、下の線は時間の経過とともに最小値がどのように変化したかを示し、中央の線は中央値がどのように変化したかを示します。上から下に読むと、行の意味は次のとおりです。[maximum, 93%, 84%, 69%, 50%, 31%, 16%, 7%, minimum]
これらのパーセンタイルは、正規分布の標準偏差境界と見なすこともできます。[maximum, μ+1.5σ, μ+σ, μ+0.5σ, μ, μ-0.5σ, μ-σ, μ-1.5σ, minimum]
内側から外側に向かって読み取られる色付きの領域の幅は、[σ, 2σ, 3σ]
それぞれ。
ヒストグラムをプロットするときは、x軸にビン制限を設定し、y軸にカウントを設定します。ただし、ヒストグラムの要点は、テンソルが時間の経過とともにどのように変化するかを示すことです。したがって、すでにお察しのとおり、100と300の数値を含む深度軸(z軸)はEpoch番号。
デフォルトのヒストグラムモードはオフセットモードです。ここで、各エポックのヒストグラムは、z軸で特定の値だけオフセットされています(グラフ内のすべてのエポックに合わせるため)。これは、部屋の天井の1つのコーナーから(正確には正面の天井のエッジの中点から)、すべてのヒストグラムが次々に配置されるのを見るようなものです。
オーバーレイモードでは、z軸が折りたたまれ、ヒストグラムが透明になるため、移動してカーソルを合わせると、特定のエポックに対応するものを強調表示できます。これは、オフセットモードの正面図に似ており、ヒストグラムの輪郭のみが表示されます。
ドキュメントで説明されているように ここ :
tf.summary.histogram 任意のサイズと形状のテンソルを取得し、幅とカウントを持つ多数のビンで構成されるヒストグラムデータ構造に圧縮します。たとえば、番号
[0.5, 1.1, 1.3, 2.2, 2.9, 2.99]
をビンに整理したいとします。 3つのビンを作成できます。
- 0から1までのすべてを含むビン(1つの要素
0.5
を含む)、- 1〜2のすべてを含むビン(
1.1
と1.3
の2つの要素が含まれます)、- 2〜3のすべてを含むビン(
2.2
、2.9
、および2.99
の3つの要素が含まれます)。
TensorFlowは同様のアプローチを使用してビンを作成しますが、この例とは異なり、整数のビンを作成しません。大規模でまばらなデータセットの場合、数千のビンが生成される可能性があります。代わりに、 ビンは指数分布であり、多くのビンは0に近く、非常に大きな数のビンは比較的少ない 。ただし、指数分布のビンを視覚化するのは難しいです。高さを使用してカウントをエンコードする場合、要素の数が同じであっても、ビンの幅が広いほどスペースが大きくなります。逆に、エリア内のエンコード数により、高さの比較が不可能になります。代わりに、ヒストグラム データをリサンプリング 均一なビンに入れます。これにより、場合によっては不幸なアーティファクトが発生する可能性があります。
ヒストグラムタブに表示されるプロットの完全な知識を取得するには、ドキュメントをさらにお読みください。